• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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