1*c8dee2aaSAndroid Build Coastguard Worker /* 2*c8dee2aaSAndroid Build Coastguard Worker * Copyright 2023 Google LLC 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 8*c8dee2aaSAndroid Build Coastguard Worker #ifndef GrBackendSurfacePriv_DEFINED 9*c8dee2aaSAndroid Build Coastguard Worker #define GrBackendSurfacePriv_DEFINED 10*c8dee2aaSAndroid Build Coastguard Worker 11*c8dee2aaSAndroid Build Coastguard Worker #include "include/core/SkRefCnt.h" 12*c8dee2aaSAndroid Build Coastguard Worker #include "include/gpu/ganesh/GrBackendSurface.h" 13*c8dee2aaSAndroid Build Coastguard Worker #include "include/gpu/MutableTextureState.h" // IWYU pragma: keep 14*c8dee2aaSAndroid Build Coastguard Worker #include "include/private/base/SkAssert.h" 15*c8dee2aaSAndroid Build Coastguard Worker #include "include/private/base/SkDebug.h" 16*c8dee2aaSAndroid Build Coastguard Worker #include "include/private/gpu/ganesh/GrTypesPriv.h" 17*c8dee2aaSAndroid Build Coastguard Worker 18*c8dee2aaSAndroid Build Coastguard Worker #include <cstddef> 19*c8dee2aaSAndroid Build Coastguard Worker #include <cstdint> 20*c8dee2aaSAndroid Build Coastguard Worker #include <string> 21*c8dee2aaSAndroid Build Coastguard Worker #include <string_view> 22*c8dee2aaSAndroid Build Coastguard Worker 23*c8dee2aaSAndroid Build Coastguard Worker enum class GrBackendApi : unsigned int; 24*c8dee2aaSAndroid Build Coastguard Worker enum class SkTextureCompressionType; 25*c8dee2aaSAndroid Build Coastguard Worker 26*c8dee2aaSAndroid Build Coastguard Worker namespace skgpu { 27*c8dee2aaSAndroid Build Coastguard Worker enum class Mipmapped : bool; 28*c8dee2aaSAndroid Build Coastguard Worker } 29*c8dee2aaSAndroid Build Coastguard Worker 30*c8dee2aaSAndroid Build Coastguard Worker class GrBackendFormatData { 31*c8dee2aaSAndroid Build Coastguard Worker public: 32*c8dee2aaSAndroid Build Coastguard Worker virtual ~GrBackendFormatData(); 33*c8dee2aaSAndroid Build Coastguard Worker virtual SkTextureCompressionType compressionType() const = 0; 34*c8dee2aaSAndroid Build Coastguard Worker virtual size_t bytesPerBlock() const = 0; 35*c8dee2aaSAndroid Build Coastguard Worker virtual int stencilBits() const = 0; 36*c8dee2aaSAndroid Build Coastguard Worker virtual bool equal(const GrBackendFormatData* that) const = 0; 37*c8dee2aaSAndroid Build Coastguard Worker #if defined(SK_DEBUG) 38*c8dee2aaSAndroid Build Coastguard Worker virtual GrBackendApi type() const = 0; 39*c8dee2aaSAndroid Build Coastguard Worker #endif 40*c8dee2aaSAndroid Build Coastguard Worker protected: 41*c8dee2aaSAndroid Build Coastguard Worker GrBackendFormatData() = default; 42*c8dee2aaSAndroid Build Coastguard Worker GrBackendFormatData(const GrBackendFormatData&) = default; 43*c8dee2aaSAndroid Build Coastguard Worker 44*c8dee2aaSAndroid Build Coastguard Worker using AnyFormatData = GrBackendFormat::AnyFormatData; 45*c8dee2aaSAndroid Build Coastguard Worker 46*c8dee2aaSAndroid Build Coastguard Worker private: 47*c8dee2aaSAndroid Build Coastguard Worker friend class GrBackendFormat; 48*c8dee2aaSAndroid Build Coastguard Worker virtual uint32_t channelMask() const = 0; 49*c8dee2aaSAndroid Build Coastguard Worker virtual GrColorFormatDesc desc() const = 0; 50*c8dee2aaSAndroid Build Coastguard Worker virtual std::string toString() const = 0; 51*c8dee2aaSAndroid Build Coastguard Worker virtual void copyTo(AnyFormatData&) const = 0; 52*c8dee2aaSAndroid Build Coastguard Worker 53*c8dee2aaSAndroid Build Coastguard Worker // Vulkan-only API: makeTexture2D()54*c8dee2aaSAndroid Build Coastguard Worker virtual void makeTexture2D() {} 55*c8dee2aaSAndroid Build Coastguard Worker }; 56*c8dee2aaSAndroid Build Coastguard Worker 57*c8dee2aaSAndroid Build Coastguard Worker class GrBackendTextureData { 58*c8dee2aaSAndroid Build Coastguard Worker public: 59*c8dee2aaSAndroid Build Coastguard Worker virtual ~GrBackendTextureData(); 60*c8dee2aaSAndroid Build Coastguard Worker #if defined(SK_DEBUG) 61*c8dee2aaSAndroid Build Coastguard Worker virtual GrBackendApi type() const = 0; 62*c8dee2aaSAndroid Build Coastguard Worker #endif 63*c8dee2aaSAndroid Build Coastguard Worker protected: 64*c8dee2aaSAndroid Build Coastguard Worker GrBackendTextureData() = default; 65*c8dee2aaSAndroid Build Coastguard Worker GrBackendTextureData(const GrBackendTextureData&) = default; 66*c8dee2aaSAndroid Build Coastguard Worker 67*c8dee2aaSAndroid Build Coastguard Worker using AnyTextureData = GrBackendTexture::AnyTextureData; 68*c8dee2aaSAndroid Build Coastguard Worker 69*c8dee2aaSAndroid Build Coastguard Worker private: 70*c8dee2aaSAndroid Build Coastguard Worker friend class GrBackendTexture; 71*c8dee2aaSAndroid Build Coastguard Worker virtual bool isProtected() const = 0; 72*c8dee2aaSAndroid Build Coastguard Worker virtual bool equal(const GrBackendTextureData* that) const = 0; 73*c8dee2aaSAndroid Build Coastguard Worker virtual bool isSameTexture(const GrBackendTextureData*) const = 0; 74*c8dee2aaSAndroid Build Coastguard Worker virtual GrBackendFormat getBackendFormat() const = 0; 75*c8dee2aaSAndroid Build Coastguard Worker virtual void copyTo(AnyTextureData&) const = 0; 76*c8dee2aaSAndroid Build Coastguard Worker 77*c8dee2aaSAndroid Build Coastguard Worker // Vulkan-only API: getMutableState()78*c8dee2aaSAndroid Build Coastguard Worker virtual sk_sp<skgpu::MutableTextureState> getMutableState() const { return nullptr; } setMutableState(const skgpu::MutableTextureState &)79*c8dee2aaSAndroid Build Coastguard Worker virtual void setMutableState(const skgpu::MutableTextureState&) {} 80*c8dee2aaSAndroid Build Coastguard Worker }; 81*c8dee2aaSAndroid Build Coastguard Worker 82*c8dee2aaSAndroid Build Coastguard Worker class GrBackendRenderTargetData { 83*c8dee2aaSAndroid Build Coastguard Worker public: 84*c8dee2aaSAndroid Build Coastguard Worker virtual ~GrBackendRenderTargetData(); 85*c8dee2aaSAndroid Build Coastguard Worker #if defined(SK_DEBUG) 86*c8dee2aaSAndroid Build Coastguard Worker virtual GrBackendApi type() const = 0; 87*c8dee2aaSAndroid Build Coastguard Worker #endif 88*c8dee2aaSAndroid Build Coastguard Worker protected: 89*c8dee2aaSAndroid Build Coastguard Worker GrBackendRenderTargetData() = default; 90*c8dee2aaSAndroid Build Coastguard Worker GrBackendRenderTargetData(const GrBackendRenderTargetData&) = default; 91*c8dee2aaSAndroid Build Coastguard Worker 92*c8dee2aaSAndroid Build Coastguard Worker using AnyRenderTargetData = GrBackendRenderTarget::AnyRenderTargetData; 93*c8dee2aaSAndroid Build Coastguard Worker 94*c8dee2aaSAndroid Build Coastguard Worker private: 95*c8dee2aaSAndroid Build Coastguard Worker friend class GrBackendRenderTarget; 96*c8dee2aaSAndroid Build Coastguard Worker virtual GrBackendFormat getBackendFormat() const = 0; 97*c8dee2aaSAndroid Build Coastguard Worker virtual bool isProtected() const = 0; 98*c8dee2aaSAndroid Build Coastguard Worker virtual bool equal(const GrBackendRenderTargetData* that) const = 0; 99*c8dee2aaSAndroid Build Coastguard Worker virtual void copyTo(AnyRenderTargetData&) const = 0; 100*c8dee2aaSAndroid Build Coastguard Worker 101*c8dee2aaSAndroid Build Coastguard Worker // Vulkan-only API: getMutableState()102*c8dee2aaSAndroid Build Coastguard Worker virtual sk_sp<skgpu::MutableTextureState> getMutableState() const { return nullptr; } setMutableState(const skgpu::MutableTextureState &)103*c8dee2aaSAndroid Build Coastguard Worker virtual void setMutableState(const skgpu::MutableTextureState&) {} 104*c8dee2aaSAndroid Build Coastguard Worker }; 105*c8dee2aaSAndroid Build Coastguard Worker 106*c8dee2aaSAndroid Build Coastguard Worker class GrBackendSurfacePriv final { 107*c8dee2aaSAndroid Build Coastguard Worker public: 108*c8dee2aaSAndroid Build Coastguard Worker template <typename FormatData> MakeGrBackendFormat(GrTextureType textureType,GrBackendApi api,const FormatData & data)109*c8dee2aaSAndroid Build Coastguard Worker static GrBackendFormat MakeGrBackendFormat(GrTextureType textureType, 110*c8dee2aaSAndroid Build Coastguard Worker GrBackendApi api, 111*c8dee2aaSAndroid Build Coastguard Worker const FormatData& data) { 112*c8dee2aaSAndroid Build Coastguard Worker return GrBackendFormat(textureType, api, data); 113*c8dee2aaSAndroid Build Coastguard Worker } 114*c8dee2aaSAndroid Build Coastguard Worker GetBackendData(const GrBackendFormat & format)115*c8dee2aaSAndroid Build Coastguard Worker static const GrBackendFormatData* GetBackendData(const GrBackendFormat& format) { 116*c8dee2aaSAndroid Build Coastguard Worker return format.fFormatData.get(); 117*c8dee2aaSAndroid Build Coastguard Worker } 118*c8dee2aaSAndroid Build Coastguard Worker 119*c8dee2aaSAndroid Build Coastguard Worker template <typename TextureData> MakeGrBackendTexture(int width,int height,std::string_view label,skgpu::Mipmapped mipped,GrBackendApi backend,GrTextureType texture,const TextureData & data)120*c8dee2aaSAndroid Build Coastguard Worker static GrBackendTexture MakeGrBackendTexture(int width, 121*c8dee2aaSAndroid Build Coastguard Worker int height, 122*c8dee2aaSAndroid Build Coastguard Worker std::string_view label, 123*c8dee2aaSAndroid Build Coastguard Worker skgpu::Mipmapped mipped, 124*c8dee2aaSAndroid Build Coastguard Worker GrBackendApi backend, 125*c8dee2aaSAndroid Build Coastguard Worker GrTextureType texture, 126*c8dee2aaSAndroid Build Coastguard Worker const TextureData& data) { 127*c8dee2aaSAndroid Build Coastguard Worker return GrBackendTexture(width, height, label, mipped, backend, texture, data); 128*c8dee2aaSAndroid Build Coastguard Worker } 129*c8dee2aaSAndroid Build Coastguard Worker GetBackendData(const GrBackendTexture & tex)130*c8dee2aaSAndroid Build Coastguard Worker static const GrBackendTextureData* GetBackendData(const GrBackendTexture& tex) { 131*c8dee2aaSAndroid Build Coastguard Worker return tex.fTextureData.get(); 132*c8dee2aaSAndroid Build Coastguard Worker } 133*c8dee2aaSAndroid Build Coastguard Worker GetBackendData(GrBackendTexture * tex)134*c8dee2aaSAndroid Build Coastguard Worker static GrBackendTextureData* GetBackendData(GrBackendTexture* tex) { 135*c8dee2aaSAndroid Build Coastguard Worker SkASSERT(tex); 136*c8dee2aaSAndroid Build Coastguard Worker return tex->fTextureData.get(); 137*c8dee2aaSAndroid Build Coastguard Worker } 138*c8dee2aaSAndroid Build Coastguard Worker 139*c8dee2aaSAndroid Build Coastguard Worker template <typename RenderTargetData> MakeGrBackendRenderTarget(int width,int height,int sampleCnt,int stencilBits,GrBackendApi backend,bool framebufferOnly,const RenderTargetData & data)140*c8dee2aaSAndroid Build Coastguard Worker static GrBackendRenderTarget MakeGrBackendRenderTarget(int width, 141*c8dee2aaSAndroid Build Coastguard Worker int height, 142*c8dee2aaSAndroid Build Coastguard Worker int sampleCnt, 143*c8dee2aaSAndroid Build Coastguard Worker int stencilBits, 144*c8dee2aaSAndroid Build Coastguard Worker GrBackendApi backend, 145*c8dee2aaSAndroid Build Coastguard Worker bool framebufferOnly, 146*c8dee2aaSAndroid Build Coastguard Worker const RenderTargetData& data) { 147*c8dee2aaSAndroid Build Coastguard Worker return GrBackendRenderTarget( 148*c8dee2aaSAndroid Build Coastguard Worker width, height, sampleCnt, stencilBits, backend, framebufferOnly, data); 149*c8dee2aaSAndroid Build Coastguard Worker } 150*c8dee2aaSAndroid Build Coastguard Worker GetBackendData(const GrBackendRenderTarget & rt)151*c8dee2aaSAndroid Build Coastguard Worker static const GrBackendRenderTargetData* GetBackendData(const GrBackendRenderTarget& rt) { 152*c8dee2aaSAndroid Build Coastguard Worker return rt.fRTData.get(); 153*c8dee2aaSAndroid Build Coastguard Worker } 154*c8dee2aaSAndroid Build Coastguard Worker GetBackendData(GrBackendRenderTarget * rt)155*c8dee2aaSAndroid Build Coastguard Worker static GrBackendRenderTargetData* GetBackendData(GrBackendRenderTarget* rt) { 156*c8dee2aaSAndroid Build Coastguard Worker return rt->fRTData.get(); 157*c8dee2aaSAndroid Build Coastguard Worker } 158*c8dee2aaSAndroid Build Coastguard Worker }; 159*c8dee2aaSAndroid Build Coastguard Worker 160*c8dee2aaSAndroid Build Coastguard Worker #endif 161