blob: cd7b906845ab8a52a62810b193942cb4aed2d6ac [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
Jim Van Verth8bbce0e2018-10-08 14:34:52 -040011#include "GrBackendSurface.h"
Robert Phillipsa0bc39d2019-01-29 13:14:47 -050012#include "GrContext.h"
Jim Van Verth8bbce0e2018-10-08 14:34:52 -040013#include "GrTypesPriv.h"
Brian Salomoncdd8a0a2019-01-10 12:09:52 -050014#include "SkDeferredDisplayListRecorder.h"
Jim Van Verth8026ccc2018-10-04 13:10:39 -040015#include "SkImage_Base.h"
Jim Van Verth53275362018-11-09 15:42:35 -050016#include "SkYUVAIndex.h"
Jim Van Verth8026ccc2018-10-04 13:10:39 -040017
Jim Van Verth8026ccc2018-10-04 13:10:39 -040018class SkColorSpace;
19
20class SkImage_GpuBase : public SkImage_Base {
21public:
Brian Salomonf05e6d32018-12-20 08:41:41 -050022 SkImage_GpuBase(sk_sp<GrContext>, int width, int height, uint32_t uniqueID, SkAlphaType,
23 sk_sp<SkColorSpace>);
Jim Van Verth8026ccc2018-10-04 13:10:39 -040024 ~SkImage_GpuBase() override;
25
26 GrContext* context() const final { return fContext.get(); }
Robert Phillips27467652019-01-10 16:34:22 -050027 uint32_t contextID() const final { return fContext->uniqueID(); }
Jim Van Verth8026ccc2018-10-04 13:10:39 -040028
Brian Osmane50cdf02018-10-19 13:02:14 -040029 bool getROPixels(SkBitmap*, CachingHint) const final;
Jim Van Verth8026ccc2018-10-04 13:10:39 -040030 sk_sp<SkImage> onMakeSubset(const SkIRect& subset) const final;
31
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
Jim Van Verth8026ccc2018-10-04 13:10:39 -040035 sk_sp<GrTextureProxy> asTextureProxyRef() const override {
36 // we shouldn't end up calling this
37 SkASSERT(false);
38 return this->INHERITED::asTextureProxyRef();
39 }
Brian Osman6064e1c2018-10-19 14:27:54 -040040 sk_sp<GrTextureProxy> asTextureProxyRef(GrContext*, const GrSamplerState&,
Jim Van Verth8026ccc2018-10-04 13:10:39 -040041 SkScalar scaleAdjust[2]) const final;
42
43 sk_sp<GrTextureProxy> refPinnedTextureProxy(uint32_t* uniqueID) const final {
44 *uniqueID = this->uniqueID();
45 return this->asTextureProxyRef();
46 }
47
48 GrBackendTexture onGetBackendTexture(bool flushPendingGrContextIO,
49 GrSurfaceOrigin* origin) const final;
50
51 GrTexture* onGetTexture() const final;
52
Jim Van Verth8026ccc2018-10-04 13:10:39 -040053 bool onIsValid(GrContext*) const final;
54
Jim Van Verth21bd60d2018-10-12 15:00:20 -040055#if GR_TEST_UTILS
56 void resetContext(sk_sp<GrContext> newContext) {
57 SkASSERT(fContext->uniqueID() == newContext->uniqueID());
58 fContext = newContext;
59 }
60#endif
61
Jim Van Verth8026ccc2018-10-04 13:10:39 -040062 static bool ValidateBackendTexture(GrContext* ctx, const GrBackendTexture& tex,
63 GrPixelConfig* config, SkColorType ct, SkAlphaType at,
64 sk_sp<SkColorSpace> cs);
Jim Van Verth0e671942018-11-09 12:03:57 -050065 static bool MakeTempTextureProxies(GrContext* ctx, const GrBackendTexture yuvaTextures[],
Jim Van Verth53275362018-11-09 15:42:35 -050066 int numTextures, const SkYUVAIndex [4],
67 GrSurfaceOrigin imageOrigin,
Jim Van Verth0e671942018-11-09 12:03:57 -050068 sk_sp<GrTextureProxy> tempTextureProxies[4]);
Jim Van Verth8bbce0e2018-10-08 14:34:52 -040069
Jim Van Verth53275362018-11-09 15:42:35 -050070 static SkAlphaType GetAlphaTypeFromYUVAIndices(const SkYUVAIndex yuvaIndices[4]) {
71 return -1 != yuvaIndices[SkYUVAIndex::kA_Index].fIndex ? kPremul_SkAlphaType
72 : kOpaque_SkAlphaType;
73 }
74
Brian Salomoncdd8a0a2019-01-10 12:09:52 -050075 using PromiseImageTextureContext = SkDeferredDisplayListRecorder::PromiseImageTextureContext;
76 using PromiseImageTextureFulfillProc =
77 SkDeferredDisplayListRecorder::PromiseImageTextureFulfillProc;
78 using PromiseImageTextureReleaseProc =
79 SkDeferredDisplayListRecorder::PromiseImageTextureReleaseProc;
80 using PromiseImageTextureDoneProc = SkDeferredDisplayListRecorder::PromiseImageTextureDoneProc;
Jim Van Verth8bbce0e2018-10-08 14:34:52 -040081
Jim Van Verth8026ccc2018-10-04 13:10:39 -040082protected:
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(
88 GrContext*, int width, int height, GrSurfaceOrigin, GrPixelConfig, GrBackendFormat,
Brian Salomoncdd8a0a2019-01-10 12:09:52 -050089 GrMipMapped, PromiseImageTextureFulfillProc, PromiseImageTextureReleaseProc,
90 PromiseImageTextureDoneProc, PromiseImageTextureContext);
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,
94 const sk_sp<GrTextureProxy> proxies[4],
95 const SkYUVAIndex yuvaIndices[4]);
96
Jim Van Verth8026ccc2018-10-04 13:10:39 -040097 sk_sp<GrContext> fContext;
98 const SkAlphaType fAlphaType; // alpha type for final image
Jim Van Verth8026ccc2018-10-04 13:10:39 -040099 sk_sp<SkColorSpace> fColorSpace; // color space for final image
100
101private:
102 typedef SkImage_Base INHERITED;
103};
104
Jim Van Verth8026ccc2018-10-04 13:10:39 -0400105#endif