1 /* 2 * Copyright 2017 Google Inc. 3 * 4 * Use of this source code is governed by a BSD-style license that can be 5 * found in the LICENSE file. 6 */ 7 8 #ifndef SkSurfaceCharacterization_DEFINED 9 #define SkSurfaceCharacterization_DEFINED 10 11 #include "include/gpu/GrTypes.h" 12 13 #include "include/core/SkColorSpace.h" 14 #include "include/core/SkImageInfo.h" 15 #include "include/core/SkRefCnt.h" 16 #include "include/core/SkSurfaceProps.h" 17 18 class SkColorSpace; 19 20 #include "include/gpu/GrBackendSurface.h" 21 22 #if SK_SUPPORT_GPU 23 // TODO: remove the GrContext.h include once Flutter is updated 24 #include "include/gpu/GrContext.h" 25 #include "include/gpu/GrContextThreadSafeProxy.h" 26 27 /** \class SkSurfaceCharacterization 28 A surface characterization contains all the information Ganesh requires to makes its internal 29 rendering decisions. When passed into a SkDeferredDisplayListRecorder it will copy the 30 data and pass it on to the SkDeferredDisplayList if/when it is created. Note that both of 31 those objects (the Recorder and the DisplayList) will take a ref on the 32 GrContextThreadSafeProxy and SkColorSpace objects. 33 */ 34 class SK_API SkSurfaceCharacterization { 35 public: 36 enum class Textureable : bool { kNo = false, kYes = true }; 37 enum class MipMapped : bool { kNo = false, kYes = true }; 38 enum class UsesGLFBO0 : bool { kNo = false, kYes = true }; 39 // This flag indicates if the surface is wrapping a raw Vulkan secondary command buffer. 40 enum class VulkanSecondaryCBCompatible : bool { kNo = false, kYes = true }; 41 SkSurfaceCharacterization()42 SkSurfaceCharacterization() 43 : fCacheMaxResourceBytes(0) 44 , fOrigin(kBottomLeft_GrSurfaceOrigin) 45 , fSampleCnt(0) 46 , fIsTextureable(Textureable::kYes) 47 , fIsMipMapped(MipMapped::kYes) 48 , fUsesGLFBO0(UsesGLFBO0::kNo) 49 , fVulkanSecondaryCBCompatible(VulkanSecondaryCBCompatible::kNo) 50 , fIsProtected(GrProtected::kNo) 51 , fSurfaceProps(0, kUnknown_SkPixelGeometry) { 52 } 53 54 SkSurfaceCharacterization(SkSurfaceCharacterization&&) = default; 55 SkSurfaceCharacterization& operator=(SkSurfaceCharacterization&&) = default; 56 57 SkSurfaceCharacterization(const SkSurfaceCharacterization&) = default; 58 SkSurfaceCharacterization& operator=(const SkSurfaceCharacterization& other) = default; 59 bool operator==(const SkSurfaceCharacterization& other) const; 60 bool operator!=(const SkSurfaceCharacterization& other) const { 61 return !(*this == other); 62 } 63 64 /* 65 * Return a new surface characterization with the only difference being a different width 66 * and height 67 */ 68 SkSurfaceCharacterization createResized(int width, int height) const; 69 70 /* 71 * Return a new surface characterization with only a replaced color space 72 */ 73 SkSurfaceCharacterization createColorSpace(sk_sp<SkColorSpace>) const; 74 75 /* 76 * Return a new surface characterization with the backend format replaced. A colorType 77 * must also be supplied to indicate the interpretation of the new format. 78 */ 79 SkSurfaceCharacterization createBackendFormat(SkColorType colorType, 80 const GrBackendFormat& backendFormat) const; 81 82 /* 83 * Return a new surface characterization with just a different use of FBO0 (in GL) 84 */ 85 SkSurfaceCharacterization createFBO0(bool usesGLFBO0) const; 86 contextInfo()87 GrContextThreadSafeProxy* contextInfo() const { return fContextInfo.get(); } refContextInfo()88 sk_sp<GrContextThreadSafeProxy> refContextInfo() const { return fContextInfo; } cacheMaxResourceBytes()89 size_t cacheMaxResourceBytes() const { return fCacheMaxResourceBytes; } 90 isValid()91 bool isValid() const { return kUnknown_SkColorType != fImageInfo.colorType(); } 92 imageInfo()93 const SkImageInfo& imageInfo() const { return fImageInfo; } backendFormat()94 const GrBackendFormat& backendFormat() const { return fBackendFormat; } origin()95 GrSurfaceOrigin origin() const { return fOrigin; } dimensions()96 SkISize dimensions() const { return fImageInfo.dimensions(); } width()97 int width() const { return fImageInfo.width(); } height()98 int height() const { return fImageInfo.height(); } colorType()99 SkColorType colorType() const { return fImageInfo.colorType(); } sampleCount()100 int sampleCount() const { return fSampleCnt; } isTextureable()101 bool isTextureable() const { return Textureable::kYes == fIsTextureable; } isMipMapped()102 bool isMipMapped() const { return MipMapped::kYes == fIsMipMapped; } usesGLFBO0()103 bool usesGLFBO0() const { return UsesGLFBO0::kYes == fUsesGLFBO0; } vulkanSecondaryCBCompatible()104 bool vulkanSecondaryCBCompatible() const { 105 return VulkanSecondaryCBCompatible::kYes == fVulkanSecondaryCBCompatible; 106 } isProtected()107 GrProtected isProtected() const { return fIsProtected; } colorSpace()108 SkColorSpace* colorSpace() const { return fImageInfo.colorSpace(); } refColorSpace()109 sk_sp<SkColorSpace> refColorSpace() const { return fImageInfo.refColorSpace(); } surfaceProps()110 const SkSurfaceProps& surfaceProps()const { return fSurfaceProps; } 111 112 // Is the provided backend texture compatible with this surface characterization? 113 bool isCompatible(const GrBackendTexture&) const; 114 115 private: 116 friend class SkSurface_Gpu; // for 'set' & 'config' 117 friend class GrVkSecondaryCBDrawContext; // for 'set' & 'config' 118 friend class GrContextThreadSafeProxy; // for private ctor 119 friend class SkDeferredDisplayListRecorder; // for 'config' 120 friend class SkSurface; // for 'config' 121 122 SkDEBUGCODE(void validate() const;) 123 SkSurfaceCharacterization(sk_sp<GrContextThreadSafeProxy> contextInfo,size_t cacheMaxResourceBytes,const SkImageInfo & ii,const GrBackendFormat & backendFormat,GrSurfaceOrigin origin,int sampleCnt,Textureable isTextureable,MipMapped isMipMapped,UsesGLFBO0 usesGLFBO0,VulkanSecondaryCBCompatible vulkanSecondaryCBCompatible,GrProtected isProtected,const SkSurfaceProps & surfaceProps)124 SkSurfaceCharacterization(sk_sp<GrContextThreadSafeProxy> contextInfo, 125 size_t cacheMaxResourceBytes, 126 const SkImageInfo& ii, 127 const GrBackendFormat& backendFormat, 128 GrSurfaceOrigin origin, 129 int sampleCnt, 130 Textureable isTextureable, 131 MipMapped isMipMapped, 132 UsesGLFBO0 usesGLFBO0, 133 VulkanSecondaryCBCompatible vulkanSecondaryCBCompatible, 134 GrProtected isProtected, 135 const SkSurfaceProps& surfaceProps) 136 : fContextInfo(std::move(contextInfo)) 137 , fCacheMaxResourceBytes(cacheMaxResourceBytes) 138 , fImageInfo(ii) 139 , fBackendFormat(backendFormat) 140 , fOrigin(origin) 141 , fSampleCnt(sampleCnt) 142 , fIsTextureable(isTextureable) 143 , fIsMipMapped(isMipMapped) 144 , fUsesGLFBO0(usesGLFBO0) 145 , fVulkanSecondaryCBCompatible(vulkanSecondaryCBCompatible) 146 , fIsProtected(isProtected) 147 , fSurfaceProps(surfaceProps) { 148 SkDEBUGCODE(this->validate()); 149 } 150 set(sk_sp<GrContextThreadSafeProxy> contextInfo,size_t cacheMaxResourceBytes,const SkImageInfo & ii,const GrBackendFormat & backendFormat,GrSurfaceOrigin origin,int sampleCnt,Textureable isTextureable,MipMapped isMipMapped,UsesGLFBO0 usesGLFBO0,VulkanSecondaryCBCompatible vulkanSecondaryCBCompatible,GrProtected isProtected,const SkSurfaceProps & surfaceProps)151 void set(sk_sp<GrContextThreadSafeProxy> contextInfo, 152 size_t cacheMaxResourceBytes, 153 const SkImageInfo& ii, 154 const GrBackendFormat& backendFormat, 155 GrSurfaceOrigin origin, 156 int sampleCnt, 157 Textureable isTextureable, 158 MipMapped isMipMapped, 159 UsesGLFBO0 usesGLFBO0, 160 VulkanSecondaryCBCompatible vulkanSecondaryCBCompatible, 161 GrProtected isProtected, 162 const SkSurfaceProps& surfaceProps) { 163 SkASSERT(MipMapped::kNo == isMipMapped || Textureable::kYes == isTextureable); 164 SkASSERT(Textureable::kNo == isTextureable || UsesGLFBO0::kNo == usesGLFBO0); 165 166 SkASSERT(VulkanSecondaryCBCompatible::kNo == vulkanSecondaryCBCompatible || 167 UsesGLFBO0::kNo == usesGLFBO0); 168 SkASSERT(Textureable::kNo == isTextureable || 169 VulkanSecondaryCBCompatible::kNo == vulkanSecondaryCBCompatible); 170 171 fContextInfo = contextInfo; 172 fCacheMaxResourceBytes = cacheMaxResourceBytes; 173 174 fImageInfo = ii; 175 fBackendFormat = backendFormat; 176 fOrigin = origin; 177 fSampleCnt = sampleCnt; 178 fIsTextureable = isTextureable; 179 fIsMipMapped = isMipMapped; 180 fUsesGLFBO0 = usesGLFBO0; 181 fVulkanSecondaryCBCompatible = vulkanSecondaryCBCompatible; 182 fIsProtected = isProtected; 183 fSurfaceProps = surfaceProps; 184 185 SkDEBUGCODE(this->validate()); 186 } 187 188 sk_sp<GrContextThreadSafeProxy> fContextInfo; 189 size_t fCacheMaxResourceBytes; 190 191 SkImageInfo fImageInfo; 192 GrBackendFormat fBackendFormat; 193 GrSurfaceOrigin fOrigin; 194 int fSampleCnt; 195 Textureable fIsTextureable; 196 MipMapped fIsMipMapped; 197 UsesGLFBO0 fUsesGLFBO0; 198 VulkanSecondaryCBCompatible fVulkanSecondaryCBCompatible; 199 GrProtected fIsProtected; 200 SkSurfaceProps fSurfaceProps; 201 }; 202 203 #else// !SK_SUPPORT_GPU 204 205 class SK_API SkSurfaceCharacterization { 206 public: SkSurfaceCharacterization()207 SkSurfaceCharacterization() : fSurfaceProps(0, kUnknown_SkPixelGeometry) { } 208 createResized(int width,int height)209 SkSurfaceCharacterization createResized(int width, int height) const { 210 return *this; 211 } 212 createColorSpace(sk_sp<SkColorSpace>)213 SkSurfaceCharacterization createColorSpace(sk_sp<SkColorSpace>) const { 214 return *this; 215 } 216 createBackendFormat(SkColorType,const GrBackendFormat &)217 SkSurfaceCharacterization createBackendFormat(SkColorType, const GrBackendFormat&) const { 218 return *this; 219 } 220 createFBO0(bool usesGLFBO0)221 SkSurfaceCharacterization createFBO0(bool usesGLFBO0) const { 222 return *this; 223 } 224 225 bool operator==(const SkSurfaceCharacterization& other) const { return false; } 226 bool operator!=(const SkSurfaceCharacterization& other) const { 227 return !(*this == other); 228 } 229 cacheMaxResourceBytes()230 size_t cacheMaxResourceBytes() const { return 0; } 231 isValid()232 bool isValid() const { return false; } 233 width()234 int width() const { return 0; } height()235 int height() const { return 0; } stencilCount()236 int stencilCount() const { return 0; } isTextureable()237 bool isTextureable() const { return false; } isMipMapped()238 bool isMipMapped() const { return false; } usesGLFBO0()239 bool usesGLFBO0() const { return false; } vulkanSecondaryCBCompatible()240 bool vulkanSecondaryCBCompatible() const { return false; } colorSpace()241 SkColorSpace* colorSpace() const { return nullptr; } refColorSpace()242 sk_sp<SkColorSpace> refColorSpace() const { return nullptr; } surfaceProps()243 const SkSurfaceProps& surfaceProps()const { return fSurfaceProps; } 244 245 private: 246 SkSurfaceProps fSurfaceProps; 247 }; 248 249 #endif 250 251 #endif 252