xref: /aosp_15_r20/external/skia/src/gpu/ganesh/GrBackendSurfacePriv.h (revision c8dee2aa9b3f27cf6c858bd81872bdeb2c07ed17)
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