blob: 6a3c516eda2697dfbf19b04a12a99a774f62bbe5 [file] [log] [blame]
Jim Van Verth8026ccc2018-10-04 13:10:39 -04001/*
2 * Copyright 2018 Google Inc.
3 *
4 * Use of this source code is governed by a BSD-style license that can be
5 * found in the LICENSE file.
6 */
7
8#ifndef SkImage_GpuBase_DEFINED
9#define SkImage_GpuBase_DEFINED
10
Mike Kleinc0bd9f92019-04-23 12:05:21 -050011#include "include/core/SkDeferredDisplayListRecorder.h"
12#include "include/core/SkYUVAIndex.h"
13#include "include/gpu/GrBackendSurface.h"
14#include "include/gpu/GrContext.h"
15#include "include/private/GrTypesPriv.h"
16#include "src/image/SkImage_Base.h"
Jim Van Verth8026ccc2018-10-04 13:10:39 -040017
Brian Osmane9560492019-02-05 17:00:03 -050018class GrColorSpaceXform;
Jim Van Verth8026ccc2018-10-04 13:10:39 -040019class SkColorSpace;
20
21class SkImage_GpuBase : public SkImage_Base {
22public:
Brian Salomon5ad6fd32019-03-21 15:30:08 -040023 SkImage_GpuBase(sk_sp<GrContext>, int width, int height, uint32_t uniqueID, SkColorType,
24 SkAlphaType, sk_sp<SkColorSpace>);
Jim Van Verth8026ccc2018-10-04 13:10:39 -040025 ~SkImage_GpuBase() override;
26
27 GrContext* context() const final { return fContext.get(); }
28
Brian Osmane50cdf02018-10-19 13:02:14 -040029 bool getROPixels(SkBitmap*, CachingHint) const final;
Robert Phillips6603a172019-03-05 12:35:44 -050030 sk_sp<SkImage> onMakeSubset(GrRecordingContext*, const SkIRect& subset) const final;
Jim Van Verth8026ccc2018-10-04 13:10:39 -040031
Jim Van Verth8bbce0e2018-10-08 14:34:52 -040032 bool onReadPixels(const SkImageInfo& dstInfo, void* dstPixels, size_t dstRB,
33 int srcX, int srcY, CachingHint) const override;
34
Robert Phillips6603a172019-03-05 12:35:44 -050035 sk_sp<GrTextureProxy> asTextureProxyRef(GrRecordingContext* context) const override {
Jim Van Verth8026ccc2018-10-04 13:10:39 -040036 // we shouldn't end up calling this
37 SkASSERT(false);
Robert Phillips6603a172019-03-05 12:35:44 -050038 return this->INHERITED::asTextureProxyRef(context);
Jim Van Verth8026ccc2018-10-04 13:10:39 -040039 }
Robert Phillips9338c602019-02-19 12:52:29 -050040 sk_sp<GrTextureProxy> asTextureProxyRef(GrRecordingContext*, const GrSamplerState&,
Jim Van Verth8026ccc2018-10-04 13:10:39 -040041 SkScalar scaleAdjust[2]) const final;
42
Robert Phillips6603a172019-03-05 12:35:44 -050043 sk_sp<GrTextureProxy> refPinnedTextureProxy(GrRecordingContext* context,
44 uint32_t* uniqueID) const final {
Jim Van Verth8026ccc2018-10-04 13:10:39 -040045 *uniqueID = this->uniqueID();
Robert Phillips6603a172019-03-05 12:35:44 -050046 return this->asTextureProxyRef(context);
Jim Van Verth8026ccc2018-10-04 13:10:39 -040047 }
48
49 GrBackendTexture onGetBackendTexture(bool flushPendingGrContextIO,
50 GrSurfaceOrigin* origin) const final;
51
52 GrTexture* onGetTexture() const final;
53
Jim Van Verth8026ccc2018-10-04 13:10:39 -040054 bool onIsValid(GrContext*) const final;
55
Jim Van Verth21bd60d2018-10-12 15:00:20 -040056#if GR_TEST_UTILS
Robert Phillipsfd0d9702019-02-01 10:19:42 -050057 void resetContext(sk_sp<GrContext> newContext);
Jim Van Verth21bd60d2018-10-12 15:00:20 -040058#endif
59
Jim Van Verth8026ccc2018-10-04 13:10:39 -040060 static bool ValidateBackendTexture(GrContext* ctx, const GrBackendTexture& tex,
Robert Phillipsc80b0e92019-07-23 10:27:09 -040061 GrPixelConfig* config, GrColorType grCT,
62 SkColorType ct, SkAlphaType at,
Jim Van Verth8026ccc2018-10-04 13:10:39 -040063 sk_sp<SkColorSpace> cs);
Jim Van Verth0e671942018-11-09 12:03:57 -050064 static bool MakeTempTextureProxies(GrContext* ctx, const GrBackendTexture yuvaTextures[],
Jim Van Verth53275362018-11-09 15:42:35 -050065 int numTextures, const SkYUVAIndex [4],
66 GrSurfaceOrigin imageOrigin,
Jim Van Verth0e671942018-11-09 12:03:57 -050067 sk_sp<GrTextureProxy> tempTextureProxies[4]);
Jim Van Verth8bbce0e2018-10-08 14:34:52 -040068
Jim Van Verth53275362018-11-09 15:42:35 -050069 static SkAlphaType GetAlphaTypeFromYUVAIndices(const SkYUVAIndex yuvaIndices[4]) {
70 return -1 != yuvaIndices[SkYUVAIndex::kA_Index].fIndex ? kPremul_SkAlphaType
71 : kOpaque_SkAlphaType;
72 }
73
Brian Salomoncdd8a0a2019-01-10 12:09:52 -050074 using PromiseImageTextureContext = SkDeferredDisplayListRecorder::PromiseImageTextureContext;
75 using PromiseImageTextureFulfillProc =
76 SkDeferredDisplayListRecorder::PromiseImageTextureFulfillProc;
77 using PromiseImageTextureReleaseProc =
78 SkDeferredDisplayListRecorder::PromiseImageTextureReleaseProc;
79 using PromiseImageTextureDoneProc = SkDeferredDisplayListRecorder::PromiseImageTextureDoneProc;
Jim Van Verth8bbce0e2018-10-08 14:34:52 -040080
Jim Van Verth8026ccc2018-10-04 13:10:39 -040081protected:
Brian Salomon0cc57542019-03-08 13:28:46 -050082 using PromiseImageApiVersion = SkDeferredDisplayListRecorder::PromiseImageApiVersion;
Brian Salomonbe5a0932018-12-10 10:03:26 -050083 // Helper for making a lazy proxy for a promise image. The PromiseDoneProc we be called,
84 // if not null, immediately if this function fails. Othwerwise, it is installed in the
85 // proxy along with the TextureFulfillProc and TextureReleaseProc. PromiseDoneProc must not
86 // be null.
87 static sk_sp<GrTextureProxy> MakePromiseImageLazyProxy(
Robert Phillipsc80b0e92019-07-23 10:27:09 -040088 GrContext*, int width, int height, GrSurfaceOrigin, GrColorType, GrBackendFormat,
Brian Salomoncdd8a0a2019-01-10 12:09:52 -050089 GrMipMapped, PromiseImageTextureFulfillProc, PromiseImageTextureReleaseProc,
Brian Salomon0cc57542019-03-08 13:28:46 -050090 PromiseImageTextureDoneProc, PromiseImageTextureContext, PromiseImageApiVersion);
Brian Salomonbe5a0932018-12-10 10:03:26 -050091
Jim Van Verth0e671942018-11-09 12:03:57 -050092 static bool RenderYUVAToRGBA(GrContext* ctx, GrRenderTargetContext* renderTargetContext,
93 const SkRect& rect, SkYUVColorSpace yuvColorSpace,
Brian Osmane9560492019-02-05 17:00:03 -050094 sk_sp<GrColorSpaceXform> colorSpaceXform,
Jim Van Verth0e671942018-11-09 12:03:57 -050095 const sk_sp<GrTextureProxy> proxies[4],
96 const SkYUVAIndex yuvaIndices[4]);
97
Brian Salomon5ad6fd32019-03-21 15:30:08 -040098 sk_sp<GrContext> fContext;
Jim Van Verth8026ccc2018-10-04 13:10:39 -040099
100private:
101 typedef SkImage_Base INHERITED;
102};
103
Jim Van Verth8026ccc2018-10-04 13:10:39 -0400104#endif