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