1*c8dee2aaSAndroid Build Coastguard Worker /* 2*c8dee2aaSAndroid Build Coastguard Worker * Copyright 2012 Google Inc. 3*c8dee2aaSAndroid Build Coastguard Worker * 4*c8dee2aaSAndroid Build Coastguard Worker * Use of this source code is governed by a BSD-style license that can be 5*c8dee2aaSAndroid Build Coastguard Worker * found in the LICENSE file. 6*c8dee2aaSAndroid Build Coastguard Worker */ 7*c8dee2aaSAndroid Build Coastguard Worker #ifndef GrSurface_DEFINED 8*c8dee2aaSAndroid Build Coastguard Worker #define GrSurface_DEFINED 9*c8dee2aaSAndroid Build Coastguard Worker 10*c8dee2aaSAndroid Build Coastguard Worker #include "include/core/SkRect.h" 11*c8dee2aaSAndroid Build Coastguard Worker #include "include/core/SkRefCnt.h" 12*c8dee2aaSAndroid Build Coastguard Worker #include "include/core/SkSize.h" 13*c8dee2aaSAndroid Build Coastguard Worker #include "include/gpu/GpuTypes.h" 14*c8dee2aaSAndroid Build Coastguard Worker #include "include/private/base/SkAssert.h" 15*c8dee2aaSAndroid Build Coastguard Worker #include "include/private/gpu/ganesh/GrTypesPriv.h" 16*c8dee2aaSAndroid Build Coastguard Worker #include "src/gpu/RefCntedCallback.h" 17*c8dee2aaSAndroid Build Coastguard Worker #include "src/gpu/ganesh/GrGpuResource.h" 18*c8dee2aaSAndroid Build Coastguard Worker #include "src/gpu/ganesh/GrGpuResourceCacheAccess.h" 19*c8dee2aaSAndroid Build Coastguard Worker #include "src/gpu/ganesh/GrGpuResourcePriv.h" 20*c8dee2aaSAndroid Build Coastguard Worker 21*c8dee2aaSAndroid Build Coastguard Worker #include <cstddef> 22*c8dee2aaSAndroid Build Coastguard Worker #include <string_view> 23*c8dee2aaSAndroid Build Coastguard Worker 24*c8dee2aaSAndroid Build Coastguard Worker class GrBackendFormat; 25*c8dee2aaSAndroid Build Coastguard Worker class GrDirectContext; 26*c8dee2aaSAndroid Build Coastguard Worker class GrGpu; 27*c8dee2aaSAndroid Build Coastguard Worker class GrRenderTarget; 28*c8dee2aaSAndroid Build Coastguard Worker class GrTexture; 29*c8dee2aaSAndroid Build Coastguard Worker 30*c8dee2aaSAndroid Build Coastguard Worker class GrSurface : public GrGpuResource { 31*c8dee2aaSAndroid Build Coastguard Worker public: 32*c8dee2aaSAndroid Build Coastguard Worker /** 33*c8dee2aaSAndroid Build Coastguard Worker * Retrieves the dimensions of the surface. 34*c8dee2aaSAndroid Build Coastguard Worker */ dimensions()35*c8dee2aaSAndroid Build Coastguard Worker SkISize dimensions() const { return fDimensions; } 36*c8dee2aaSAndroid Build Coastguard Worker 37*c8dee2aaSAndroid Build Coastguard Worker /** 38*c8dee2aaSAndroid Build Coastguard Worker * Retrieves the width of the surface. 39*c8dee2aaSAndroid Build Coastguard Worker */ width()40*c8dee2aaSAndroid Build Coastguard Worker int width() const { return fDimensions.width(); } 41*c8dee2aaSAndroid Build Coastguard Worker 42*c8dee2aaSAndroid Build Coastguard Worker /** 43*c8dee2aaSAndroid Build Coastguard Worker * Retrieves the height of the surface. 44*c8dee2aaSAndroid Build Coastguard Worker */ height()45*c8dee2aaSAndroid Build Coastguard Worker int height() const { return fDimensions.height(); } 46*c8dee2aaSAndroid Build Coastguard Worker 47*c8dee2aaSAndroid Build Coastguard Worker /** 48*c8dee2aaSAndroid Build Coastguard Worker * Helper that gets the width and height of the surface as a bounding rectangle. 49*c8dee2aaSAndroid Build Coastguard Worker */ getBoundsRect()50*c8dee2aaSAndroid Build Coastguard Worker SkRect getBoundsRect() const { return SkRect::Make(this->dimensions()); } 51*c8dee2aaSAndroid Build Coastguard Worker 52*c8dee2aaSAndroid Build Coastguard Worker virtual GrBackendFormat backendFormat() const = 0; 53*c8dee2aaSAndroid Build Coastguard Worker 54*c8dee2aaSAndroid Build Coastguard Worker void setRelease(sk_sp<skgpu::RefCntedCallback> releaseHelper); 55*c8dee2aaSAndroid Build Coastguard Worker 56*c8dee2aaSAndroid Build Coastguard Worker // These match the definitions in SkImage, from whence they came. 57*c8dee2aaSAndroid Build Coastguard Worker // TODO: Remove Chrome's need to call this on a GrTexture 58*c8dee2aaSAndroid Build Coastguard Worker typedef void* ReleaseCtx; 59*c8dee2aaSAndroid Build Coastguard Worker typedef void (*ReleaseProc)(ReleaseCtx); setRelease(ReleaseProc proc,ReleaseCtx ctx)60*c8dee2aaSAndroid Build Coastguard Worker void setRelease(ReleaseProc proc, ReleaseCtx ctx) { 61*c8dee2aaSAndroid Build Coastguard Worker this->setRelease(skgpu::RefCntedCallback::Make(proc, ctx)); 62*c8dee2aaSAndroid Build Coastguard Worker } 63*c8dee2aaSAndroid Build Coastguard Worker 64*c8dee2aaSAndroid Build Coastguard Worker /** 65*c8dee2aaSAndroid Build Coastguard Worker * @return the texture associated with the surface, may be null. 66*c8dee2aaSAndroid Build Coastguard Worker */ asTexture()67*c8dee2aaSAndroid Build Coastguard Worker virtual GrTexture* asTexture() { return nullptr; } asTexture()68*c8dee2aaSAndroid Build Coastguard Worker virtual const GrTexture* asTexture() const { return nullptr; } 69*c8dee2aaSAndroid Build Coastguard Worker 70*c8dee2aaSAndroid Build Coastguard Worker /** 71*c8dee2aaSAndroid Build Coastguard Worker * @return the render target underlying this surface, may be null. 72*c8dee2aaSAndroid Build Coastguard Worker */ asRenderTarget()73*c8dee2aaSAndroid Build Coastguard Worker virtual GrRenderTarget* asRenderTarget() { return nullptr; } asRenderTarget()74*c8dee2aaSAndroid Build Coastguard Worker virtual const GrRenderTarget* asRenderTarget() const { return nullptr; } 75*c8dee2aaSAndroid Build Coastguard Worker flags()76*c8dee2aaSAndroid Build Coastguard Worker GrInternalSurfaceFlags flags() const { return fSurfaceFlags; } 77*c8dee2aaSAndroid Build Coastguard Worker 78*c8dee2aaSAndroid Build Coastguard Worker static size_t ComputeSize(const GrBackendFormat&, 79*c8dee2aaSAndroid Build Coastguard Worker SkISize dimensions, 80*c8dee2aaSAndroid Build Coastguard Worker int colorSamplesPerPixel, 81*c8dee2aaSAndroid Build Coastguard Worker skgpu::Mipmapped, 82*c8dee2aaSAndroid Build Coastguard Worker bool binSize = false); 83*c8dee2aaSAndroid Build Coastguard Worker 84*c8dee2aaSAndroid Build Coastguard Worker /** 85*c8dee2aaSAndroid Build Coastguard Worker * The pixel values of this surface cannot be modified (e.g. doesn't support write pixels or 86*c8dee2aaSAndroid Build Coastguard Worker * MIP map level regen). 87*c8dee2aaSAndroid Build Coastguard Worker */ readOnly()88*c8dee2aaSAndroid Build Coastguard Worker bool readOnly() const { return fSurfaceFlags & GrInternalSurfaceFlags::kReadOnly; } 89*c8dee2aaSAndroid Build Coastguard Worker framebufferOnly()90*c8dee2aaSAndroid Build Coastguard Worker bool framebufferOnly() const { 91*c8dee2aaSAndroid Build Coastguard Worker return fSurfaceFlags & GrInternalSurfaceFlags::kFramebufferOnly; 92*c8dee2aaSAndroid Build Coastguard Worker } 93*c8dee2aaSAndroid Build Coastguard Worker 94*c8dee2aaSAndroid Build Coastguard Worker // Returns true if we are working with protected content. isProtected()95*c8dee2aaSAndroid Build Coastguard Worker bool isProtected() const { return fIsProtected == skgpu::Protected::kYes; } 96*c8dee2aaSAndroid Build Coastguard Worker setFramebufferOnly()97*c8dee2aaSAndroid Build Coastguard Worker void setFramebufferOnly() { 98*c8dee2aaSAndroid Build Coastguard Worker SkASSERT(this->asRenderTarget()); 99*c8dee2aaSAndroid Build Coastguard Worker fSurfaceFlags |= GrInternalSurfaceFlags::kFramebufferOnly; 100*c8dee2aaSAndroid Build Coastguard Worker } 101*c8dee2aaSAndroid Build Coastguard Worker 102*c8dee2aaSAndroid Build Coastguard Worker class RefCntedReleaseProc : public SkNVRefCnt<RefCntedReleaseProc> { 103*c8dee2aaSAndroid Build Coastguard Worker public: 104*c8dee2aaSAndroid Build Coastguard Worker RefCntedReleaseProc(sk_sp<skgpu::RefCntedCallback> callback, 105*c8dee2aaSAndroid Build Coastguard Worker sk_sp<GrDirectContext> directContext); 106*c8dee2aaSAndroid Build Coastguard Worker 107*c8dee2aaSAndroid Build Coastguard Worker ~RefCntedReleaseProc(); 108*c8dee2aaSAndroid Build Coastguard Worker 109*c8dee2aaSAndroid Build Coastguard Worker private: 110*c8dee2aaSAndroid Build Coastguard Worker sk_sp<skgpu::RefCntedCallback> fCallback; 111*c8dee2aaSAndroid Build Coastguard Worker sk_sp<GrDirectContext> fDirectContext; 112*c8dee2aaSAndroid Build Coastguard Worker }; 113*c8dee2aaSAndroid Build Coastguard Worker 114*c8dee2aaSAndroid Build Coastguard Worker #if defined(GPU_TEST_UTILS) asSurface()115*c8dee2aaSAndroid Build Coastguard Worker const GrSurface* asSurface() const override { return this; } 116*c8dee2aaSAndroid Build Coastguard Worker #endif 117*c8dee2aaSAndroid Build Coastguard Worker 118*c8dee2aaSAndroid Build Coastguard Worker protected: setGLRTFBOIDIs0()119*c8dee2aaSAndroid Build Coastguard Worker void setGLRTFBOIDIs0() { 120*c8dee2aaSAndroid Build Coastguard Worker SkASSERT(!this->requiresManualMSAAResolve()); 121*c8dee2aaSAndroid Build Coastguard Worker SkASSERT(!this->asTexture()); 122*c8dee2aaSAndroid Build Coastguard Worker SkASSERT(this->asRenderTarget()); 123*c8dee2aaSAndroid Build Coastguard Worker fSurfaceFlags |= GrInternalSurfaceFlags::kGLRTFBOIDIs0; 124*c8dee2aaSAndroid Build Coastguard Worker } glRTFBOIDis0()125*c8dee2aaSAndroid Build Coastguard Worker bool glRTFBOIDis0() const { 126*c8dee2aaSAndroid Build Coastguard Worker return fSurfaceFlags & GrInternalSurfaceFlags::kGLRTFBOIDIs0; 127*c8dee2aaSAndroid Build Coastguard Worker } 128*c8dee2aaSAndroid Build Coastguard Worker setRequiresManualMSAAResolve()129*c8dee2aaSAndroid Build Coastguard Worker void setRequiresManualMSAAResolve() { 130*c8dee2aaSAndroid Build Coastguard Worker SkASSERT(!this->glRTFBOIDis0()); 131*c8dee2aaSAndroid Build Coastguard Worker SkASSERT(this->asRenderTarget()); 132*c8dee2aaSAndroid Build Coastguard Worker fSurfaceFlags |= GrInternalSurfaceFlags::kRequiresManualMSAAResolve; 133*c8dee2aaSAndroid Build Coastguard Worker } requiresManualMSAAResolve()134*c8dee2aaSAndroid Build Coastguard Worker bool requiresManualMSAAResolve() const { 135*c8dee2aaSAndroid Build Coastguard Worker return fSurfaceFlags & GrInternalSurfaceFlags::kRequiresManualMSAAResolve; 136*c8dee2aaSAndroid Build Coastguard Worker } 137*c8dee2aaSAndroid Build Coastguard Worker setReadOnly()138*c8dee2aaSAndroid Build Coastguard Worker void setReadOnly() { 139*c8dee2aaSAndroid Build Coastguard Worker SkASSERT(!this->asRenderTarget()); 140*c8dee2aaSAndroid Build Coastguard Worker fSurfaceFlags |= GrInternalSurfaceFlags::kReadOnly; 141*c8dee2aaSAndroid Build Coastguard Worker } 142*c8dee2aaSAndroid Build Coastguard Worker setVkRTSupportsInputAttachment()143*c8dee2aaSAndroid Build Coastguard Worker void setVkRTSupportsInputAttachment() { 144*c8dee2aaSAndroid Build Coastguard Worker SkASSERT(this->asRenderTarget()); 145*c8dee2aaSAndroid Build Coastguard Worker fSurfaceFlags |= GrInternalSurfaceFlags::kVkRTSupportsInputAttachment; 146*c8dee2aaSAndroid Build Coastguard Worker } 147*c8dee2aaSAndroid Build Coastguard Worker GrSurface(GrGpu * gpu,const SkISize & dimensions,skgpu::Protected isProtected,std::string_view label)148*c8dee2aaSAndroid Build Coastguard Worker GrSurface(GrGpu* gpu, 149*c8dee2aaSAndroid Build Coastguard Worker const SkISize& dimensions, 150*c8dee2aaSAndroid Build Coastguard Worker skgpu::Protected isProtected, 151*c8dee2aaSAndroid Build Coastguard Worker std::string_view label) 152*c8dee2aaSAndroid Build Coastguard Worker : INHERITED(gpu, label) 153*c8dee2aaSAndroid Build Coastguard Worker , fDimensions(dimensions) 154*c8dee2aaSAndroid Build Coastguard Worker , fSurfaceFlags(GrInternalSurfaceFlags::kNone) 155*c8dee2aaSAndroid Build Coastguard Worker , fIsProtected(isProtected) {} 156*c8dee2aaSAndroid Build Coastguard Worker ~GrSurface()157*c8dee2aaSAndroid Build Coastguard Worker ~GrSurface() override { 158*c8dee2aaSAndroid Build Coastguard Worker // check that invokeReleaseProc has been called (if needed) 159*c8dee2aaSAndroid Build Coastguard Worker SkASSERT(!fReleaseHelper); 160*c8dee2aaSAndroid Build Coastguard Worker } 161*c8dee2aaSAndroid Build Coastguard Worker 162*c8dee2aaSAndroid Build Coastguard Worker void onRelease() override; 163*c8dee2aaSAndroid Build Coastguard Worker void onAbandon() override; 164*c8dee2aaSAndroid Build Coastguard Worker 165*c8dee2aaSAndroid Build Coastguard Worker private: getResourceType()166*c8dee2aaSAndroid Build Coastguard Worker const char* getResourceType() const override { return "Surface"; } 167*c8dee2aaSAndroid Build Coastguard Worker 168*c8dee2aaSAndroid Build Coastguard Worker // Unmanaged backends (e.g. Vulkan) may want to specially handle the release proc in order to 169*c8dee2aaSAndroid Build Coastguard Worker // ensure it isn't called until GPU work related to the resource is completed. 170*c8dee2aaSAndroid Build Coastguard Worker 171*c8dee2aaSAndroid Build Coastguard Worker // NOLINTNEXTLINE(performance-unnecessary-value-param) onSetRelease(sk_sp<RefCntedReleaseProc>)172*c8dee2aaSAndroid Build Coastguard Worker virtual void onSetRelease(sk_sp<RefCntedReleaseProc>) {} 173*c8dee2aaSAndroid Build Coastguard Worker invokeReleaseProc()174*c8dee2aaSAndroid Build Coastguard Worker void invokeReleaseProc() { 175*c8dee2aaSAndroid Build Coastguard Worker // Depending on the ref count of fReleaseHelper this may or may not actually trigger the 176*c8dee2aaSAndroid Build Coastguard Worker // ReleaseProc to be called. 177*c8dee2aaSAndroid Build Coastguard Worker fReleaseHelper.reset(); 178*c8dee2aaSAndroid Build Coastguard Worker } 179*c8dee2aaSAndroid Build Coastguard Worker 180*c8dee2aaSAndroid Build Coastguard Worker SkISize fDimensions; 181*c8dee2aaSAndroid Build Coastguard Worker GrInternalSurfaceFlags fSurfaceFlags; 182*c8dee2aaSAndroid Build Coastguard Worker skgpu::Protected fIsProtected; 183*c8dee2aaSAndroid Build Coastguard Worker sk_sp<RefCntedReleaseProc> fReleaseHelper; 184*c8dee2aaSAndroid Build Coastguard Worker 185*c8dee2aaSAndroid Build Coastguard Worker using INHERITED = GrGpuResource; 186*c8dee2aaSAndroid Build Coastguard Worker }; 187*c8dee2aaSAndroid Build Coastguard Worker 188*c8dee2aaSAndroid Build Coastguard Worker #endif 189