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