• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 
2 /*
3  * Copyright 2013 Google Inc.
4  *
5  * Use of this source code is governed by a BSD-style license that can be
6  * found in the LICENSE file.
7  */
8 #ifndef GrCaps_DEFINED
9 #define GrCaps_DEFINED
10 
11 #include "include/core/SkImageInfo.h"
12 #include "include/core/SkRefCnt.h"
13 #include "include/core/SkString.h"
14 #include "include/gpu/GrDriverBugWorkarounds.h"
15 #include "include/private/GrTypesPriv.h"
16 #include "src/gpu/GrBlend.h"
17 #include "src/gpu/GrShaderCaps.h"
18 #include "src/gpu/GrSurfaceProxy.h"
19 
20 class GrBackendFormat;
21 class GrBackendRenderTarget;
22 class GrBackendTexture;
23 struct GrContextOptions;
24 class GrRenderTargetProxy;
25 class GrSurface;
26 class SkJSONWriter;
27 
28 /**
29  * Represents the capabilities of a GrContext.
30  */
31 class GrCaps : public SkRefCnt {
32 public:
33     GrCaps(const GrContextOptions&);
34 
35     void dumpJSON(SkJSONWriter*) const;
36 
shaderCaps()37     const GrShaderCaps* shaderCaps() const { return fShaderCaps.get(); }
38 
npotTextureTileSupport()39     bool npotTextureTileSupport() const { return fNPOTTextureTileSupport; }
40     /** To avoid as-yet-unnecessary complexity we don't allow any partial support of MIP Maps (e.g.
41         only for POT textures) */
mipMapSupport()42     bool mipMapSupport() const { return fMipMapSupport; }
43 
44     /**
45      * Skia convention is that a device only has sRGB support if it supports sRGB formats for both
46      * textures and framebuffers.
47      */
srgbSupport()48     bool srgbSupport() const { return fSRGBSupport; }
49     /**
50      * Is there support for enabling/disabling sRGB writes for sRGB-capable color buffers?
51      */
srgbWriteControl()52     bool srgbWriteControl() const { return fSRGBWriteControl; }
gpuTracingSupport()53     bool gpuTracingSupport() const { return fGpuTracingSupport; }
oversizedStencilSupport()54     bool oversizedStencilSupport() const { return fOversizedStencilSupport; }
textureBarrierSupport()55     bool textureBarrierSupport() const { return fTextureBarrierSupport; }
sampleLocationsSupport()56     bool sampleLocationsSupport() const { return fSampleLocationsSupport; }
multisampleDisableSupport()57     bool multisampleDisableSupport() const { return fMultisampleDisableSupport; }
instanceAttribSupport()58     bool instanceAttribSupport() const { return fInstanceAttribSupport; }
mixedSamplesSupport()59     bool mixedSamplesSupport() const { return fMixedSamplesSupport; }
60     // This flag indicates that we never have to resolve MSAA. In practice, it means that we have
61     // an MSAA-render-to-texture extension: Any render target we create internally will use the
62     // extension, and any wrapped render target is the client's responsibility.
msaaResolvesAutomatically()63     bool msaaResolvesAutomatically() const { return fMSAAResolvesAutomatically; }
halfFloatVertexAttributeSupport()64     bool halfFloatVertexAttributeSupport() const { return fHalfFloatVertexAttributeSupport; }
65 
66     // Primitive restart functionality is core in ES 3.0, but using it will cause slowdowns on some
67     // systems. This cap is only set if primitive restart will improve performance.
usePrimitiveRestart()68     bool usePrimitiveRestart() const { return fUsePrimitiveRestart; }
69 
preferClientSideDynamicBuffers()70     bool preferClientSideDynamicBuffers() const { return fPreferClientSideDynamicBuffers; }
71 
72     // On tilers, an initial fullscreen clear is an OPTIMIZATION. It allows the hardware to
73     // initialize each tile with a constant value rather than loading each pixel from memory.
preferFullscreenClears()74     bool preferFullscreenClears() const { return fPreferFullscreenClears; }
75 
preferVRAMUseOverFlushes()76     bool preferVRAMUseOverFlushes() const { return fPreferVRAMUseOverFlushes; }
77 
preferTrianglesOverSampleMask()78     bool preferTrianglesOverSampleMask() const { return fPreferTrianglesOverSampleMask; }
79 
avoidStencilBuffers()80     bool avoidStencilBuffers() const { return fAvoidStencilBuffers; }
81 
avoidWritePixelsFastPath()82     bool avoidWritePixelsFastPath() const { return fAvoidWritePixelsFastPath; }
83 
84     /**
85      * Indicates the capabilities of the fixed function blend unit.
86      */
87     enum BlendEquationSupport {
88         kBasic_BlendEquationSupport,             //<! Support to select the operator that
89                                                  //   combines src and dst terms.
90         kAdvanced_BlendEquationSupport,          //<! Additional fixed function support for specific
91                                                  //   SVG/PDF blend modes. Requires blend barriers.
92         kAdvancedCoherent_BlendEquationSupport,  //<! Advanced blend equation support that does not
93                                                  //   require blend barriers, and permits overlap.
94 
95         kLast_BlendEquationSupport = kAdvancedCoherent_BlendEquationSupport
96     };
97 
blendEquationSupport()98     BlendEquationSupport blendEquationSupport() const { return fBlendEquationSupport; }
99 
advancedBlendEquationSupport()100     bool advancedBlendEquationSupport() const {
101         return fBlendEquationSupport >= kAdvanced_BlendEquationSupport;
102     }
103 
advancedCoherentBlendEquationSupport()104     bool advancedCoherentBlendEquationSupport() const {
105         return kAdvancedCoherent_BlendEquationSupport == fBlendEquationSupport;
106     }
107 
isAdvancedBlendEquationBlacklisted(GrBlendEquation equation)108     bool isAdvancedBlendEquationBlacklisted(GrBlendEquation equation) const {
109         SkASSERT(GrBlendEquationIsAdvanced(equation));
110         SkASSERT(this->advancedBlendEquationSupport());
111         return SkToBool(fAdvBlendEqBlacklist & (1 << equation));
112     }
113 
114     /**
115      * Indicates whether GPU->CPU memory mapping for GPU resources such as vertex buffers and
116      * textures allows partial mappings or full mappings.
117      */
118     enum MapFlags {
119         kNone_MapFlags      = 0x0,   //<! Cannot map the resource.
120 
121         kCanMap_MapFlag     = 0x1,   //<! The resource can be mapped. Must be set for any of
122                                      //   the other flags to have meaning.
123         kSubset_MapFlag     = 0x2,   //<! The resource can be partially mapped.
124         kAsyncRead_MapFlag  = 0x4,   //<! Are maps for reading asynchronous WRT GrGpuCommandBuffers
125                                      //   submitted to GrGpu.
126     };
127 
mapBufferFlags()128     uint32_t mapBufferFlags() const { return fMapBufferFlags; }
129 
130     // Scratch textures not being reused means that those scratch textures
131     // that we upload to (i.e., don't have a render target) will not be
132     // recycled in the texture cache. This is to prevent ghosting by drivers
133     // (in particular for deferred architectures).
reuseScratchTextures()134     bool reuseScratchTextures() const { return fReuseScratchTextures; }
reuseScratchBuffers()135     bool reuseScratchBuffers() const { return fReuseScratchBuffers; }
136 
137     /// maximum number of attribute values per vertex
maxVertexAttributes()138     int maxVertexAttributes() const { return fMaxVertexAttributes; }
139 
maxRenderTargetSize()140     int maxRenderTargetSize() const { return fMaxRenderTargetSize; }
141 
142     /** This is the largest render target size that can be used without incurring extra perfomance
143         cost. It is usually the max RT size, unless larger render targets are known to be slower. */
maxPreferredRenderTargetSize()144     int maxPreferredRenderTargetSize() const { return fMaxPreferredRenderTargetSize; }
145 
maxTextureSize()146     int maxTextureSize() const { return fMaxTextureSize; }
147 
148     /** This is the maximum tile size to use by GPU devices for rendering sw-backed images/bitmaps.
149         It is usually the max texture size, unless we're overriding it for testing. */
maxTileSize()150     int maxTileSize() const {
151         SkASSERT(fMaxTileSize <= fMaxTextureSize);
152         return fMaxTileSize;
153     }
154 
maxWindowRectangles()155     int maxWindowRectangles() const { return fMaxWindowRectangles; }
156 
157     // Returns whether mixed samples is supported for the given backend render target.
isWindowRectanglesSupportedForRT(const GrBackendRenderTarget & rt)158     bool isWindowRectanglesSupportedForRT(const GrBackendRenderTarget& rt) const {
159         return this->maxWindowRectangles() > 0 && this->onIsWindowRectanglesSupportedForRT(rt);
160     }
161 
162     virtual bool isFormatSRGB(const GrBackendFormat&) const = 0;
163     virtual bool isFormatCompressed(const GrBackendFormat&) const = 0;
164 
165     // TODO: Once we use the supportWritePixels call for uploads, we can remove this function and
166     // instead only have the version that takes a GrBackendFormat.
167     virtual bool isFormatTexturableAndUploadable(GrColorType, const GrBackendFormat&) const = 0;
168     // Can a texture be made with the GrBackendFormat, and then be bound and sampled in a shader.
169     virtual bool isFormatTexturable(const GrBackendFormat&) const = 0;
170 
171     // Returns whether a texture of the given format can be copied to a texture of the same format.
172     virtual bool isFormatCopyable(const GrBackendFormat&) const = 0;
173 
174     // Returns the maximum supported sample count for a format. 0 means the format is not renderable
175     // 1 means the format is renderable but doesn't support MSAA. This call only refers to the
176     // format itself. A caller should also confirm if the format is renderable with a given
177     // GrColorType by calling isFormatRenderable.
178     virtual int maxRenderTargetSampleCount(const GrBackendFormat&) const = 0;
179 
180     // Returns the number of samples to use when performing internal draws to the given config with
181     // MSAA or mixed samples. If 0, Ganesh should not attempt to use internal multisampling.
internalMultisampleCount(const GrBackendFormat & format)182     int internalMultisampleCount(const GrBackendFormat& format) const {
183         return SkTMin(fInternalMultisampleCount, this->maxRenderTargetSampleCount(format));
184     }
185 
186     virtual bool isFormatAsColorTypeRenderable(GrColorType ct, const GrBackendFormat& format,
187                                                int sampleCount = 1) const = 0;
188 
189     virtual bool isFormatRenderable(const GrBackendFormat& format, int sampleCount) const = 0;
190 
191     // Find a sample count greater than or equal to the requested count which is supported for a
192     // render target of the given format or 0 if no such sample count is supported. If the requested
193     // sample count is 1 then 1 will be returned if non-MSAA rendering is supported, otherwise 0.
194     // For historical reasons requestedCount==0 is handled identically to requestedCount==1.
195     virtual int getRenderTargetSampleCount(int requestedCount, const GrBackendFormat&) const = 0;
196 
197     /**
198      * Backends may have restrictions on what types of surfaces support GrGpu::writePixels().
199      * If this returns false then the caller should implement a fallback where a temporary texture
200      * is created, pixels are written to it, and then that is copied or drawn into the the surface.
201      */
202     bool surfaceSupportsWritePixels(const GrSurface*) const;
203 
204     /**
205      * Indicates whether surface supports GrGpu::readPixels, must be copied, or cannot be read.
206      */
207     enum class SurfaceReadPixelsSupport {
208         /** GrGpu::readPixels is supported by the surface. */
209         kSupported,
210         /**
211          * GrGpu::readPixels is not supported by this surface but this surface can be drawn
212          * or copied to a Ganesh-created GrTextureType::kTexture2D and then that surface will be
213          * readable.
214          */
215         kCopyToTexture2D,
216         /**
217          * Not supported
218          */
219         kUnsupported,
220     };
221     /**
222      * Backends may have restrictions on what types of surfaces support GrGpu::readPixels(). We may
223      * either be able to read directly from the surface, read from a copy of the surface, or not
224      * read at all.
225      */
226     virtual SurfaceReadPixelsSupport surfaceSupportsReadPixels(const GrSurface*) const = 0;
227 
228     struct SupportedWrite {
229         GrColorType fColorType;
230         // If the write is occurring using GrGpu::transferPixelsTo then this provides the
231         // minimum alignment of the offset into the transfer buffer.
232         size_t fOffsetAlignmentForTransferBuffer;
233     };
234 
235     /**
236      * Given a dst pixel config and a src color type what color type must the caller coax the
237      * the data into in order to use GrGpu::writePixels().
238      */
239     virtual SupportedWrite supportedWritePixelsColorType(GrColorType surfaceColorType,
240                                                          const GrBackendFormat& surfaceFormat,
241                                                          GrColorType srcColorType) const = 0;
242 
243     struct SupportedRead {
244         GrColorType fColorType;
245         // If the read is occurring using GrGpu::transferPixelsFrom then this provides the
246         // minimum alignment of the offset into the transfer buffer.
247         size_t fOffsetAlignmentForTransferBuffer;
248     };
249 
250     /**
251      * Given a src surface's color type and its backend format as well as a color type the caller
252      * would like read into, this provides a legal color type that the caller may pass to
253      * GrGpu::readPixels(). The returned color type may differ from the passed dstColorType, in
254      * which case the caller must convert the read pixel data (see GrConvertPixels). When converting
255      * to dstColorType the swizzle in the returned struct should be applied. The caller must check
256      * the returned color type for kUnknown.
257      */
258     SupportedRead supportedReadPixelsColorType(GrColorType srcColorType,
259                                                const GrBackendFormat& srcFormat,
260                                                GrColorType dstColorType) const;
261 
262     /**
263      * Do GrGpu::writePixels() and GrGpu::transferPixelsTo() support a src buffer where the row
264      * bytes is not equal to bpp * w?
265      */
writePixelsRowBytesSupport()266     bool writePixelsRowBytesSupport() const { return fWritePixelsRowBytesSupport; }
267     /**
268      * Does GrGpu::readPixels() support a dst buffer where the row bytes is not equal to bpp * w?
269      */
readPixelsRowBytesSupport()270     bool readPixelsRowBytesSupport() const { return fReadPixelsRowBytesSupport; }
271 
272     /** Are transfer buffers (to textures and from surfaces) supported? */
transferBufferSupport()273     bool transferBufferSupport() const { return fTransferBufferSupport; }
274 
suppressPrints()275     bool suppressPrints() const { return fSuppressPrints; }
276 
bufferMapThreshold()277     size_t bufferMapThreshold() const {
278         SkASSERT(fBufferMapThreshold >= 0);
279         return fBufferMapThreshold;
280     }
281 
282     /** True in environments that will issue errors if memory uploaded to buffers
283         is not initialized (even if not read by draw calls). */
mustClearUploadedBufferData()284     bool mustClearUploadedBufferData() const { return fMustClearUploadedBufferData; }
285 
286     /** For some environments, there is a performance or safety concern to not
287         initializing textures. For example, with WebGL and Firefox, there is a large
288         performance hit to not doing it.
289      */
shouldInitializeTextures()290     bool shouldInitializeTextures() const { return fShouldInitializeTextures; }
291 
292     /**
293      * When this is true it is required that all textures are initially cleared. However, the
294      * clearing must be implemented by passing level data to GrGpu::createTexture() rather than
295      * be implemeted by GrGpu::createTexture().
296      *
297      * TODO: Make this take GrBacknedFormat when canClearTextureOnCreation() does as well.
298      */
createTextureMustSpecifyAllLevels()299     bool createTextureMustSpecifyAllLevels() const {
300         return this->shouldInitializeTextures() && !this->canClearTextureOnCreation();
301     }
302 
303     /** Returns true if the given backend supports importing AHardwareBuffers via the
304      * GrAHardwarebufferImageGenerator. This will only ever be supported on Android devices with API
305      * level >= 26.
306      * */
supportsAHardwareBufferImages()307     bool supportsAHardwareBufferImages() const { return fSupportsAHardwareBufferImages; }
308 
wireframeMode()309     bool wireframeMode() const { return fWireframeMode; }
310 
311     /** Supports using GrFence. */
fenceSyncSupport()312     bool fenceSyncSupport() const { return fFenceSyncSupport; }
313 
314     /** Supports using GrSemaphore. */
semaphoreSupport()315     bool semaphoreSupport() const { return fSemaphoreSupport; }
316 
crossContextTextureSupport()317     bool crossContextTextureSupport() const { return fCrossContextTextureSupport; }
318     /**
319      * Returns whether or not we will be able to do a copy given the passed in params
320      */
321     bool canCopySurface(const GrSurfaceProxy* dst, const GrSurfaceProxy* src,
322                         const SkIRect& srcRect, const SkIPoint& dstPoint) const;
323 
dynamicStateArrayGeometryProcessorTextureSupport()324     bool dynamicStateArrayGeometryProcessorTextureSupport() const {
325         return fDynamicStateArrayGeometryProcessorTextureSupport;
326     }
327 
328     // Not all backends support clearing with a scissor test (e.g. Metal), this will always
329     // return true if performColorClearsAsDraws() returns true.
performPartialClearsAsDraws()330     bool performPartialClearsAsDraws() const {
331         return fPerformColorClearsAsDraws || fPerformPartialClearsAsDraws;
332     }
333 
334     // Many drivers have issues with color clears.
performColorClearsAsDraws()335     bool performColorClearsAsDraws() const { return fPerformColorClearsAsDraws; }
336 
337     /// Adreno 4xx devices experience an issue when there are a large number of stencil clip bit
338     /// clears. The minimal repro steps are not precisely known but drawing a rect with a stencil
339     /// op instead of using glClear seems to resolve the issue.
performStencilClearsAsDraws()340     bool performStencilClearsAsDraws() const { return fPerformStencilClearsAsDraws; }
341 
342     // Can we use coverage counting shortcuts to render paths? Coverage counting can cause artifacts
343     // along shared edges if care isn't taken to ensure both contours wind in the same direction.
allowCoverageCounting()344     bool allowCoverageCounting() const { return fAllowCoverageCounting; }
345 
346     // Should we disable the CCPR code due to a faulty driver?
driverBlacklistCCPR()347     bool driverBlacklistCCPR() const { return fDriverBlacklistCCPR; }
driverBlacklistMSAACCPR()348     bool driverBlacklistMSAACCPR() const { return fDriverBlacklistMSAACCPR; }
349 
350     /**
351      * This is used to try to ensure a successful copy a dst in order to perform shader-based
352      * blending.
353      *
354      * fRectsMustMatch will be set to true if the copy operation must ensure that the src and dest
355      * rects are identical.
356      *
357      * fMustCopyWholeSrc will be set to true if copy rect must equal src's bounds.
358      *
359      * Caller will detect cases when copy cannot succeed and try copy-as-draw as a fallback.
360      */
361     struct DstCopyRestrictions {
362         GrSurfaceProxy::RectsMustMatch fRectsMustMatch = GrSurfaceProxy::RectsMustMatch::kNo;
363         bool fMustCopyWholeSrc = false;
364     };
getDstCopyRestrictions(const GrRenderTargetProxy * src,GrColorType ct)365     virtual DstCopyRestrictions getDstCopyRestrictions(const GrRenderTargetProxy* src,
366                                                        GrColorType ct) const {
367         return {};
368     }
369 
370     bool validateSurfaceParams(const SkISize&, const GrBackendFormat&, GrPixelConfig,
371                                GrRenderable renderable, int renderTargetSampleCnt,
372                                GrMipMapped) const;
373 
areColorTypeAndFormatCompatible(GrColorType grCT,const GrBackendFormat & format)374     bool areColorTypeAndFormatCompatible(GrColorType grCT,
375                                          const GrBackendFormat& format) const {
376         if (GrColorType::kUnknown == grCT) {
377             return false;
378         }
379 
380         return this->onAreColorTypeAndFormatCompatible(grCT, format);
381     }
382 
383     // TODO: it seems like we could pass the full SkImageInfo and validate its colorSpace too
384     // Returns kUnknown if a valid config could not be determined.
getConfigFromBackendFormat(const GrBackendFormat & format,GrColorType grCT)385     GrPixelConfig getConfigFromBackendFormat(const GrBackendFormat& format,
386                                              GrColorType grCT) const {
387         if (GrColorType::kUnknown == grCT) {
388             return kUnknown_GrPixelConfig;
389         }
390 
391         return this->onGetConfigFromBackendFormat(format, grCT);
392     }
393 
394     /**
395      * Special method only for YUVA images. Returns a colortype that matches the backend format or
396      * kUnknown if a colortype could not be determined.
397      */
398     virtual GrColorType getYUVAColorTypeFromBackendFormat(const GrBackendFormat&,
399                                                           bool isAlphaChannel) const = 0;
400 
401     /** These are used when creating a new texture internally. */
402     GrBackendFormat getDefaultBackendFormat(GrColorType, GrRenderable) const;
403 
404     virtual GrBackendFormat getBackendFormatFromCompressionType(SkImage::CompressionType) const = 0;
405 
406     /**
407      * Used by implementation of shouldInitializeTextures(). Indicates whether GrGpu implements the
408      * clear in GrGpu::createTexture() or if false then the caller must provide cleared MIP level
409      * data or GrGpu::createTexture() will fail.
410      *
411      * TODO: Make this take a GrBackendFormat so that GL can make this faster for cases
412      * when the format is renderable and glTexClearImage is not available. Doing this
413      * is overly complicated until the GrPixelConfig/format mess is straightened out..
414      */
415     virtual bool canClearTextureOnCreation() const = 0;
416 
417     /**
418      * The CLAMP_TO_BORDER wrap mode for texture coordinates was added to desktop GL in 1.3, and
419      * GLES 3.2, but is also available in extensions. Vulkan and Metal always have support.
420      */
clampToBorderSupport()421     bool clampToBorderSupport() const { return fClampToBorderSupport; }
422 
423     /**
424      * Returns the GrSwizzle to use when sampling from a texture with the passed in GrBackendFormat
425      * and GrColorType.
426      */
427     virtual GrSwizzle getTextureSwizzle(const GrBackendFormat&, GrColorType) const = 0;
428 
429     /**
430      * Returns the GrSwizzle to use when outputting to a render target with the passed in
431      * GrBackendFormat and GrColorType.
432      */
433     virtual GrSwizzle getOutputSwizzle(const GrBackendFormat&, GrColorType) const = 0;
434 
workarounds()435     const GrDriverBugWorkarounds& workarounds() const { return fDriverBugWorkarounds; }
436 
437     /**
438      * Given a possibly generic GrPixelConfig and a backend format return a specific
439      * GrPixelConfig.
440      */
makeConfigSpecific(GrPixelConfig config,const GrBackendFormat & format)441     GrPixelConfig makeConfigSpecific(GrPixelConfig config, const GrBackendFormat& format) const {
442         auto ct = GrPixelConfigToColorType(config);
443         auto result = this->getConfigFromBackendFormat(format, ct);
444         SkASSERT(config == result || AreConfigsCompatible(config, result));
445         return result;
446     }
447 
448 #ifdef SK_DEBUG
449     // This is just a debugging entry point until we're weaned off of GrPixelConfig. It
450     // should be used to verify that the pixel config from user-level code (the genericConfig)
451     // is compatible with a pixel config we've computed from scratch (the specificConfig).
452     static bool AreConfigsCompatible(GrPixelConfig genericConfig, GrPixelConfig specificConfig);
453 #endif
454 
455 #if GR_TEST_UTILS
456     struct TestFormatColorTypeCombination {
457         GrColorType fColorType;
458         GrBackendFormat fFormat;
459     };
460 
461     virtual std::vector<TestFormatColorTypeCombination> getTestingCombinations() const = 0;
462 #endif
463 
464 protected:
465     /** Subclasses must call this at the end of their constructors in order to apply caps
466         overrides requested by the client. Note that overrides will only reduce the caps never
467         expand them. */
468     void applyOptionsOverrides(const GrContextOptions& options);
469 
470     sk_sp<GrShaderCaps> fShaderCaps;
471 
472     bool fNPOTTextureTileSupport                     : 1;
473     bool fMipMapSupport                              : 1;
474     bool fSRGBSupport                                : 1;
475     bool fSRGBWriteControl                           : 1;
476     bool fReuseScratchTextures                       : 1;
477     bool fReuseScratchBuffers                        : 1;
478     bool fGpuTracingSupport                          : 1;
479     bool fOversizedStencilSupport                    : 1;
480     bool fTextureBarrierSupport                      : 1;
481     bool fSampleLocationsSupport                     : 1;
482     bool fMultisampleDisableSupport                  : 1;
483     bool fInstanceAttribSupport                      : 1;
484     bool fMixedSamplesSupport                        : 1;
485     bool fMSAAResolvesAutomatically                  : 1;
486     bool fUsePrimitiveRestart                        : 1;
487     bool fPreferClientSideDynamicBuffers             : 1;
488     bool fPreferFullscreenClears                     : 1;
489     bool fMustClearUploadedBufferData                : 1;
490     bool fShouldInitializeTextures                   : 1;
491     bool fSupportsAHardwareBufferImages              : 1;
492     bool fHalfFloatVertexAttributeSupport            : 1;
493     bool fClampToBorderSupport                       : 1;
494     bool fPerformPartialClearsAsDraws                : 1;
495     bool fPerformColorClearsAsDraws                  : 1;
496     bool fPerformStencilClearsAsDraws                : 1;
497     bool fAllowCoverageCounting                      : 1;
498     bool fTransferBufferSupport                      : 1;
499     bool fWritePixelsRowBytesSupport                 : 1;
500     bool fReadPixelsRowBytesSupport                  : 1;
501 
502     // Driver workaround
503     bool fDriverBlacklistCCPR                        : 1;
504     bool fDriverBlacklistMSAACCPR                    : 1;
505     bool fAvoidStencilBuffers                        : 1;
506     bool fAvoidWritePixelsFastPath                   : 1;
507 
508     // ANGLE performance workaround
509     bool fPreferVRAMUseOverFlushes                   : 1;
510 
511     // On some platforms it's better to make more triangles than to use the sample mask (MSAA only).
512     bool fPreferTrianglesOverSampleMask              : 1;
513 
514     bool fFenceSyncSupport                           : 1;
515     bool fSemaphoreSupport                           : 1;
516 
517     // Requires fence sync support in GL.
518     bool fCrossContextTextureSupport                 : 1;
519 
520     // Not (yet) implemented in VK backend.
521     bool fDynamicStateArrayGeometryProcessorTextureSupport : 1;
522 
523     BlendEquationSupport fBlendEquationSupport;
524     uint32_t fAdvBlendEqBlacklist;
525     GR_STATIC_ASSERT(kLast_GrBlendEquation < 32);
526 
527     uint32_t fMapBufferFlags;
528     int fBufferMapThreshold;
529 
530     int fMaxRenderTargetSize;
531     int fMaxPreferredRenderTargetSize;
532     int fMaxVertexAttributes;
533     int fMaxTextureSize;
534     int fMaxTileSize;
535     int fMaxWindowRectangles;
536     int fInternalMultisampleCount;
537 
538     GrDriverBugWorkarounds fDriverBugWorkarounds;
539 
540 private:
onApplyOptionsOverrides(const GrContextOptions &)541     virtual void onApplyOptionsOverrides(const GrContextOptions&) {}
onDumpJSON(SkJSONWriter *)542     virtual void onDumpJSON(SkJSONWriter*) const {}
543     virtual bool onSurfaceSupportsWritePixels(const GrSurface*) const = 0;
544     virtual bool onCanCopySurface(const GrSurfaceProxy* dst, const GrSurfaceProxy* src,
545                                   const SkIRect& srcRect, const SkIPoint& dstPoint) const = 0;
546     virtual GrBackendFormat onGetDefaultBackendFormat(GrColorType, GrRenderable) const = 0;
547 
548     // Backends should implement this if they have any extra requirements for use of window
549     // rectangles for a specific GrBackendRenderTarget outside of basic support.
onIsWindowRectanglesSupportedForRT(const GrBackendRenderTarget &)550     virtual bool onIsWindowRectanglesSupportedForRT(const GrBackendRenderTarget&) const {
551         return true;
552     }
553 
554     virtual GrPixelConfig onGetConfigFromBackendFormat(const GrBackendFormat& format,
555                                                        GrColorType ct) const = 0;
556 
557     virtual bool onAreColorTypeAndFormatCompatible(GrColorType, const GrBackendFormat&) const = 0;
558 
559     virtual SupportedRead onSupportedReadPixelsColorType(GrColorType srcColorType,
560                                                          const GrBackendFormat& srcFormat,
561                                                          GrColorType dstColorType) const = 0;
562 
563 
564     bool fSuppressPrints : 1;
565     bool fWireframeMode  : 1;
566 
567     typedef SkRefCnt INHERITED;
568 };
569 
570 #endif
571