xref: /aosp_15_r20/external/skia/include/gpu/ganesh/GrBackendSurface.h (revision c8dee2aa9b3f27cf6c858bd81872bdeb2c07ed17)
1*c8dee2aaSAndroid Build Coastguard Worker /*
2*c8dee2aaSAndroid Build Coastguard Worker  * Copyright 2017 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 
8*c8dee2aaSAndroid Build Coastguard Worker #ifndef GrBackendSurface_DEFINED
9*c8dee2aaSAndroid Build Coastguard Worker #define GrBackendSurface_DEFINED
10*c8dee2aaSAndroid Build Coastguard Worker 
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/gpu/ganesh/GrTypes.h"
15*c8dee2aaSAndroid Build Coastguard Worker #include "include/gpu/ganesh/mock/GrMockTypes.h"
16*c8dee2aaSAndroid Build Coastguard Worker #include "include/private/base/SkAPI.h"
17*c8dee2aaSAndroid Build Coastguard Worker #include "include/private/base/SkAnySubclass.h"
18*c8dee2aaSAndroid Build Coastguard Worker #include "include/private/base/SkDebug.h"
19*c8dee2aaSAndroid Build Coastguard Worker #include "include/private/gpu/ganesh/GrTypesPriv.h"
20*c8dee2aaSAndroid Build Coastguard Worker 
21*c8dee2aaSAndroid Build Coastguard Worker enum class SkTextureCompressionType;
22*c8dee2aaSAndroid Build Coastguard Worker class GrBackendFormatData;
23*c8dee2aaSAndroid Build Coastguard Worker class GrBackendTextureData;
24*c8dee2aaSAndroid Build Coastguard Worker class GrBackendRenderTargetData;
25*c8dee2aaSAndroid Build Coastguard Worker 
26*c8dee2aaSAndroid Build Coastguard Worker namespace skgpu {
27*c8dee2aaSAndroid Build Coastguard Worker class MutableTextureState;
28*c8dee2aaSAndroid Build Coastguard Worker }
29*c8dee2aaSAndroid Build Coastguard Worker 
30*c8dee2aaSAndroid Build Coastguard Worker #ifdef SK_DIRECT3D
31*c8dee2aaSAndroid Build Coastguard Worker #include "include/private/gpu/ganesh/GrD3DTypesMinimal.h"
32*c8dee2aaSAndroid Build Coastguard Worker class GrD3DResourceState;
33*c8dee2aaSAndroid Build Coastguard Worker #endif
34*c8dee2aaSAndroid Build Coastguard Worker 
35*c8dee2aaSAndroid Build Coastguard Worker #if defined(SK_DEBUG) || defined(GPU_TEST_UTILS)
36*c8dee2aaSAndroid Build Coastguard Worker class SkString;
37*c8dee2aaSAndroid Build Coastguard Worker #endif
38*c8dee2aaSAndroid Build Coastguard Worker 
39*c8dee2aaSAndroid Build Coastguard Worker #include <cstddef>
40*c8dee2aaSAndroid Build Coastguard Worker #include <cstdint>
41*c8dee2aaSAndroid Build Coastguard Worker #include <string>
42*c8dee2aaSAndroid Build Coastguard Worker #include <string_view>
43*c8dee2aaSAndroid Build Coastguard Worker 
44*c8dee2aaSAndroid Build Coastguard Worker class SK_API GrBackendFormat {
45*c8dee2aaSAndroid Build Coastguard Worker public:
46*c8dee2aaSAndroid Build Coastguard Worker     // Creates an invalid backend format.
47*c8dee2aaSAndroid Build Coastguard Worker     GrBackendFormat();
48*c8dee2aaSAndroid Build Coastguard Worker     GrBackendFormat(const GrBackendFormat&);
49*c8dee2aaSAndroid Build Coastguard Worker     GrBackendFormat& operator=(const GrBackendFormat&);
50*c8dee2aaSAndroid Build Coastguard Worker     ~GrBackendFormat();
51*c8dee2aaSAndroid Build Coastguard Worker 
52*c8dee2aaSAndroid Build Coastguard Worker #ifdef SK_DIRECT3D
MakeDxgi(DXGI_FORMAT format)53*c8dee2aaSAndroid Build Coastguard Worker     static GrBackendFormat MakeDxgi(DXGI_FORMAT format) {
54*c8dee2aaSAndroid Build Coastguard Worker         return GrBackendFormat(format);
55*c8dee2aaSAndroid Build Coastguard Worker     }
56*c8dee2aaSAndroid Build Coastguard Worker #endif
57*c8dee2aaSAndroid Build Coastguard Worker 
58*c8dee2aaSAndroid Build Coastguard Worker     static GrBackendFormat MakeMock(GrColorType colorType,
59*c8dee2aaSAndroid Build Coastguard Worker                                     SkTextureCompressionType compression,
60*c8dee2aaSAndroid Build Coastguard Worker                                     bool isStencilFormat = false);
61*c8dee2aaSAndroid Build Coastguard Worker 
62*c8dee2aaSAndroid Build Coastguard Worker     bool operator==(const GrBackendFormat& that) const;
63*c8dee2aaSAndroid Build Coastguard Worker     bool operator!=(const GrBackendFormat& that) const { return !(*this == that); }
64*c8dee2aaSAndroid Build Coastguard Worker 
backend()65*c8dee2aaSAndroid Build Coastguard Worker     GrBackendApi backend() const { return fBackend; }
textureType()66*c8dee2aaSAndroid Build Coastguard Worker     GrTextureType textureType() const { return fTextureType; }
67*c8dee2aaSAndroid Build Coastguard Worker 
68*c8dee2aaSAndroid Build Coastguard Worker     /**
69*c8dee2aaSAndroid Build Coastguard Worker      * Gets the channels present in the format as a bitfield of SkColorChannelFlag values.
70*c8dee2aaSAndroid Build Coastguard Worker      * Luminance channels are reported as kGray_SkColorChannelFlag.
71*c8dee2aaSAndroid Build Coastguard Worker      */
72*c8dee2aaSAndroid Build Coastguard Worker     uint32_t channelMask() const;
73*c8dee2aaSAndroid Build Coastguard Worker 
74*c8dee2aaSAndroid Build Coastguard Worker     GrColorFormatDesc desc() const;
75*c8dee2aaSAndroid Build Coastguard Worker 
76*c8dee2aaSAndroid Build Coastguard Worker #ifdef SK_DIRECT3D
77*c8dee2aaSAndroid Build Coastguard Worker     /**
78*c8dee2aaSAndroid Build Coastguard Worker      * If the backend API is Direct3D this gets the format as a DXGI_FORMAT and returns true.
79*c8dee2aaSAndroid Build Coastguard Worker      * Otherwise, returns false.
80*c8dee2aaSAndroid Build Coastguard Worker      */
81*c8dee2aaSAndroid Build Coastguard Worker     bool asDxgiFormat(DXGI_FORMAT*) const;
82*c8dee2aaSAndroid Build Coastguard Worker #endif
83*c8dee2aaSAndroid Build Coastguard Worker 
84*c8dee2aaSAndroid Build Coastguard Worker     /**
85*c8dee2aaSAndroid Build Coastguard Worker      * If the backend API is not Mock these three calls will return kUnknown, kNone or false,
86*c8dee2aaSAndroid Build Coastguard Worker      * respectively. Otherwise, only one of the following can be true. The GrColorType is not
87*c8dee2aaSAndroid Build Coastguard Worker      * kUnknown, the compression type is not kNone, or this is a mock stencil format.
88*c8dee2aaSAndroid Build Coastguard Worker      */
89*c8dee2aaSAndroid Build Coastguard Worker     GrColorType asMockColorType() const;
90*c8dee2aaSAndroid Build Coastguard Worker     SkTextureCompressionType asMockCompressionType() const;
91*c8dee2aaSAndroid Build Coastguard Worker     bool isMockStencilFormat() const;
92*c8dee2aaSAndroid Build Coastguard Worker 
93*c8dee2aaSAndroid Build Coastguard Worker     // If possible, copies the GrBackendFormat and forces the texture type to be Texture2D. If the
94*c8dee2aaSAndroid Build Coastguard Worker     // GrBackendFormat was for Vulkan and it originally had a skgpu::VulkanYcbcrConversionInfo,
95*c8dee2aaSAndroid Build Coastguard Worker     // we will remove the conversion and set the format to be VK_FORMAT_R8G8B8A8_UNORM.
96*c8dee2aaSAndroid Build Coastguard Worker     GrBackendFormat makeTexture2D() const;
97*c8dee2aaSAndroid Build Coastguard Worker 
98*c8dee2aaSAndroid Build Coastguard Worker     // Returns true if the backend format has been initialized.
isValid()99*c8dee2aaSAndroid Build Coastguard Worker     bool isValid() const { return fValid; }
100*c8dee2aaSAndroid Build Coastguard Worker 
101*c8dee2aaSAndroid Build Coastguard Worker #if defined(SK_DEBUG) || defined(GPU_TEST_UTILS)
102*c8dee2aaSAndroid Build Coastguard Worker     SkString toStr() const;
103*c8dee2aaSAndroid Build Coastguard Worker #endif
104*c8dee2aaSAndroid Build Coastguard Worker 
105*c8dee2aaSAndroid Build Coastguard Worker private:
106*c8dee2aaSAndroid Build Coastguard Worker     // Size determined by looking at the GrBackendFormatData subclasses, then guessing-and-checking.
107*c8dee2aaSAndroid Build Coastguard Worker     // Compiler will complain if this is too small - in that case, just increase the number.
108*c8dee2aaSAndroid Build Coastguard Worker     inline constexpr static size_t kMaxSubclassSize = 80;
109*c8dee2aaSAndroid Build Coastguard Worker     using AnyFormatData = SkAnySubclass<GrBackendFormatData, kMaxSubclassSize>;
110*c8dee2aaSAndroid Build Coastguard Worker 
111*c8dee2aaSAndroid Build Coastguard Worker     friend class GrBackendSurfacePriv;
112*c8dee2aaSAndroid Build Coastguard Worker     friend class GrBackendFormatData;
113*c8dee2aaSAndroid Build Coastguard Worker 
114*c8dee2aaSAndroid Build Coastguard Worker     // Used by internal factories. Should not be used externally. Use factories like
115*c8dee2aaSAndroid Build Coastguard Worker     // GrBackendFormats::MakeGL instead.
116*c8dee2aaSAndroid Build Coastguard Worker     template <typename FormatData>
GrBackendFormat(GrTextureType textureType,GrBackendApi api,const FormatData & formatData)117*c8dee2aaSAndroid Build Coastguard Worker     GrBackendFormat(GrTextureType textureType, GrBackendApi api, const FormatData& formatData)
118*c8dee2aaSAndroid Build Coastguard Worker             : fBackend(api), fValid(true), fTextureType(textureType) {
119*c8dee2aaSAndroid Build Coastguard Worker         fFormatData.emplace<FormatData>(formatData);
120*c8dee2aaSAndroid Build Coastguard Worker     }
121*c8dee2aaSAndroid Build Coastguard Worker 
122*c8dee2aaSAndroid Build Coastguard Worker #ifdef SK_DIRECT3D
123*c8dee2aaSAndroid Build Coastguard Worker     GrBackendFormat(DXGI_FORMAT dxgiFormat);
124*c8dee2aaSAndroid Build Coastguard Worker #endif
125*c8dee2aaSAndroid Build Coastguard Worker 
126*c8dee2aaSAndroid Build Coastguard Worker     GrBackendFormat(GrColorType, SkTextureCompressionType, bool isStencilFormat);
127*c8dee2aaSAndroid Build Coastguard Worker 
128*c8dee2aaSAndroid Build Coastguard Worker #ifdef SK_DEBUG
129*c8dee2aaSAndroid Build Coastguard Worker     bool validateMock() const;
130*c8dee2aaSAndroid Build Coastguard Worker #endif
131*c8dee2aaSAndroid Build Coastguard Worker 
132*c8dee2aaSAndroid Build Coastguard Worker     GrBackendApi fBackend = GrBackendApi::kMock;
133*c8dee2aaSAndroid Build Coastguard Worker     bool fValid = false;
134*c8dee2aaSAndroid Build Coastguard Worker     AnyFormatData fFormatData;
135*c8dee2aaSAndroid Build Coastguard Worker 
136*c8dee2aaSAndroid Build Coastguard Worker     union {
137*c8dee2aaSAndroid Build Coastguard Worker #ifdef SK_DIRECT3D
138*c8dee2aaSAndroid Build Coastguard Worker         DXGI_FORMAT fDxgiFormat;
139*c8dee2aaSAndroid Build Coastguard Worker #endif
140*c8dee2aaSAndroid Build Coastguard Worker         struct {
141*c8dee2aaSAndroid Build Coastguard Worker             GrColorType fColorType;
142*c8dee2aaSAndroid Build Coastguard Worker             SkTextureCompressionType fCompressionType;
143*c8dee2aaSAndroid Build Coastguard Worker             bool fIsStencilFormat;
144*c8dee2aaSAndroid Build Coastguard Worker         } fMock;
145*c8dee2aaSAndroid Build Coastguard Worker     };
146*c8dee2aaSAndroid Build Coastguard Worker     GrTextureType fTextureType = GrTextureType::kNone;
147*c8dee2aaSAndroid Build Coastguard Worker };
148*c8dee2aaSAndroid Build Coastguard Worker 
149*c8dee2aaSAndroid Build Coastguard Worker class SK_API GrBackendTexture {
150*c8dee2aaSAndroid Build Coastguard Worker public:
151*c8dee2aaSAndroid Build Coastguard Worker     // Creates an invalid backend texture.
152*c8dee2aaSAndroid Build Coastguard Worker     GrBackendTexture();
153*c8dee2aaSAndroid Build Coastguard Worker 
154*c8dee2aaSAndroid Build Coastguard Worker #ifdef SK_DIRECT3D
155*c8dee2aaSAndroid Build Coastguard Worker     GrBackendTexture(int width,
156*c8dee2aaSAndroid Build Coastguard Worker                      int height,
157*c8dee2aaSAndroid Build Coastguard Worker                      const GrD3DTextureResourceInfo& d3dInfo,
158*c8dee2aaSAndroid Build Coastguard Worker                      std::string_view label = {});
159*c8dee2aaSAndroid Build Coastguard Worker #endif
160*c8dee2aaSAndroid Build Coastguard Worker 
161*c8dee2aaSAndroid Build Coastguard Worker     GrBackendTexture(int width,
162*c8dee2aaSAndroid Build Coastguard Worker                      int height,
163*c8dee2aaSAndroid Build Coastguard Worker                      skgpu::Mipmapped,
164*c8dee2aaSAndroid Build Coastguard Worker                      const GrMockTextureInfo& mockInfo,
165*c8dee2aaSAndroid Build Coastguard Worker                      std::string_view label = {});
166*c8dee2aaSAndroid Build Coastguard Worker 
167*c8dee2aaSAndroid Build Coastguard Worker     GrBackendTexture(const GrBackendTexture& that);
168*c8dee2aaSAndroid Build Coastguard Worker 
169*c8dee2aaSAndroid Build Coastguard Worker     ~GrBackendTexture();
170*c8dee2aaSAndroid Build Coastguard Worker 
171*c8dee2aaSAndroid Build Coastguard Worker     GrBackendTexture& operator=(const GrBackendTexture& that);
172*c8dee2aaSAndroid Build Coastguard Worker 
dimensions()173*c8dee2aaSAndroid Build Coastguard Worker     SkISize dimensions() const { return {fWidth, fHeight}; }
width()174*c8dee2aaSAndroid Build Coastguard Worker     int width() const { return fWidth; }
height()175*c8dee2aaSAndroid Build Coastguard Worker     int height() const { return fHeight; }
getLabel()176*c8dee2aaSAndroid Build Coastguard Worker     std::string_view getLabel() const { return fLabel; }
mipmapped()177*c8dee2aaSAndroid Build Coastguard Worker     skgpu::Mipmapped mipmapped() const { return fMipmapped; }
hasMipmaps()178*c8dee2aaSAndroid Build Coastguard Worker     bool hasMipmaps() const { return fMipmapped == skgpu::Mipmapped::kYes; }
backend()179*c8dee2aaSAndroid Build Coastguard Worker     GrBackendApi backend() const {return fBackend; }
textureType()180*c8dee2aaSAndroid Build Coastguard Worker     GrTextureType textureType() const { return fTextureType; }
181*c8dee2aaSAndroid Build Coastguard Worker 
182*c8dee2aaSAndroid Build Coastguard Worker #ifdef SK_DIRECT3D
183*c8dee2aaSAndroid Build Coastguard Worker     // If the backend API is Direct3D, copies a snapshot of the GrD3DTextureResourceInfo struct into
184*c8dee2aaSAndroid Build Coastguard Worker     // the passed in pointer and returns true. This snapshot will set the fResourceState to the
185*c8dee2aaSAndroid Build Coastguard Worker     // current resource state. Otherwise returns false if the backend API is not D3D.
186*c8dee2aaSAndroid Build Coastguard Worker     bool getD3DTextureResourceInfo(GrD3DTextureResourceInfo*) const;
187*c8dee2aaSAndroid Build Coastguard Worker 
188*c8dee2aaSAndroid Build Coastguard Worker     // Anytime the client changes the D3D12_RESOURCE_STATES of the D3D12_RESOURCE captured by this
189*c8dee2aaSAndroid Build Coastguard Worker     // GrBackendTexture, they must call this function to notify Skia of the changed layout.
190*c8dee2aaSAndroid Build Coastguard Worker     void setD3DResourceState(GrD3DResourceStateEnum);
191*c8dee2aaSAndroid Build Coastguard Worker #endif
192*c8dee2aaSAndroid Build Coastguard Worker 
193*c8dee2aaSAndroid Build Coastguard Worker     // Get the GrBackendFormat for this texture (or an invalid format if this is not valid).
194*c8dee2aaSAndroid Build Coastguard Worker     GrBackendFormat getBackendFormat() const;
195*c8dee2aaSAndroid Build Coastguard Worker 
196*c8dee2aaSAndroid Build Coastguard Worker     // If the backend API is Mock, copies a snapshot of the GrMockTextureInfo struct into the passed
197*c8dee2aaSAndroid Build Coastguard Worker     // in pointer and returns true. Otherwise returns false if the backend API is not Mock.
198*c8dee2aaSAndroid Build Coastguard Worker     bool getMockTextureInfo(GrMockTextureInfo*) const;
199*c8dee2aaSAndroid Build Coastguard Worker 
200*c8dee2aaSAndroid Build Coastguard Worker     // If the client changes any of the mutable backend of the GrBackendTexture they should call
201*c8dee2aaSAndroid Build Coastguard Worker     // this function to inform Skia that those values have changed. The backend API specific state
202*c8dee2aaSAndroid Build Coastguard Worker     // that can be set from this function are:
203*c8dee2aaSAndroid Build Coastguard Worker     //
204*c8dee2aaSAndroid Build Coastguard Worker     // Vulkan: VkImageLayout and QueueFamilyIndex
205*c8dee2aaSAndroid Build Coastguard Worker     void setMutableState(const skgpu::MutableTextureState&);
206*c8dee2aaSAndroid Build Coastguard Worker 
207*c8dee2aaSAndroid Build Coastguard Worker     // Returns true if we are working with protected content.
208*c8dee2aaSAndroid Build Coastguard Worker     bool isProtected() const;
209*c8dee2aaSAndroid Build Coastguard Worker 
210*c8dee2aaSAndroid Build Coastguard Worker     // Returns true if the backend texture has been initialized.
isValid()211*c8dee2aaSAndroid Build Coastguard Worker     bool isValid() const { return fIsValid; }
212*c8dee2aaSAndroid Build Coastguard Worker 
213*c8dee2aaSAndroid Build Coastguard Worker     // Returns true if both textures are valid and refer to the same API texture.
214*c8dee2aaSAndroid Build Coastguard Worker     bool isSameTexture(const GrBackendTexture&);
215*c8dee2aaSAndroid Build Coastguard Worker 
216*c8dee2aaSAndroid Build Coastguard Worker #if defined(GPU_TEST_UTILS)
217*c8dee2aaSAndroid Build Coastguard Worker     static bool TestingOnly_Equals(const GrBackendTexture&, const GrBackendTexture&);
218*c8dee2aaSAndroid Build Coastguard Worker #endif
219*c8dee2aaSAndroid Build Coastguard Worker 
220*c8dee2aaSAndroid Build Coastguard Worker private:
221*c8dee2aaSAndroid Build Coastguard Worker     // Size determined by looking at the GrBackendTextureData subclasses, then guessing-and-checking.
222*c8dee2aaSAndroid Build Coastguard Worker     // Compiler will complain if this is too small - in that case, just increase the number.
223*c8dee2aaSAndroid Build Coastguard Worker     inline constexpr static size_t kMaxSubclassSize = 176;
224*c8dee2aaSAndroid Build Coastguard Worker     using AnyTextureData = SkAnySubclass<GrBackendTextureData, kMaxSubclassSize>;
225*c8dee2aaSAndroid Build Coastguard Worker 
226*c8dee2aaSAndroid Build Coastguard Worker     friend class GrBackendSurfacePriv;
227*c8dee2aaSAndroid Build Coastguard Worker     friend class GrBackendTextureData;
228*c8dee2aaSAndroid Build Coastguard Worker 
229*c8dee2aaSAndroid Build Coastguard Worker     // Used by internal factories. Should not be used externally. Use factories like
230*c8dee2aaSAndroid Build Coastguard Worker     // GrBackendTextures::MakeGL instead.
231*c8dee2aaSAndroid Build Coastguard Worker     template <typename TextureData>
GrBackendTexture(int width,int height,std::string_view label,skgpu::Mipmapped mipped,GrBackendApi backend,GrTextureType texture,const TextureData & textureData)232*c8dee2aaSAndroid Build Coastguard Worker     GrBackendTexture(int width,
233*c8dee2aaSAndroid Build Coastguard Worker                      int height,
234*c8dee2aaSAndroid Build Coastguard Worker                      std::string_view label,
235*c8dee2aaSAndroid Build Coastguard Worker                      skgpu::Mipmapped mipped,
236*c8dee2aaSAndroid Build Coastguard Worker                      GrBackendApi backend,
237*c8dee2aaSAndroid Build Coastguard Worker                      GrTextureType texture,
238*c8dee2aaSAndroid Build Coastguard Worker                      const TextureData& textureData)
239*c8dee2aaSAndroid Build Coastguard Worker             : fIsValid(true)
240*c8dee2aaSAndroid Build Coastguard Worker             , fWidth(width)
241*c8dee2aaSAndroid Build Coastguard Worker             , fHeight(height)
242*c8dee2aaSAndroid Build Coastguard Worker             , fLabel(label)
243*c8dee2aaSAndroid Build Coastguard Worker             , fMipmapped(mipped)
244*c8dee2aaSAndroid Build Coastguard Worker             , fBackend(backend)
245*c8dee2aaSAndroid Build Coastguard Worker             , fTextureType(texture) {
246*c8dee2aaSAndroid Build Coastguard Worker         fTextureData.emplace<TextureData>(textureData);
247*c8dee2aaSAndroid Build Coastguard Worker     }
248*c8dee2aaSAndroid Build Coastguard Worker 
249*c8dee2aaSAndroid Build Coastguard Worker     friend class GrVkGpu;  // for getMutableState
250*c8dee2aaSAndroid Build Coastguard Worker     sk_sp<skgpu::MutableTextureState> getMutableState() const;
251*c8dee2aaSAndroid Build Coastguard Worker 
252*c8dee2aaSAndroid Build Coastguard Worker #ifdef SK_DIRECT3D
253*c8dee2aaSAndroid Build Coastguard Worker     friend class GrD3DTexture;
254*c8dee2aaSAndroid Build Coastguard Worker     friend class GrD3DGpu;     // for getGrD3DResourceState
255*c8dee2aaSAndroid Build Coastguard Worker     GrBackendTexture(int width,
256*c8dee2aaSAndroid Build Coastguard Worker                      int height,
257*c8dee2aaSAndroid Build Coastguard Worker                      const GrD3DTextureResourceInfo& vkInfo,
258*c8dee2aaSAndroid Build Coastguard Worker                      sk_sp<GrD3DResourceState> state,
259*c8dee2aaSAndroid Build Coastguard Worker                      std::string_view label = {});
260*c8dee2aaSAndroid Build Coastguard Worker     sk_sp<GrD3DResourceState> getGrD3DResourceState() const;
261*c8dee2aaSAndroid Build Coastguard Worker #endif
262*c8dee2aaSAndroid Build Coastguard Worker 
263*c8dee2aaSAndroid Build Coastguard Worker     // Free and release and resources being held by the GrBackendTexture.
264*c8dee2aaSAndroid Build Coastguard Worker     void cleanup();
265*c8dee2aaSAndroid Build Coastguard Worker 
266*c8dee2aaSAndroid Build Coastguard Worker     bool fIsValid;
267*c8dee2aaSAndroid Build Coastguard Worker     int fWidth;         //<! width in pixels
268*c8dee2aaSAndroid Build Coastguard Worker     int fHeight;        //<! height in pixels
269*c8dee2aaSAndroid Build Coastguard Worker     const std::string fLabel;
270*c8dee2aaSAndroid Build Coastguard Worker     skgpu::Mipmapped fMipmapped;
271*c8dee2aaSAndroid Build Coastguard Worker     GrBackendApi fBackend;
272*c8dee2aaSAndroid Build Coastguard Worker     GrTextureType fTextureType;
273*c8dee2aaSAndroid Build Coastguard Worker     AnyTextureData fTextureData;
274*c8dee2aaSAndroid Build Coastguard Worker 
275*c8dee2aaSAndroid Build Coastguard Worker     union {
276*c8dee2aaSAndroid Build Coastguard Worker         GrMockTextureInfo fMockInfo;
277*c8dee2aaSAndroid Build Coastguard Worker #ifdef SK_DIRECT3D
278*c8dee2aaSAndroid Build Coastguard Worker         GrD3DBackendSurfaceInfo fD3DInfo;
279*c8dee2aaSAndroid Build Coastguard Worker #endif
280*c8dee2aaSAndroid Build Coastguard Worker     };
281*c8dee2aaSAndroid Build Coastguard Worker };
282*c8dee2aaSAndroid Build Coastguard Worker 
283*c8dee2aaSAndroid Build Coastguard Worker class SK_API GrBackendRenderTarget {
284*c8dee2aaSAndroid Build Coastguard Worker public:
285*c8dee2aaSAndroid Build Coastguard Worker     // Creates an invalid backend texture.
286*c8dee2aaSAndroid Build Coastguard Worker     GrBackendRenderTarget();
287*c8dee2aaSAndroid Build Coastguard Worker 
288*c8dee2aaSAndroid Build Coastguard Worker #ifdef SK_DIRECT3D
289*c8dee2aaSAndroid Build Coastguard Worker     GrBackendRenderTarget(int width,
290*c8dee2aaSAndroid Build Coastguard Worker                           int height,
291*c8dee2aaSAndroid Build Coastguard Worker                           const GrD3DTextureResourceInfo& d3dInfo);
292*c8dee2aaSAndroid Build Coastguard Worker #endif
293*c8dee2aaSAndroid Build Coastguard Worker 
294*c8dee2aaSAndroid Build Coastguard Worker     GrBackendRenderTarget(int width,
295*c8dee2aaSAndroid Build Coastguard Worker                           int height,
296*c8dee2aaSAndroid Build Coastguard Worker                           int sampleCnt,
297*c8dee2aaSAndroid Build Coastguard Worker                           int stencilBits,
298*c8dee2aaSAndroid Build Coastguard Worker                           const GrMockRenderTargetInfo& mockInfo);
299*c8dee2aaSAndroid Build Coastguard Worker 
300*c8dee2aaSAndroid Build Coastguard Worker     ~GrBackendRenderTarget();
301*c8dee2aaSAndroid Build Coastguard Worker 
302*c8dee2aaSAndroid Build Coastguard Worker     GrBackendRenderTarget(const GrBackendRenderTarget& that);
303*c8dee2aaSAndroid Build Coastguard Worker     GrBackendRenderTarget& operator=(const GrBackendRenderTarget&);
304*c8dee2aaSAndroid Build Coastguard Worker 
dimensions()305*c8dee2aaSAndroid Build Coastguard Worker     SkISize dimensions() const { return {fWidth, fHeight}; }
width()306*c8dee2aaSAndroid Build Coastguard Worker     int width() const { return fWidth; }
height()307*c8dee2aaSAndroid Build Coastguard Worker     int height() const { return fHeight; }
sampleCnt()308*c8dee2aaSAndroid Build Coastguard Worker     int sampleCnt() const { return fSampleCnt; }
stencilBits()309*c8dee2aaSAndroid Build Coastguard Worker     int stencilBits() const { return fStencilBits; }
backend()310*c8dee2aaSAndroid Build Coastguard Worker     GrBackendApi backend() const {return fBackend; }
isFramebufferOnly()311*c8dee2aaSAndroid Build Coastguard Worker     bool isFramebufferOnly() const { return fFramebufferOnly; }
312*c8dee2aaSAndroid Build Coastguard Worker 
313*c8dee2aaSAndroid Build Coastguard Worker #ifdef SK_DIRECT3D
314*c8dee2aaSAndroid Build Coastguard Worker     // If the backend API is Direct3D, copies a snapshot of the GrMtlTextureInfo struct into the
315*c8dee2aaSAndroid Build Coastguard Worker     // passed in pointer and returns true. Otherwise returns false if the backend API is not D3D.
316*c8dee2aaSAndroid Build Coastguard Worker     bool getD3DTextureResourceInfo(GrD3DTextureResourceInfo*) const;
317*c8dee2aaSAndroid Build Coastguard Worker 
318*c8dee2aaSAndroid Build Coastguard Worker     // Anytime the client changes the D3D12_RESOURCE_STATES of the D3D12_RESOURCE captured by this
319*c8dee2aaSAndroid Build Coastguard Worker     // GrBackendTexture, they must call this function to notify Skia of the changed layout.
320*c8dee2aaSAndroid Build Coastguard Worker     void setD3DResourceState(GrD3DResourceStateEnum);
321*c8dee2aaSAndroid Build Coastguard Worker #endif
322*c8dee2aaSAndroid Build Coastguard Worker 
323*c8dee2aaSAndroid Build Coastguard Worker     // Get the GrBackendFormat for this render target (or an invalid format if this is not valid).
324*c8dee2aaSAndroid Build Coastguard Worker     GrBackendFormat getBackendFormat() const;
325*c8dee2aaSAndroid Build Coastguard Worker 
326*c8dee2aaSAndroid Build Coastguard Worker     // If the backend API is Mock, copies a snapshot of the GrMockTextureInfo struct into the passed
327*c8dee2aaSAndroid Build Coastguard Worker     // in pointer and returns true. Otherwise returns false if the backend API is not Mock.
328*c8dee2aaSAndroid Build Coastguard Worker     bool getMockRenderTargetInfo(GrMockRenderTargetInfo*) const;
329*c8dee2aaSAndroid Build Coastguard Worker 
330*c8dee2aaSAndroid Build Coastguard Worker     // If the client changes any of the mutable backend of the GrBackendTexture they should call
331*c8dee2aaSAndroid Build Coastguard Worker     // this function to inform Skia that those values have changed. The backend API specific state
332*c8dee2aaSAndroid Build Coastguard Worker     // that can be set from this function are:
333*c8dee2aaSAndroid Build Coastguard Worker     //
334*c8dee2aaSAndroid Build Coastguard Worker     // Vulkan: VkImageLayout and QueueFamilyIndex
335*c8dee2aaSAndroid Build Coastguard Worker     void setMutableState(const skgpu::MutableTextureState&);
336*c8dee2aaSAndroid Build Coastguard Worker 
337*c8dee2aaSAndroid Build Coastguard Worker     // Returns true if we are working with protected content.
338*c8dee2aaSAndroid Build Coastguard Worker     bool isProtected() const;
339*c8dee2aaSAndroid Build Coastguard Worker 
340*c8dee2aaSAndroid Build Coastguard Worker     // Returns true if the backend texture has been initialized.
isValid()341*c8dee2aaSAndroid Build Coastguard Worker     bool isValid() const { return fIsValid; }
342*c8dee2aaSAndroid Build Coastguard Worker 
343*c8dee2aaSAndroid Build Coastguard Worker #if defined(GPU_TEST_UTILS)
344*c8dee2aaSAndroid Build Coastguard Worker     static bool TestingOnly_Equals(const GrBackendRenderTarget&, const GrBackendRenderTarget&);
345*c8dee2aaSAndroid Build Coastguard Worker #endif
346*c8dee2aaSAndroid Build Coastguard Worker 
347*c8dee2aaSAndroid Build Coastguard Worker private:
348*c8dee2aaSAndroid Build Coastguard Worker     // Size determined by looking at the GrBackendRenderTargetData subclasses, then
349*c8dee2aaSAndroid Build Coastguard Worker     // guessing-and-checking. Compiler will complain if this is too small - in that case, just
350*c8dee2aaSAndroid Build Coastguard Worker     // increase the number.
351*c8dee2aaSAndroid Build Coastguard Worker     inline constexpr static size_t kMaxSubclassSize = 176;
352*c8dee2aaSAndroid Build Coastguard Worker     using AnyRenderTargetData = SkAnySubclass<GrBackendRenderTargetData, kMaxSubclassSize>;
353*c8dee2aaSAndroid Build Coastguard Worker 
354*c8dee2aaSAndroid Build Coastguard Worker     friend class GrBackendSurfacePriv;
355*c8dee2aaSAndroid Build Coastguard Worker     friend class GrBackendRenderTargetData;
356*c8dee2aaSAndroid Build Coastguard Worker 
357*c8dee2aaSAndroid Build Coastguard Worker     // Used by internal factories. Should not be used externally. Use factories like
358*c8dee2aaSAndroid Build Coastguard Worker     // GrBackendRenderTargets::MakeGL instead.
359*c8dee2aaSAndroid Build Coastguard Worker     template <typename RenderTargetData>
GrBackendRenderTarget(int width,int height,int sampleCnt,int stencilBits,GrBackendApi backend,bool framebufferOnly,const RenderTargetData & rtData)360*c8dee2aaSAndroid Build Coastguard Worker     GrBackendRenderTarget(int width,
361*c8dee2aaSAndroid Build Coastguard Worker                           int height,
362*c8dee2aaSAndroid Build Coastguard Worker                           int sampleCnt,
363*c8dee2aaSAndroid Build Coastguard Worker                           int stencilBits,
364*c8dee2aaSAndroid Build Coastguard Worker                           GrBackendApi backend,
365*c8dee2aaSAndroid Build Coastguard Worker                           bool framebufferOnly,
366*c8dee2aaSAndroid Build Coastguard Worker                           const RenderTargetData& rtData)
367*c8dee2aaSAndroid Build Coastguard Worker             : fIsValid(true)
368*c8dee2aaSAndroid Build Coastguard Worker             , fFramebufferOnly(framebufferOnly)
369*c8dee2aaSAndroid Build Coastguard Worker             , fWidth(width)
370*c8dee2aaSAndroid Build Coastguard Worker             , fHeight(height)
371*c8dee2aaSAndroid Build Coastguard Worker             , fSampleCnt(sampleCnt)
372*c8dee2aaSAndroid Build Coastguard Worker             , fStencilBits(stencilBits)
373*c8dee2aaSAndroid Build Coastguard Worker             , fBackend(backend) {
374*c8dee2aaSAndroid Build Coastguard Worker         fRTData.emplace<RenderTargetData>(rtData);
375*c8dee2aaSAndroid Build Coastguard Worker     }
376*c8dee2aaSAndroid Build Coastguard Worker 
377*c8dee2aaSAndroid Build Coastguard Worker     friend class GrVkGpu; // for getMutableState
378*c8dee2aaSAndroid Build Coastguard Worker     sk_sp<skgpu::MutableTextureState> getMutableState() const;
379*c8dee2aaSAndroid Build Coastguard Worker 
380*c8dee2aaSAndroid Build Coastguard Worker #ifdef SK_DIRECT3D
381*c8dee2aaSAndroid Build Coastguard Worker     friend class GrD3DGpu;
382*c8dee2aaSAndroid Build Coastguard Worker     friend class GrD3DRenderTarget;
383*c8dee2aaSAndroid Build Coastguard Worker     GrBackendRenderTarget(int width,
384*c8dee2aaSAndroid Build Coastguard Worker                           int height,
385*c8dee2aaSAndroid Build Coastguard Worker                           const GrD3DTextureResourceInfo& d3dInfo,
386*c8dee2aaSAndroid Build Coastguard Worker                           sk_sp<GrD3DResourceState> state);
387*c8dee2aaSAndroid Build Coastguard Worker     sk_sp<GrD3DResourceState> getGrD3DResourceState() const;
388*c8dee2aaSAndroid Build Coastguard Worker #endif
389*c8dee2aaSAndroid Build Coastguard Worker 
390*c8dee2aaSAndroid Build Coastguard Worker     // Free and release and resources being held by the GrBackendTexture.
391*c8dee2aaSAndroid Build Coastguard Worker     void cleanup();
392*c8dee2aaSAndroid Build Coastguard Worker 
393*c8dee2aaSAndroid Build Coastguard Worker     bool fIsValid;
394*c8dee2aaSAndroid Build Coastguard Worker     bool fFramebufferOnly = false;
395*c8dee2aaSAndroid Build Coastguard Worker     int fWidth;         //<! width in pixels
396*c8dee2aaSAndroid Build Coastguard Worker     int fHeight;        //<! height in pixels
397*c8dee2aaSAndroid Build Coastguard Worker 
398*c8dee2aaSAndroid Build Coastguard Worker     int fSampleCnt;
399*c8dee2aaSAndroid Build Coastguard Worker     int fStencilBits;
400*c8dee2aaSAndroid Build Coastguard Worker 
401*c8dee2aaSAndroid Build Coastguard Worker     GrBackendApi fBackend;
402*c8dee2aaSAndroid Build Coastguard Worker     AnyRenderTargetData fRTData;
403*c8dee2aaSAndroid Build Coastguard Worker 
404*c8dee2aaSAndroid Build Coastguard Worker     union {
405*c8dee2aaSAndroid Build Coastguard Worker         GrMockRenderTargetInfo fMockInfo;
406*c8dee2aaSAndroid Build Coastguard Worker #ifdef SK_DIRECT3D
407*c8dee2aaSAndroid Build Coastguard Worker         GrD3DBackendSurfaceInfo fD3DInfo;
408*c8dee2aaSAndroid Build Coastguard Worker #endif
409*c8dee2aaSAndroid Build Coastguard Worker     };
410*c8dee2aaSAndroid Build Coastguard Worker };
411*c8dee2aaSAndroid Build Coastguard Worker 
412*c8dee2aaSAndroid Build Coastguard Worker #endif
413