1 /* 2 * Copyright 2012 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 #include "GrGLCaps.h" 9 #include "GrContextOptions.h" 10 #include "GrGLContext.h" 11 #include "GrGLRenderTarget.h" 12 #include "GrGLTexture.h" 13 #include "GrShaderCaps.h" 14 #include "GrSurfaceProxyPriv.h" 15 #include "SkJSONWriter.h" 16 #include "SkTSearch.h" 17 #include "SkTSort.h" 18 19 GrGLCaps::GrGLCaps(const GrContextOptions& contextOptions, 20 const GrGLContextInfo& ctxInfo, 21 const GrGLInterface* glInterface) : INHERITED(contextOptions) { 22 fStandard = ctxInfo.standard(); 23 24 fStencilFormats.reset(); 25 fMSFBOType = kNone_MSFBOType; 26 fInvalidateFBType = kNone_InvalidateFBType; 27 fMapBufferType = kNone_MapBufferType; 28 fTransferBufferType = kNone_TransferBufferType; 29 fMaxFragmentUniformVectors = 0; 30 fUnpackRowLengthSupport = false; 31 fUnpackFlipYSupport = false; 32 fPackRowLengthSupport = false; 33 fPackFlipYSupport = false; 34 fTextureUsageSupport = false; 35 fAlpha8IsRenderable = false; 36 fImagingSupport = false; 37 fVertexArrayObjectSupport = false; 38 fDebugSupport = false; 39 fES2CompatibilitySupport = false; 40 fDrawIndirectSupport = false; 41 fMultiDrawIndirectSupport = false; 42 fBaseInstanceSupport = false; 43 fIsCoreProfile = false; 44 fBindFragDataLocationSupport = false; 45 fRectangleTextureSupport = false; 46 fTextureSwizzleSupport = false; 47 fRGBA8888PixelsOpsAreSlow = false; 48 fPartialFBOReadIsSlow = false; 49 fMipMapLevelAndLodControlSupport = false; 50 fRGBAToBGRAReadbackConversionsAreSlow = false; 51 fUseBufferDataNullHint = SkToBool(GR_GL_USE_BUFFER_DATA_NULL_HINT); 52 fDoManualMipmapping = false; 53 fSRGBDecodeDisableAffectsMipmaps = false; 54 fClearToBoundaryValuesIsBroken = false; 55 fClearTextureSupport = false; 56 fDrawArraysBaseVertexIsBroken = false; 57 fUseDrawToClearColor = false; 58 fUseDrawToClearStencilClip = false; 59 fDisallowTexSubImageForUnormConfigTexturesEverBoundToFBO = false; 60 fUseDrawInsteadOfAllRenderTargetWrites = false; 61 fRequiresCullFaceEnableDisableWhenDrawingLinesAfterNonLines = false; 62 fProgramBinarySupport = false; 63 64 fBlitFramebufferFlags = kNoSupport_BlitFramebufferFlag; 65 fMaxInstancesPerDrawArraysWithoutCrashing = 0; 66 67 fShaderCaps.reset(new GrShaderCaps(contextOptions)); 68 69 this->init(contextOptions, ctxInfo, glInterface); 70 } 71 72 void GrGLCaps::init(const GrContextOptions& contextOptions, 73 const GrGLContextInfo& ctxInfo, 74 const GrGLInterface* gli) { 75 GrGLStandard standard = ctxInfo.standard(); 76 GrGLVersion version = ctxInfo.version(); 77 78 if (kGLES_GrGLStandard == standard) { 79 GR_GL_GetIntegerv(gli, GR_GL_MAX_FRAGMENT_UNIFORM_VECTORS, 80 &fMaxFragmentUniformVectors); 81 } else { 82 SkASSERT(kGL_GrGLStandard == standard); 83 GrGLint max; 84 GR_GL_GetIntegerv(gli, GR_GL_MAX_FRAGMENT_UNIFORM_COMPONENTS, &max); 85 fMaxFragmentUniformVectors = max / 4; 86 if (version >= GR_GL_VER(3, 2)) { 87 GrGLint profileMask; 88 GR_GL_GetIntegerv(gli, GR_GL_CONTEXT_PROFILE_MASK, &profileMask); 89 fIsCoreProfile = SkToBool(profileMask & GR_GL_CONTEXT_CORE_PROFILE_BIT); 90 } 91 } 92 GR_GL_GetIntegerv(gli, GR_GL_MAX_VERTEX_ATTRIBS, &fMaxVertexAttributes); 93 94 if (kGL_GrGLStandard == standard) { 95 fUnpackRowLengthSupport = true; 96 fUnpackFlipYSupport = false; 97 fPackRowLengthSupport = true; 98 fPackFlipYSupport = false; 99 } else { 100 fUnpackRowLengthSupport = version >= GR_GL_VER(3,0) || 101 ctxInfo.hasExtension("GL_EXT_unpack_subimage"); 102 fUnpackFlipYSupport = ctxInfo.hasExtension("GL_CHROMIUM_flipy"); 103 fPackRowLengthSupport = version >= GR_GL_VER(3,0) || 104 ctxInfo.hasExtension("GL_NV_pack_subimage"); 105 fPackFlipYSupport = 106 ctxInfo.hasExtension("GL_ANGLE_pack_reverse_row_order"); 107 } 108 109 fTextureUsageSupport = (kGLES_GrGLStandard == standard) && 110 ctxInfo.hasExtension("GL_ANGLE_texture_usage"); 111 112 if (kGL_GrGLStandard == standard) { 113 fTextureBarrierSupport = version >= GR_GL_VER(4,5) || 114 ctxInfo.hasExtension("GL_ARB_texture_barrier") || 115 ctxInfo.hasExtension("GL_NV_texture_barrier"); 116 } else { 117 fTextureBarrierSupport = ctxInfo.hasExtension("GL_NV_texture_barrier"); 118 } 119 120 if (kGL_GrGLStandard == standard) { 121 fSampleLocationsSupport = version >= GR_GL_VER(3,2) || 122 ctxInfo.hasExtension("GL_ARB_texture_multisample"); 123 } else { 124 fSampleLocationsSupport = version >= GR_GL_VER(3,1); 125 } 126 127 fImagingSupport = kGL_GrGLStandard == standard && 128 ctxInfo.hasExtension("GL_ARB_imaging"); 129 130 if (((kGL_GrGLStandard == standard && version >= GR_GL_VER(4,3)) || 131 (kGLES_GrGLStandard == standard && version >= GR_GL_VER(3,0)) || 132 ctxInfo.hasExtension("GL_ARB_invalidate_subdata"))) { 133 fDiscardRenderTargetSupport = true; 134 fInvalidateFBType = kInvalidate_InvalidateFBType; 135 } else if (ctxInfo.hasExtension("GL_EXT_discard_framebuffer")) { 136 fDiscardRenderTargetSupport = true; 137 fInvalidateFBType = kDiscard_InvalidateFBType; 138 } 139 140 // For future reference on Desktop GL, GL_PRIMITIVE_RESTART_FIXED_INDEX appears in 4.3, and 141 // GL_PRIMITIVE_RESTART (where the client must call glPrimitiveRestartIndex) appears in 3.1. 142 if (kGLES_GrGLStandard == standard) { 143 // Primitive restart can cause a 3x slowdown on Adreno. Enable conservatively. 144 // TODO: Evaluate on PowerVR. 145 // FIXME: Primitive restart would likely be a win on iOS if we had an enum value for it. 146 if (kARM_GrGLVendor == ctxInfo.vendor()) { 147 fUsePrimitiveRestart = version >= GR_GL_VER(3,0); 148 } 149 } 150 151 if (kARM_GrGLVendor == ctxInfo.vendor() || 152 kImagination_GrGLVendor == ctxInfo.vendor() || 153 kQualcomm_GrGLVendor == ctxInfo.vendor() ) { 154 fPreferFullscreenClears = true; 155 } 156 157 if (kGL_GrGLStandard == standard) { 158 fVertexArrayObjectSupport = version >= GR_GL_VER(3, 0) || 159 ctxInfo.hasExtension("GL_ARB_vertex_array_object") || 160 ctxInfo.hasExtension("GL_APPLE_vertex_array_object"); 161 } else { 162 fVertexArrayObjectSupport = version >= GR_GL_VER(3, 0) || 163 ctxInfo.hasExtension("GL_OES_vertex_array_object"); 164 } 165 166 if (kGL_GrGLStandard == standard && version >= GR_GL_VER(4,3)) { 167 fDebugSupport = true; 168 } else { 169 fDebugSupport = ctxInfo.hasExtension("GL_KHR_debug"); 170 } 171 172 if (kGL_GrGLStandard == standard) { 173 fES2CompatibilitySupport = ctxInfo.hasExtension("GL_ARB_ES2_compatibility"); 174 } 175 else { 176 fES2CompatibilitySupport = true; 177 } 178 179 if (kGL_GrGLStandard == standard) { 180 fMultisampleDisableSupport = true; 181 } else { 182 fMultisampleDisableSupport = ctxInfo.hasExtension("GL_EXT_multisample_compatibility"); 183 } 184 185 if (kGL_GrGLStandard == standard) { 186 // 3.1 has draw_instanced but not instanced_arrays, for the time being we only care about 187 // instanced arrays, but we could make this more granular if we wanted 188 fInstanceAttribSupport = 189 version >= GR_GL_VER(3, 2) || 190 (ctxInfo.hasExtension("GL_ARB_draw_instanced") && 191 ctxInfo.hasExtension("GL_ARB_instanced_arrays")); 192 } else { 193 fInstanceAttribSupport = 194 version >= GR_GL_VER(3, 0) || 195 (ctxInfo.hasExtension("GL_EXT_draw_instanced") && 196 ctxInfo.hasExtension("GL_EXT_instanced_arrays")); 197 } 198 199 if (kGL_GrGLStandard == standard) { 200 if (version >= GR_GL_VER(3, 0)) { 201 fBindFragDataLocationSupport = true; 202 } 203 } else { 204 if (version >= GR_GL_VER(3, 0) && ctxInfo.hasExtension("GL_EXT_blend_func_extended")) { 205 fBindFragDataLocationSupport = true; 206 } 207 } 208 209 fBindUniformLocationSupport = ctxInfo.hasExtension("GL_CHROMIUM_bind_uniform_location"); 210 211 if (kGL_GrGLStandard == standard) { 212 if (version >= GR_GL_VER(3, 1) || ctxInfo.hasExtension("GL_ARB_texture_rectangle")) { 213 // We also require textureSize() support for rectangle 2D samplers which was added in 214 // GLSL 1.40. 215 if (ctxInfo.glslGeneration() >= k140_GrGLSLGeneration) { 216 fRectangleTextureSupport = true; 217 } 218 } 219 } else { 220 // Command buffer exposes this in GL ES context for Chromium reasons, 221 // but it should not be used. Also, at the time of writing command buffer 222 // lacks TexImage2D support and ANGLE lacks GL ES 3.0 support. 223 } 224 225 if (kGL_GrGLStandard == standard) { 226 if (version >= GR_GL_VER(3,3) || ctxInfo.hasExtension("GL_ARB_texture_swizzle")) { 227 fTextureSwizzleSupport = true; 228 } 229 } else { 230 if (version >= GR_GL_VER(3,0)) { 231 fTextureSwizzleSupport = true; 232 } 233 } 234 235 if (kGL_GrGLStandard == standard) { 236 fMipMapLevelAndLodControlSupport = true; 237 } else if (kGLES_GrGLStandard == standard) { 238 if (version >= GR_GL_VER(3,0)) { 239 fMipMapLevelAndLodControlSupport = true; 240 } 241 } 242 243 #ifdef SK_BUILD_FOR_WIN 244 // We're assuming that on Windows Chromium we're using ANGLE. 245 bool isANGLE = kANGLE_GrGLDriver == ctxInfo.driver() || 246 kChromium_GrGLDriver == ctxInfo.driver(); 247 // Angle has slow read/write pixel paths for 32bit RGBA (but fast for BGRA). 248 fRGBA8888PixelsOpsAreSlow = isANGLE; 249 // On DX9 ANGLE reading a partial FBO is slow. TODO: Check whether this is still true and 250 // check DX11 ANGLE. 251 fPartialFBOReadIsSlow = isANGLE; 252 #endif 253 254 bool isMESA = kMesa_GrGLDriver == ctxInfo.driver(); 255 bool isMAC = false; 256 #ifdef SK_BUILD_FOR_MAC 257 isMAC = true; 258 #endif 259 260 // Both mesa and mac have reduced performance if reading back an RGBA framebuffer as BGRA or 261 // vis-versa. 262 fRGBAToBGRAReadbackConversionsAreSlow = isMESA || isMAC; 263 264 if (GrContextOptions::Enable::kNo == contextOptions.fUseGLBufferDataNullHint) { 265 fUseBufferDataNullHint = false; 266 } else if (GrContextOptions::Enable::kYes == contextOptions.fUseGLBufferDataNullHint) { 267 fUseBufferDataNullHint = true; 268 } 269 270 if (kGL_GrGLStandard == standard) { 271 if (version >= GR_GL_VER(4,4) || ctxInfo.hasExtension("GL_ARB_clear_texture")) { 272 fClearTextureSupport = true; 273 } 274 } else if (ctxInfo.hasExtension("GL_EXT_clear_texture")) { 275 fClearTextureSupport = true; 276 } 277 278 /************************************************************************** 279 * GrShaderCaps fields 280 **************************************************************************/ 281 282 // This must be called after fCoreProfile is set on the GrGLCaps 283 this->initGLSL(ctxInfo, gli); 284 GrShaderCaps* shaderCaps = fShaderCaps.get(); 285 286 shaderCaps->fPathRenderingSupport = this->hasPathRenderingSupport(ctxInfo, gli); 287 #if GR_TEST_UTILS 288 if (contextOptions.fSuppressPathRendering) { 289 shaderCaps->fPathRenderingSupport = false; 290 } 291 #endif 292 293 // Enable supported shader-related caps 294 if (kGL_GrGLStandard == standard) { 295 shaderCaps->fDualSourceBlendingSupport = (ctxInfo.version() >= GR_GL_VER(3, 3) || 296 ctxInfo.hasExtension("GL_ARB_blend_func_extended")) && 297 GrGLSLSupportsNamedFragmentShaderOutputs(ctxInfo.glslGeneration()); 298 299 shaderCaps->fShaderDerivativeSupport = true; 300 301 // we don't support GL_ARB_geometry_shader4, just GL 3.2+ GS 302 shaderCaps->fGeometryShaderSupport = ctxInfo.version() >= GR_GL_VER(3, 2) && 303 ctxInfo.glslGeneration() >= k150_GrGLSLGeneration; 304 if (shaderCaps->fGeometryShaderSupport) { 305 if (ctxInfo.glslGeneration() >= k400_GrGLSLGeneration) { 306 shaderCaps->fGSInvocationsSupport = true; 307 } else if (ctxInfo.hasExtension("GL_ARB_gpu_shader5")) { 308 shaderCaps->fGSInvocationsSupport = true; 309 shaderCaps->fGSInvocationsExtensionString = "GL_ARB_gpu_shader5"; 310 } 311 } 312 313 shaderCaps->fIntegerSupport = ctxInfo.version() >= GR_GL_VER(3, 0) && 314 ctxInfo.glslGeneration() >= k130_GrGLSLGeneration; 315 } else { 316 shaderCaps->fDualSourceBlendingSupport = ctxInfo.hasExtension("GL_EXT_blend_func_extended"); 317 318 shaderCaps->fShaderDerivativeSupport = ctxInfo.version() >= GR_GL_VER(3, 0) || 319 ctxInfo.hasExtension("GL_OES_standard_derivatives"); 320 321 // Mali has support for geometry shaders, but in practice with ccpr they are slower than the 322 // backup impl that only uses vertex shaders. 323 if (kARM_GrGLVendor != ctxInfo.vendor()) { 324 if (ctxInfo.version() >= GR_GL_VER(3,2)) { 325 shaderCaps->fGeometryShaderSupport = true; 326 } else if (ctxInfo.hasExtension("GL_EXT_geometry_shader")) { 327 shaderCaps->fGeometryShaderSupport = true; 328 shaderCaps->fGeometryShaderExtensionString = "GL_EXT_geometry_shader"; 329 } 330 shaderCaps->fGSInvocationsSupport = shaderCaps->fGeometryShaderSupport; 331 } 332 333 shaderCaps->fIntegerSupport = ctxInfo.version() >= GR_GL_VER(3, 0) && 334 ctxInfo.glslGeneration() >= k330_GrGLSLGeneration; // We use this value for GLSL ES 3.0. 335 } 336 337 // Protect ourselves against tracking huge amounts of texture state. 338 static const uint8_t kMaxSaneSamplers = 32; 339 GrGLint maxSamplers; 340 GR_GL_GetIntegerv(gli, GR_GL_MAX_VERTEX_TEXTURE_IMAGE_UNITS, &maxSamplers); 341 shaderCaps->fMaxVertexSamplers = SkTMin<GrGLint>(kMaxSaneSamplers, maxSamplers); 342 if (shaderCaps->fGeometryShaderSupport) { 343 GR_GL_GetIntegerv(gli, GR_GL_MAX_GEOMETRY_TEXTURE_IMAGE_UNITS, &maxSamplers); 344 shaderCaps->fMaxGeometrySamplers = SkTMin<GrGLint>(kMaxSaneSamplers, maxSamplers); 345 } 346 GR_GL_GetIntegerv(gli, GR_GL_MAX_TEXTURE_IMAGE_UNITS, &maxSamplers); 347 shaderCaps->fMaxFragmentSamplers = SkTMin<GrGLint>(kMaxSaneSamplers, maxSamplers); 348 GR_GL_GetIntegerv(gli, GR_GL_MAX_COMBINED_TEXTURE_IMAGE_UNITS, &maxSamplers); 349 shaderCaps->fMaxCombinedSamplers = SkTMin<GrGLint>(kMaxSaneSamplers, maxSamplers); 350 351 // This is all *very* approximate. 352 switch (ctxInfo.vendor()) { 353 case kNVIDIA_GrGLVendor: 354 // We've seen a range from 100 x 100 (TegraK1, GTX660) up to 300 x 300 (GTX 1070) 355 // but it doesn't clearly align with Pascal vs Maxwell vs Kepler. 356 fShaderCaps->fDisableImageMultitexturingDstRectAreaThreshold = 150 * 150; 357 break; 358 case kImagination_GrGLVendor: 359 // Two PowerVR Rogues, Nexus Player and Chromebook Cb5-312T (PowerVR GX6250), show that 360 // it is always a win to use multitexturing. 361 if (kPowerVRRogue_GrGLRenderer == ctxInfo.renderer()) { 362 fShaderCaps->fDisableImageMultitexturingDstRectAreaThreshold = 363 std::numeric_limits<size_t>::max(); 364 } 365 break; 366 case kATI_GrGLVendor: 367 // So far no AMD GPU shows a performance difference. A tie goes to disabling 368 // multitexturing for simplicity's sake. 369 fShaderCaps->fDisableImageMultitexturingDstRectAreaThreshold = 0; 370 break; 371 default: 372 break; 373 } 374 375 // SGX and Mali GPUs that are based on a tiled-deferred architecture that have trouble with 376 // frequently changing VBOs. We've measured a performance increase using non-VBO vertex 377 // data for dynamic content on these GPUs. Perhaps we should read the renderer string and 378 // limit this decision to specific GPU families rather than basing it on the vendor alone. 379 if (!GR_GL_MUST_USE_VBO && 380 !fIsCoreProfile && 381 (kARM_GrGLVendor == ctxInfo.vendor() || 382 kImagination_GrGLVendor == ctxInfo.vendor() || 383 kQualcomm_GrGLVendor == ctxInfo.vendor())) { 384 fPreferClientSideDynamicBuffers = true; 385 } 386 387 if (!contextOptions.fAvoidStencilBuffers) { 388 // To reduce surface area, if we avoid stencil buffers, we also disable MSAA. 389 this->initFSAASupport(contextOptions, ctxInfo, gli); 390 this->initStencilSupport(ctxInfo); 391 } 392 393 // Setup blit framebuffer 394 if (kGL_GrGLStandard != ctxInfo.standard()) { 395 if (ctxInfo.version() >= GR_GL_VER(3, 0)) { 396 fBlitFramebufferFlags = kNoFormatConversionForMSAASrc_BlitFramebufferFlag | 397 kNoMSAADst_BlitFramebufferFlag | 398 kRectsMustMatchForMSAASrc_BlitFramebufferFlag; 399 } else if (ctxInfo.hasExtension("GL_CHROMIUM_framebuffer_multisample") || 400 ctxInfo.hasExtension("GL_ANGLE_framebuffer_blit")) { 401 // The CHROMIUM extension uses the ANGLE version of glBlitFramebuffer and includes its 402 // limitations. 403 fBlitFramebufferFlags = kNoScalingOrMirroring_BlitFramebufferFlag | 404 kResolveMustBeFull_BlitFrambufferFlag | 405 kNoMSAADst_BlitFramebufferFlag | 406 kNoFormatConversion_BlitFramebufferFlag | 407 kRectsMustMatchForMSAASrc_BlitFramebufferFlag; 408 } 409 } else { 410 if (fUsesMixedSamples || 411 ctxInfo.version() >= GR_GL_VER(3,0) || 412 ctxInfo.hasExtension("GL_ARB_framebuffer_object") || 413 ctxInfo.hasExtension("GL_EXT_framebuffer_blit")) { 414 fBlitFramebufferFlags = 0; 415 } 416 } 417 418 this->initBlendEqationSupport(ctxInfo); 419 420 if (kGL_GrGLStandard == standard) { 421 fMapBufferFlags = kCanMap_MapFlag; // we require VBO support and the desktop VBO 422 // extension includes glMapBuffer. 423 if (version >= GR_GL_VER(3, 0) || ctxInfo.hasExtension("GL_ARB_map_buffer_range")) { 424 fMapBufferFlags |= kSubset_MapFlag; 425 fMapBufferType = kMapBufferRange_MapBufferType; 426 } else { 427 fMapBufferType = kMapBuffer_MapBufferType; 428 } 429 } else { 430 // Unextended GLES2 doesn't have any buffer mapping. 431 fMapBufferFlags = kNone_MapBufferType; 432 if (ctxInfo.hasExtension("GL_CHROMIUM_map_sub")) { 433 fMapBufferFlags = kCanMap_MapFlag | kSubset_MapFlag; 434 fMapBufferType = kChromium_MapBufferType; 435 } else if (version >= GR_GL_VER(3, 0) || ctxInfo.hasExtension("GL_EXT_map_buffer_range")) { 436 fMapBufferFlags = kCanMap_MapFlag | kSubset_MapFlag; 437 fMapBufferType = kMapBufferRange_MapBufferType; 438 } else if (ctxInfo.hasExtension("GL_OES_mapbuffer")) { 439 fMapBufferFlags = kCanMap_MapFlag; 440 fMapBufferType = kMapBuffer_MapBufferType; 441 } 442 } 443 444 if (kGL_GrGLStandard == standard) { 445 if (version >= GR_GL_VER(3, 0) || ctxInfo.hasExtension("GL_ARB_pixel_buffer_object")) { 446 fTransferBufferType = kPBO_TransferBufferType; 447 } 448 } else { 449 if (version >= GR_GL_VER(3, 0) || 450 (ctxInfo.hasExtension("GL_NV_pixel_buffer_object") && 451 // GL_EXT_unpack_subimage needed to support subtexture rectangles 452 ctxInfo.hasExtension("GL_EXT_unpack_subimage"))) { 453 fTransferBufferType = kPBO_TransferBufferType; 454 // TODO: get transfer buffers working in Chrome 455 // } else if (ctxInfo.hasExtension("GL_CHROMIUM_pixel_transfer_buffer_object")) { 456 // fTransferBufferType = kChromium_TransferBufferType; 457 } 458 } 459 460 // On many GPUs, map memory is very expensive, so we effectively disable it here by setting the 461 // threshold to the maximum unless the client gives us a hint that map memory is cheap. 462 if (fBufferMapThreshold < 0) { 463 #if 0 464 // We think mapping on Chromium will be cheaper once we know ahead of time how much space 465 // we will use for all GrMeshDrawOps. Right now we might wind up mapping a large buffer and 466 // using a small subset. 467 fBufferMapThreshold = kChromium_GrGLDriver == ctxInfo.driver() ? 0 : SK_MaxS32; 468 #else 469 fBufferMapThreshold = SK_MaxS32; 470 #endif 471 } 472 473 if (kGL_GrGLStandard == standard) { 474 fNPOTTextureTileSupport = true; 475 fMipMapSupport = true; 476 } else { 477 // Unextended ES2 supports NPOT textures with clamp_to_edge and non-mip filters only 478 // ES3 has no limitations. 479 fNPOTTextureTileSupport = ctxInfo.version() >= GR_GL_VER(3,0) || 480 ctxInfo.hasExtension("GL_OES_texture_npot"); 481 // ES2 supports MIP mapping for POT textures but our caps don't allow for limited MIP 482 // support. The OES extension or ES 3.0 allow for MIPS on NPOT textures. So, apparently, 483 // does the undocumented GL_IMG_texture_npot extension. This extension does not seem to 484 // to alllow arbitrary wrap modes, however. 485 fMipMapSupport = fNPOTTextureTileSupport || ctxInfo.hasExtension("GL_IMG_texture_npot"); 486 } 487 488 GR_GL_GetIntegerv(gli, GR_GL_MAX_TEXTURE_SIZE, &fMaxTextureSize); 489 GR_GL_GetIntegerv(gli, GR_GL_MAX_RENDERBUFFER_SIZE, &fMaxRenderTargetSize); 490 // Our render targets are always created with textures as the color 491 // attachment, hence this min: 492 fMaxRenderTargetSize = SkTMin(fMaxTextureSize, fMaxRenderTargetSize); 493 fMaxPreferredRenderTargetSize = fMaxRenderTargetSize; 494 495 if (kARM_GrGLVendor == ctxInfo.vendor()) { 496 // On Mali G71, RT's above 4k have been observed to incur a performance cost. 497 fMaxPreferredRenderTargetSize = SkTMin(4096, fMaxPreferredRenderTargetSize); 498 } 499 500 fGpuTracingSupport = ctxInfo.hasExtension("GL_EXT_debug_marker"); 501 502 // Disable scratch texture reuse on Mali and Adreno devices 503 fReuseScratchTextures = kARM_GrGLVendor != ctxInfo.vendor(); 504 505 #if 0 506 fReuseScratchBuffers = kARM_GrGLVendor != ctxInfo.vendor() && 507 kQualcomm_GrGLVendor != ctxInfo.vendor(); 508 #endif 509 510 if (ctxInfo.hasExtension("GL_EXT_window_rectangles")) { 511 GR_GL_GetIntegerv(gli, GR_GL_MAX_WINDOW_RECTANGLES, &fMaxWindowRectangles); 512 } 513 514 #ifdef SK_BUILD_FOR_WIN 515 // On ANGLE deferring flushes can lead to GPU starvation 516 fPreferVRAMUseOverFlushes = !isANGLE; 517 #endif 518 519 if (kChromium_GrGLDriver == ctxInfo.driver()) { 520 fMustClearUploadedBufferData = true; 521 } 522 523 if (kGL_GrGLStandard == standard) { 524 // ARB allows mixed size FBO attachments, EXT does not. 525 if (ctxInfo.version() >= GR_GL_VER(3, 0) || 526 ctxInfo.hasExtension("GL_ARB_framebuffer_object")) { 527 fOversizedStencilSupport = true; 528 } else { 529 SkASSERT(ctxInfo.hasExtension("GL_EXT_framebuffer_object")); 530 } 531 } else { 532 // ES 3.0 supports mixed size FBO attachments, 2.0 does not. 533 fOversizedStencilSupport = ctxInfo.version() >= GR_GL_VER(3, 0); 534 } 535 536 if (kGL_GrGLStandard == standard) { 537 fDrawIndirectSupport = version >= GR_GL_VER(4,0) || 538 ctxInfo.hasExtension("GL_ARB_draw_indirect"); 539 fBaseInstanceSupport = version >= GR_GL_VER(4,2); 540 fMultiDrawIndirectSupport = version >= GR_GL_VER(4,3) || 541 (fDrawIndirectSupport && 542 !fBaseInstanceSupport && // The ARB extension has no base inst. 543 ctxInfo.hasExtension("GL_ARB_multi_draw_indirect")); 544 fDrawRangeElementsSupport = version >= GR_GL_VER(2,0); 545 } else { 546 fDrawIndirectSupport = version >= GR_GL_VER(3,1); 547 fMultiDrawIndirectSupport = fDrawIndirectSupport && 548 ctxInfo.hasExtension("GL_EXT_multi_draw_indirect"); 549 fBaseInstanceSupport = fDrawIndirectSupport && 550 ctxInfo.hasExtension("GL_EXT_base_instance"); 551 fDrawRangeElementsSupport = version >= GR_GL_VER(3,0); 552 } 553 554 if (kGL_GrGLStandard == standard) { 555 if ((version >= GR_GL_VER(4, 0) || ctxInfo.hasExtension("GL_ARB_sample_shading"))) { 556 fSampleShadingSupport = true; 557 } 558 } else if (ctxInfo.hasExtension("GL_OES_sample_shading")) { 559 fSampleShadingSupport = true; 560 } 561 562 // TODO: support CHROMIUM_sync_point and maybe KHR_fence_sync 563 if (kGL_GrGLStandard == standard) { 564 if (version >= GR_GL_VER(3, 2) || ctxInfo.hasExtension("GL_ARB_sync")) { 565 fFenceSyncSupport = true; 566 } 567 } else if (version >= GR_GL_VER(3, 0) || ctxInfo.hasExtension("GL_APPLE_sync")) { 568 fFenceSyncSupport = true; 569 } 570 571 // Safely moving textures between contexts requires fences. 572 fCrossContextTextureSupport = fFenceSyncSupport; 573 574 fSRGBDecodeDisableSupport = ctxInfo.hasExtension("GL_EXT_texture_sRGB_decode"); 575 576 fSRGBDecodeDisableAffectsMipmaps = fSRGBDecodeDisableSupport && 577 kChromium_GrGLDriver != ctxInfo.driver(); 578 579 if (kGL_GrGLStandard == standard) { 580 if (version >= GR_GL_VER(4, 1)) { 581 fProgramBinarySupport = true; 582 } 583 } else if (version >= GR_GL_VER(3, 0)) { 584 fProgramBinarySupport = true; 585 } 586 if (fProgramBinarySupport) { 587 GrGLint count; 588 GR_GL_GetIntegerv(gli, GR_GL_NUM_SHADER_BINARY_FORMATS, &count); 589 fProgramBinarySupport = count > 0; 590 } 591 592 // Requires fTextureRedSupport, fTextureSwizzleSupport, msaa support, ES compatibility have 593 // already been detected. 594 this->initConfigTable(contextOptions, ctxInfo, gli, shaderCaps); 595 596 if (!contextOptions.fDisableDriverCorrectnessWorkarounds) { 597 this->applyDriverCorrectnessWorkarounds(ctxInfo, contextOptions, shaderCaps); 598 } 599 600 this->applyOptionsOverrides(contextOptions); 601 shaderCaps->applyOptionsOverrides(contextOptions); 602 603 // For now these two are equivalent but we could have dst read in shader via some other method. 604 shaderCaps->fDstReadInShaderSupport = shaderCaps->fFBFetchSupport; 605 } 606 607 const char* get_glsl_version_decl_string(GrGLStandard standard, GrGLSLGeneration generation, 608 bool isCoreProfile) { 609 switch (generation) { 610 case k110_GrGLSLGeneration: 611 if (kGLES_GrGLStandard == standard) { 612 // ES2s shader language is based on version 1.20 but is version 613 // 1.00 of the ES language. 614 return "#version 100\n"; 615 } else { 616 SkASSERT(kGL_GrGLStandard == standard); 617 return "#version 110\n"; 618 } 619 case k130_GrGLSLGeneration: 620 SkASSERT(kGL_GrGLStandard == standard); 621 return "#version 130\n"; 622 case k140_GrGLSLGeneration: 623 SkASSERT(kGL_GrGLStandard == standard); 624 return "#version 140\n"; 625 case k150_GrGLSLGeneration: 626 SkASSERT(kGL_GrGLStandard == standard); 627 if (isCoreProfile) { 628 return "#version 150\n"; 629 } else { 630 return "#version 150 compatibility\n"; 631 } 632 case k330_GrGLSLGeneration: 633 if (kGLES_GrGLStandard == standard) { 634 return "#version 300 es\n"; 635 } else { 636 SkASSERT(kGL_GrGLStandard == standard); 637 if (isCoreProfile) { 638 return "#version 330\n"; 639 } else { 640 return "#version 330 compatibility\n"; 641 } 642 } 643 case k400_GrGLSLGeneration: 644 SkASSERT(kGL_GrGLStandard == standard); 645 if (isCoreProfile) { 646 return "#version 400\n"; 647 } else { 648 return "#version 400 compatibility\n"; 649 } 650 case k420_GrGLSLGeneration: 651 SkASSERT(kGL_GrGLStandard == standard); 652 if (isCoreProfile) { 653 return "#version 420\n"; 654 } 655 else { 656 return "#version 420 compatibility\n"; 657 } 658 case k310es_GrGLSLGeneration: 659 SkASSERT(kGLES_GrGLStandard == standard); 660 return "#version 310 es\n"; 661 case k320es_GrGLSLGeneration: 662 SkASSERT(kGLES_GrGLStandard == standard); 663 return "#version 320 es\n"; 664 } 665 return "<no version>"; 666 } 667 668 bool is_float_fp32(const GrGLContextInfo& ctxInfo, const GrGLInterface* gli, GrGLenum precision) { 669 if (kGLES_GrGLStandard != ctxInfo.standard() && 670 ctxInfo.version() < GR_GL_VER(4,1) && 671 !ctxInfo.hasExtension("GL_ARB_ES2_compatibility")) { 672 // We're on a desktop GL that doesn't have precision info. Assume they're all 32bit float. 673 return true; 674 } 675 // glGetShaderPrecisionFormat doesn't accept GL_GEOMETRY_SHADER as a shader type. Hopefully the 676 // geometry shaders don't have lower precision than vertex and fragment. 677 for (GrGLenum shader : {GR_GL_FRAGMENT_SHADER, GR_GL_VERTEX_SHADER}) { 678 GrGLint range[2]; 679 GrGLint bits; 680 GR_GL_GetShaderPrecisionFormat(gli, shader, precision, range, &bits); 681 if (range[0] < 127 || range[1] < 127 || bits < 23) { 682 return false; 683 } 684 } 685 return true; 686 } 687 688 void GrGLCaps::initGLSL(const GrGLContextInfo& ctxInfo, const GrGLInterface* gli) { 689 GrGLStandard standard = ctxInfo.standard(); 690 GrGLVersion version = ctxInfo.version(); 691 692 /************************************************************************** 693 * Caps specific to GrShaderCaps 694 **************************************************************************/ 695 696 GrShaderCaps* shaderCaps = fShaderCaps.get(); 697 shaderCaps->fGLSLGeneration = ctxInfo.glslGeneration(); 698 if (kGLES_GrGLStandard == standard) { 699 if (ctxInfo.hasExtension("GL_EXT_shader_framebuffer_fetch")) { 700 shaderCaps->fFBFetchNeedsCustomOutput = (version >= GR_GL_VER(3, 0)); 701 shaderCaps->fFBFetchSupport = true; 702 shaderCaps->fFBFetchColorName = "gl_LastFragData[0]"; 703 shaderCaps->fFBFetchExtensionString = "GL_EXT_shader_framebuffer_fetch"; 704 } 705 else if (ctxInfo.hasExtension("GL_NV_shader_framebuffer_fetch")) { 706 // Actually, we haven't seen an ES3.0 device with this extension yet, so we don't know 707 shaderCaps->fFBFetchNeedsCustomOutput = false; 708 shaderCaps->fFBFetchSupport = true; 709 shaderCaps->fFBFetchColorName = "gl_LastFragData[0]"; 710 shaderCaps->fFBFetchExtensionString = "GL_NV_shader_framebuffer_fetch"; 711 } 712 else if (ctxInfo.hasExtension("GL_ARM_shader_framebuffer_fetch")) { 713 // The arm extension also requires an additional flag which we will set onResetContext 714 shaderCaps->fFBFetchNeedsCustomOutput = false; 715 shaderCaps->fFBFetchSupport = true; 716 shaderCaps->fFBFetchColorName = "gl_LastFragColorARM"; 717 shaderCaps->fFBFetchExtensionString = "GL_ARM_shader_framebuffer_fetch"; 718 } 719 shaderCaps->fUsesPrecisionModifiers = true; 720 } 721 722 if (kGL_GrGLStandard == standard) { 723 shaderCaps->fFlatInterpolationSupport = ctxInfo.glslGeneration() >= k130_GrGLSLGeneration; 724 } else { 725 shaderCaps->fFlatInterpolationSupport = 726 ctxInfo.glslGeneration() >= k330_GrGLSLGeneration; // This is the value for GLSL ES 3.0. 727 } 728 // Flat interpolation appears to be slow on Qualcomm GPUs (tested Adreno 405 and 530). 729 shaderCaps->fPreferFlatInterpolation = shaderCaps->fFlatInterpolationSupport && 730 kQualcomm_GrGLVendor != ctxInfo.vendor(); 731 if (kGL_GrGLStandard == standard) { 732 shaderCaps->fNoPerspectiveInterpolationSupport = 733 ctxInfo.glslGeneration() >= k130_GrGLSLGeneration; 734 } else { 735 if (ctxInfo.hasExtension("GL_NV_shader_noperspective_interpolation")) { 736 shaderCaps->fNoPerspectiveInterpolationSupport = true; 737 shaderCaps->fNoPerspectiveInterpolationExtensionString = 738 "GL_NV_shader_noperspective_interpolation"; 739 } 740 } 741 742 shaderCaps->fVersionDeclString = get_glsl_version_decl_string(standard, 743 shaderCaps->fGLSLGeneration, 744 fIsCoreProfile); 745 746 if (kGLES_GrGLStandard == standard && k110_GrGLSLGeneration == shaderCaps->fGLSLGeneration) { 747 shaderCaps->fShaderDerivativeExtensionString = "GL_OES_standard_derivatives"; 748 } 749 750 // Frag Coords Convention support is not part of ES 751 if (kGLES_GrGLStandard != standard && 752 (ctxInfo.glslGeneration() >= k150_GrGLSLGeneration || 753 ctxInfo.hasExtension("GL_ARB_fragment_coord_conventions"))) { 754 shaderCaps->fFragCoordConventionsExtensionString = "GL_ARB_fragment_coord_conventions"; 755 } 756 757 if (kGLES_GrGLStandard == standard) { 758 shaderCaps->fSecondaryOutputExtensionString = "GL_EXT_blend_func_extended"; 759 } 760 761 if (ctxInfo.hasExtension("GL_OES_EGL_image_external")) { 762 if (ctxInfo.glslGeneration() == k110_GrGLSLGeneration) { 763 shaderCaps->fExternalTextureSupport = true; 764 } else if (ctxInfo.hasExtension("GL_OES_EGL_image_external_essl3") || 765 ctxInfo.hasExtension("OES_EGL_image_external_essl3")) { 766 // At least one driver has been found that has this extension without the "GL_" prefix. 767 shaderCaps->fExternalTextureSupport = true; 768 } 769 } 770 771 if (shaderCaps->fExternalTextureSupport) { 772 if (ctxInfo.glslGeneration() == k110_GrGLSLGeneration) { 773 shaderCaps->fExternalTextureExtensionString = "GL_OES_EGL_image_external"; 774 } else { 775 shaderCaps->fExternalTextureExtensionString = "GL_OES_EGL_image_external_essl3"; 776 } 777 } 778 779 if (kGL_GrGLStandard == standard) { 780 shaderCaps->fTexelFetchSupport = ctxInfo.glslGeneration() >= k130_GrGLSLGeneration; 781 } else { 782 shaderCaps->fTexelFetchSupport = 783 ctxInfo.glslGeneration() >= k330_GrGLSLGeneration; // We use this value for GLSL ES 3.0. 784 } 785 786 if (shaderCaps->fTexelFetchSupport) { 787 if (kGL_GrGLStandard == standard) { 788 shaderCaps->fTexelBufferSupport = ctxInfo.version() >= GR_GL_VER(3, 1) && 789 ctxInfo.glslGeneration() >= k330_GrGLSLGeneration; 790 } else { 791 if (ctxInfo.version() >= GR_GL_VER(3, 2) && 792 ctxInfo.glslGeneration() >= k320es_GrGLSLGeneration) { 793 shaderCaps->fTexelBufferSupport = true; 794 } else if (ctxInfo.hasExtension("GL_OES_texture_buffer")) { 795 shaderCaps->fTexelBufferSupport = true; 796 shaderCaps->fTexelBufferExtensionString = "GL_OES_texture_buffer"; 797 } else if (ctxInfo.hasExtension("GL_EXT_texture_buffer")) { 798 shaderCaps->fTexelBufferSupport = true; 799 shaderCaps->fTexelBufferExtensionString = "GL_EXT_texture_buffer"; 800 } 801 } 802 } 803 804 if (kGL_GrGLStandard == standard) { 805 shaderCaps->fVertexIDSupport = true; 806 } else { 807 // Desktop GLSL 3.30 == ES GLSL 3.00. 808 shaderCaps->fVertexIDSupport = ctxInfo.glslGeneration() >= k330_GrGLSLGeneration; 809 } 810 811 shaderCaps->fFloatIs32Bits = is_float_fp32(ctxInfo, gli, GR_GL_HIGH_FLOAT); 812 shaderCaps->fHalfIs32Bits = is_float_fp32(ctxInfo, gli, GR_GL_MEDIUM_FLOAT); 813 } 814 815 bool GrGLCaps::hasPathRenderingSupport(const GrGLContextInfo& ctxInfo, const GrGLInterface* gli) { 816 bool hasChromiumPathRendering = ctxInfo.hasExtension("GL_CHROMIUM_path_rendering"); 817 818 if (!(ctxInfo.hasExtension("GL_NV_path_rendering") || hasChromiumPathRendering)) { 819 return false; 820 } 821 822 if (kGL_GrGLStandard == ctxInfo.standard()) { 823 if (ctxInfo.version() < GR_GL_VER(4, 3) && 824 !ctxInfo.hasExtension("GL_ARB_program_interface_query")) { 825 return false; 826 } 827 } else { 828 if (!hasChromiumPathRendering && 829 ctxInfo.version() < GR_GL_VER(3, 1)) { 830 return false; 831 } 832 } 833 // We only support v1.3+ of GL_NV_path_rendering which allows us to 834 // set individual fragment inputs with ProgramPathFragmentInputGen. The API 835 // additions are detected by checking the existence of the function. 836 // We also use *Then* functions that not all drivers might have. Check 837 // them for consistency. 838 if (!gli->fFunctions.fStencilThenCoverFillPath || 839 !gli->fFunctions.fStencilThenCoverStrokePath || 840 !gli->fFunctions.fStencilThenCoverFillPathInstanced || 841 !gli->fFunctions.fStencilThenCoverStrokePathInstanced || 842 !gli->fFunctions.fProgramPathFragmentInputGen) { 843 return false; 844 } 845 return true; 846 } 847 848 bool GrGLCaps::readPixelsSupported(GrPixelConfig surfaceConfig, 849 GrPixelConfig readConfig, 850 std::function<void (GrGLenum, GrGLint*)> getIntegerv, 851 std::function<bool ()> bindRenderTarget, 852 std::function<void ()> unbindRenderTarget) const { 853 // If it's not possible to even have a color attachment of surfaceConfig then read pixels is 854 // not supported regardless of readConfig. 855 if (!this->canConfigBeFBOColorAttachment(surfaceConfig)) { 856 return false; 857 } 858 859 GrGLenum readFormat; 860 GrGLenum readType; 861 if (!this->getReadPixelsFormat(surfaceConfig, readConfig, &readFormat, &readType)) { 862 return false; 863 } 864 865 if (kGL_GrGLStandard == fStandard) { 866 // Some OpenGL implementations allow GL_ALPHA as a format to glReadPixels. However, 867 // the manual (https://www.opengl.org/sdk/docs/man/) says only these formats are allowed: 868 // GL_STENCIL_INDEX, GL_DEPTH_COMPONENT, GL_DEPTH_STENCIL, GL_RED, GL_GREEN, GL_BLUE, 869 // GL_RGB, GL_BGR, GL_RGBA, and GL_BGRA. We check for the subset that we would use. 870 // The manual does not seem to fully match the spec as the spec allows integer formats 871 // when the bound color buffer is an integer buffer. It doesn't specify which integer 872 // formats are allowed, so perhaps all of them are. We only use GL_RGBA_INTEGER currently. 873 if (readFormat != GR_GL_RED && readFormat != GR_GL_RG && readFormat != GR_GL_RGB && 874 readFormat != GR_GL_RGBA && readFormat != GR_GL_BGRA && 875 readFormat != GR_GL_RGBA_INTEGER) { 876 return false; 877 } 878 // There is also a set of allowed types, but all the types we use are in the set: 879 // GL_UNSIGNED_BYTE, GL_BYTE, GL_UNSIGNED_SHORT, GL_SHORT, GL_UNSIGNED_INT, GL_INT, 880 // GL_HALF_FLOAT, GL_FLOAT, GL_UNSIGNED_BYTE_3_3_2, GL_UNSIGNED_BYTE_2_3_3_REV, 881 // GL_UNSIGNED_SHORT_5_6_5, GL_UNSIGNED_SHORT_5_6_5_REV, GL_UNSIGNED_SHORT_4_4_4_4, 882 // GL_UNSIGNED_SHORT_4_4_4_4_REV, GL_UNSIGNED_SHORT_5_5_5_1, GL_UNSIGNED_SHORT_1_5_5_5_REV, 883 // GL_UNSIGNED_INT_8_8_8_8, GL_UNSIGNED_INT_8_8_8_8_REV,GL_UNSIGNED_INT_10_10_10_2, 884 // GL_UNSIGNED_INT_2_10_10_10_REV, GL_UNSIGNED_INT_24_8, GL_UNSIGNED_INT_10F_11F_11F_REV, 885 // GL_UNSIGNED_INT_5_9_9_9_REV, or GL_FLOAT_32_UNSIGNED_INT_24_8_REV. 886 return true; 887 } 888 889 // See Section 16.1.2 in the ES 3.2 specification. 890 switch (fConfigTable[surfaceConfig].fFormatType) { 891 case kNormalizedFixedPoint_FormatType: 892 if (GR_GL_RGBA == readFormat && GR_GL_UNSIGNED_BYTE == readType) { 893 return true; 894 } 895 break; 896 case kInteger_FormatType: 897 if (GR_GL_RGBA_INTEGER == readFormat && GR_GL_INT == readType) { 898 return true; 899 } 900 break; 901 case kFloat_FormatType: 902 if (GR_GL_RGBA == readFormat && GR_GL_FLOAT == readType) { 903 return true; 904 } 905 break; 906 } 907 908 if (0 == fConfigTable[surfaceConfig].fSecondReadPixelsFormat.fFormat) { 909 ReadPixelsFormat* rpFormat = 910 const_cast<ReadPixelsFormat*>(&fConfigTable[surfaceConfig].fSecondReadPixelsFormat); 911 GrGLint format = 0, type = 0; 912 if (!bindRenderTarget()) { 913 return false; 914 } 915 getIntegerv(GR_GL_IMPLEMENTATION_COLOR_READ_FORMAT, &format); 916 getIntegerv(GR_GL_IMPLEMENTATION_COLOR_READ_TYPE, &type); 917 rpFormat->fFormat = format; 918 rpFormat->fType = type; 919 unbindRenderTarget(); 920 } 921 922 return fConfigTable[surfaceConfig].fSecondReadPixelsFormat.fFormat == readFormat && 923 fConfigTable[surfaceConfig].fSecondReadPixelsFormat.fType == readType; 924 } 925 926 void GrGLCaps::initFSAASupport(const GrContextOptions& contextOptions, const GrGLContextInfo& ctxInfo, 927 const GrGLInterface* gli) { 928 // We need dual source blending and the ability to disable multisample in order to support mixed 929 // samples in every corner case. We only use mixed samples if the stencil-and-cover path 930 // renderer is available and enabled; no other path renderers support this feature. 931 if (fMultisampleDisableSupport && 932 this->shaderCaps()->dualSourceBlendingSupport() && 933 this->shaderCaps()->pathRenderingSupport() 934 #if GR_TEST_UTILS 935 && (contextOptions.fGpuPathRenderers & GpuPathRenderers::kStencilAndCover) 936 #endif 937 ) { 938 fUsesMixedSamples = ctxInfo.hasExtension("GL_NV_framebuffer_mixed_samples") || 939 ctxInfo.hasExtension("GL_CHROMIUM_framebuffer_mixed_samples"); 940 } 941 942 if (kGL_GrGLStandard != ctxInfo.standard()) { 943 if (ctxInfo.version() >= GR_GL_VER(3,0) && 944 ctxInfo.renderer() != kGalliumLLVM_GrGLRenderer) { 945 // The gallium llvmpipe renderer for es3.0 does not have textureRed support even though 946 // it is part of the spec. Thus alpha8 will not be renderable for those devices. 947 fAlpha8IsRenderable = true; 948 } 949 // We prefer the EXT/IMG extension over ES3 MSAA because we've observed 950 // ES3 driver bugs on at least one device with a tiled GPU (N10). 951 if (ctxInfo.hasExtension("GL_EXT_multisampled_render_to_texture")) { 952 fMSFBOType = kES_EXT_MsToTexture_MSFBOType; 953 } else if (ctxInfo.hasExtension("GL_IMG_multisampled_render_to_texture")) { 954 fMSFBOType = kES_IMG_MsToTexture_MSFBOType; 955 } else if (fUsesMixedSamples) { 956 fMSFBOType = kMixedSamples_MSFBOType; 957 } else if (ctxInfo.version() >= GR_GL_VER(3,0)) { 958 fMSFBOType = kStandard_MSFBOType; 959 } else if (ctxInfo.hasExtension("GL_CHROMIUM_framebuffer_multisample")) { 960 fMSFBOType = kStandard_MSFBOType; 961 } else if (ctxInfo.hasExtension("GL_ANGLE_framebuffer_multisample")) { 962 fMSFBOType = kStandard_MSFBOType; 963 } else if (ctxInfo.hasExtension("GL_APPLE_framebuffer_multisample")) { 964 fMSFBOType = kES_Apple_MSFBOType; 965 } 966 } else { 967 if (fUsesMixedSamples) { 968 fMSFBOType = kMixedSamples_MSFBOType; 969 } else if (ctxInfo.version() >= GR_GL_VER(3,0) || 970 ctxInfo.hasExtension("GL_ARB_framebuffer_object")) { 971 972 fMSFBOType = kStandard_MSFBOType; 973 if (!fIsCoreProfile && ctxInfo.renderer() != kOSMesa_GrGLRenderer) { 974 // Core profile removes ALPHA8 support. 975 // OpenGL 3.0+ (and GL_ARB_framebuffer_object) supports ALPHA8 as renderable. 976 // However, osmesa fails if it is used even when GL_ARB_framebuffer_object is 977 // present. 978 fAlpha8IsRenderable = true; 979 } 980 } else if (ctxInfo.hasExtension("GL_EXT_framebuffer_multisample") && 981 ctxInfo.hasExtension("GL_EXT_framebuffer_blit")) { 982 fMSFBOType = kStandard_MSFBOType; 983 } 984 } 985 986 // We disable MSAA across the board for Intel GPUs for performance reasons. 987 if (kIntel_GrGLVendor == ctxInfo.vendor()) { 988 fMSFBOType = kNone_MSFBOType; 989 } 990 991 // We only have a use for raster multisample if there is coverage modulation from mixed samples. 992 if (fUsesMixedSamples && ctxInfo.hasExtension("GL_EXT_raster_multisample")) { 993 GR_GL_GetIntegerv(gli, GR_GL_MAX_RASTER_SAMPLES, &fMaxRasterSamples); 994 } 995 } 996 997 void GrGLCaps::initBlendEqationSupport(const GrGLContextInfo& ctxInfo) { 998 GrShaderCaps* shaderCaps = static_cast<GrShaderCaps*>(fShaderCaps.get()); 999 1000 bool layoutQualifierSupport = false; 1001 if ((kGL_GrGLStandard == fStandard && shaderCaps->generation() >= k140_GrGLSLGeneration) || 1002 (kGLES_GrGLStandard == fStandard && shaderCaps->generation() >= k330_GrGLSLGeneration)) { 1003 layoutQualifierSupport = true; 1004 } 1005 1006 if (ctxInfo.hasExtension("GL_NV_blend_equation_advanced_coherent")) { 1007 fBlendEquationSupport = kAdvancedCoherent_BlendEquationSupport; 1008 shaderCaps->fAdvBlendEqInteraction = GrShaderCaps::kAutomatic_AdvBlendEqInteraction; 1009 } else if (ctxInfo.hasExtension("GL_KHR_blend_equation_advanced_coherent") && 1010 layoutQualifierSupport) { 1011 fBlendEquationSupport = kAdvancedCoherent_BlendEquationSupport; 1012 shaderCaps->fAdvBlendEqInteraction = GrShaderCaps::kGeneralEnable_AdvBlendEqInteraction; 1013 } else if (ctxInfo.hasExtension("GL_NV_blend_equation_advanced")) { 1014 fBlendEquationSupport = kAdvanced_BlendEquationSupport; 1015 shaderCaps->fAdvBlendEqInteraction = GrShaderCaps::kAutomatic_AdvBlendEqInteraction; 1016 } else if (ctxInfo.hasExtension("GL_KHR_blend_equation_advanced") && layoutQualifierSupport) { 1017 fBlendEquationSupport = kAdvanced_BlendEquationSupport; 1018 shaderCaps->fAdvBlendEqInteraction = GrShaderCaps::kGeneralEnable_AdvBlendEqInteraction; 1019 // TODO: Use kSpecificEnables_AdvBlendEqInteraction if "blend_support_all_equations" is 1020 // slow on a particular platform. 1021 } 1022 } 1023 1024 namespace { 1025 const GrGLuint kUnknownBitCount = GrGLStencilAttachment::kUnknownBitCount; 1026 } 1027 1028 void GrGLCaps::initStencilSupport(const GrGLContextInfo& ctxInfo) { 1029 1030 // Build up list of legal stencil formats (though perhaps not supported on 1031 // the particular gpu/driver) from most preferred to least. 1032 1033 // these consts are in order of most preferred to least preferred 1034 // we don't bother with GL_STENCIL_INDEX1 or GL_DEPTH32F_STENCIL8 1035 1036 static const StencilFormat 1037 // internal Format stencil bits total bits packed? 1038 gS8 = {GR_GL_STENCIL_INDEX8, 8, 8, false}, 1039 gS16 = {GR_GL_STENCIL_INDEX16, 16, 16, false}, 1040 gD24S8 = {GR_GL_DEPTH24_STENCIL8, 8, 32, true }, 1041 gS4 = {GR_GL_STENCIL_INDEX4, 4, 4, false}, 1042 // gS = {GR_GL_STENCIL_INDEX, kUnknownBitCount, kUnknownBitCount, false}, 1043 gDS = {GR_GL_DEPTH_STENCIL, kUnknownBitCount, kUnknownBitCount, true }; 1044 1045 if (kGL_GrGLStandard == ctxInfo.standard()) { 1046 bool supportsPackedDS = 1047 ctxInfo.version() >= GR_GL_VER(3,0) || 1048 ctxInfo.hasExtension("GL_EXT_packed_depth_stencil") || 1049 ctxInfo.hasExtension("GL_ARB_framebuffer_object"); 1050 1051 // S1 thru S16 formats are in GL 3.0+, EXT_FBO, and ARB_FBO since we 1052 // require FBO support we can expect these are legal formats and don't 1053 // check. These also all support the unsized GL_STENCIL_INDEX. 1054 fStencilFormats.push_back() = gS8; 1055 fStencilFormats.push_back() = gS16; 1056 if (supportsPackedDS) { 1057 fStencilFormats.push_back() = gD24S8; 1058 } 1059 fStencilFormats.push_back() = gS4; 1060 if (supportsPackedDS) { 1061 fStencilFormats.push_back() = gDS; 1062 } 1063 } else { 1064 // ES2 has STENCIL_INDEX8 without extensions but requires extensions 1065 // for other formats. 1066 // ES doesn't support using the unsized format. 1067 1068 fStencilFormats.push_back() = gS8; 1069 //fStencilFormats.push_back() = gS16; 1070 if (ctxInfo.version() >= GR_GL_VER(3,0) || 1071 ctxInfo.hasExtension("GL_OES_packed_depth_stencil")) { 1072 fStencilFormats.push_back() = gD24S8; 1073 } 1074 if (ctxInfo.hasExtension("GL_OES_stencil4")) { 1075 fStencilFormats.push_back() = gS4; 1076 } 1077 } 1078 } 1079 1080 void GrGLCaps::onDumpJSON(SkJSONWriter* writer) const { 1081 1082 // We are called by the base class, which has already called beginObject(). We choose to nest 1083 // all of our caps information in a named sub-object. 1084 writer->beginObject("GL caps"); 1085 1086 writer->beginArray("Stencil Formats"); 1087 1088 for (int i = 0; i < fStencilFormats.count(); ++i) { 1089 writer->beginObject(nullptr, false); 1090 writer->appendS32("stencil bits", fStencilFormats[i].fStencilBits); 1091 writer->appendS32("total bits", fStencilFormats[i].fTotalBits); 1092 writer->endObject(); 1093 } 1094 1095 writer->endArray(); 1096 1097 static const char* kMSFBOExtStr[] = { 1098 "None", 1099 "Standard", 1100 "Apple", 1101 "IMG MS To Texture", 1102 "EXT MS To Texture", 1103 "MixedSamples", 1104 }; 1105 GR_STATIC_ASSERT(0 == kNone_MSFBOType); 1106 GR_STATIC_ASSERT(1 == kStandard_MSFBOType); 1107 GR_STATIC_ASSERT(2 == kES_Apple_MSFBOType); 1108 GR_STATIC_ASSERT(3 == kES_IMG_MsToTexture_MSFBOType); 1109 GR_STATIC_ASSERT(4 == kES_EXT_MsToTexture_MSFBOType); 1110 GR_STATIC_ASSERT(5 == kMixedSamples_MSFBOType); 1111 GR_STATIC_ASSERT(SK_ARRAY_COUNT(kMSFBOExtStr) == kLast_MSFBOType + 1); 1112 1113 static const char* kInvalidateFBTypeStr[] = { 1114 "None", 1115 "Discard", 1116 "Invalidate", 1117 }; 1118 GR_STATIC_ASSERT(0 == kNone_InvalidateFBType); 1119 GR_STATIC_ASSERT(1 == kDiscard_InvalidateFBType); 1120 GR_STATIC_ASSERT(2 == kInvalidate_InvalidateFBType); 1121 GR_STATIC_ASSERT(SK_ARRAY_COUNT(kInvalidateFBTypeStr) == kLast_InvalidateFBType + 1); 1122 1123 static const char* kMapBufferTypeStr[] = { 1124 "None", 1125 "MapBuffer", 1126 "MapBufferRange", 1127 "Chromium", 1128 }; 1129 GR_STATIC_ASSERT(0 == kNone_MapBufferType); 1130 GR_STATIC_ASSERT(1 == kMapBuffer_MapBufferType); 1131 GR_STATIC_ASSERT(2 == kMapBufferRange_MapBufferType); 1132 GR_STATIC_ASSERT(3 == kChromium_MapBufferType); 1133 GR_STATIC_ASSERT(SK_ARRAY_COUNT(kMapBufferTypeStr) == kLast_MapBufferType + 1); 1134 1135 writer->appendBool("Core Profile", fIsCoreProfile); 1136 writer->appendString("MSAA Type", kMSFBOExtStr[fMSFBOType]); 1137 writer->appendString("Invalidate FB Type", kInvalidateFBTypeStr[fInvalidateFBType]); 1138 writer->appendString("Map Buffer Type", kMapBufferTypeStr[fMapBufferType]); 1139 writer->appendS32("Max FS Uniform Vectors", fMaxFragmentUniformVectors); 1140 writer->appendBool("Unpack Row length support", fUnpackRowLengthSupport); 1141 writer->appendBool("Unpack Flip Y support", fUnpackFlipYSupport); 1142 writer->appendBool("Pack Row length support", fPackRowLengthSupport); 1143 writer->appendBool("Pack Flip Y support", fPackFlipYSupport); 1144 1145 writer->appendBool("Texture Usage support", fTextureUsageSupport); 1146 writer->appendBool("Alpha8 is renderable", fAlpha8IsRenderable); 1147 writer->appendBool("GL_ARB_imaging support", fImagingSupport); 1148 writer->appendBool("Vertex array object support", fVertexArrayObjectSupport); 1149 writer->appendBool("Debug support", fDebugSupport); 1150 writer->appendBool("Draw indirect support", fDrawIndirectSupport); 1151 writer->appendBool("Multi draw indirect support", fMultiDrawIndirectSupport); 1152 writer->appendBool("Base instance support", fBaseInstanceSupport); 1153 writer->appendBool("RGBA 8888 pixel ops are slow", fRGBA8888PixelsOpsAreSlow); 1154 writer->appendBool("Partial FBO read is slow", fPartialFBOReadIsSlow); 1155 writer->appendBool("Bind uniform location support", fBindUniformLocationSupport); 1156 writer->appendBool("Rectangle texture support", fRectangleTextureSupport); 1157 writer->appendBool("Texture swizzle support", fTextureSwizzleSupport); 1158 writer->appendBool("BGRA to RGBA readback conversions are slow", 1159 fRGBAToBGRAReadbackConversionsAreSlow); 1160 writer->appendBool("Use buffer data null hint", fUseBufferDataNullHint); 1161 writer->appendBool("Draw To clear color", fUseDrawToClearColor); 1162 writer->appendBool("Draw To clear stencil clip", fUseDrawToClearStencilClip); 1163 writer->appendBool("Intermediate texture for partial updates of unorm textures ever bound to FBOs", 1164 fDisallowTexSubImageForUnormConfigTexturesEverBoundToFBO); 1165 writer->appendBool("Intermediate texture for all updates of textures bound to FBOs", 1166 fUseDrawInsteadOfAllRenderTargetWrites); 1167 writer->appendBool("Max instances per glDrawArraysInstanced without crashing (or zero)", 1168 fMaxInstancesPerDrawArraysWithoutCrashing); 1169 1170 writer->beginArray("configs"); 1171 1172 for (int i = 0; i < kGrPixelConfigCnt; ++i) { 1173 writer->beginObject(nullptr, false); 1174 writer->appendHexU32("flags", fConfigTable[i].fFlags); 1175 writer->appendHexU32("b_internal", fConfigTable[i].fFormats.fBaseInternalFormat); 1176 writer->appendHexU32("s_internal", fConfigTable[i].fFormats.fSizedInternalFormat); 1177 writer->appendHexU32("e_format", 1178 fConfigTable[i].fFormats.fExternalFormat[kOther_ExternalFormatUsage]); 1179 writer->appendHexU32( 1180 "e_format_teximage", 1181 fConfigTable[i].fFormats.fExternalFormat[kTexImage_ExternalFormatUsage]); 1182 writer->appendHexU32("e_type", fConfigTable[i].fFormats.fExternalType); 1183 writer->appendHexU32("i_for_teximage", fConfigTable[i].fFormats.fInternalFormatTexImage); 1184 writer->appendHexU32("i_for_renderbuffer", 1185 fConfigTable[i].fFormats.fInternalFormatRenderbuffer); 1186 writer->endObject(); 1187 } 1188 1189 writer->endArray(); 1190 writer->endObject(); 1191 } 1192 1193 bool GrGLCaps::bgraIsInternalFormat() const { 1194 return fConfigTable[kBGRA_8888_GrPixelConfig].fFormats.fBaseInternalFormat == GR_GL_BGRA; 1195 } 1196 1197 bool GrGLCaps::getTexImageFormats(GrPixelConfig surfaceConfig, GrPixelConfig externalConfig, 1198 GrGLenum* internalFormat, GrGLenum* externalFormat, 1199 GrGLenum* externalType) const { 1200 if (!this->getExternalFormat(surfaceConfig, externalConfig, kTexImage_ExternalFormatUsage, 1201 externalFormat, externalType)) { 1202 return false; 1203 } 1204 *internalFormat = fConfigTable[surfaceConfig].fFormats.fInternalFormatTexImage; 1205 return true; 1206 } 1207 1208 bool GrGLCaps::getReadPixelsFormat(GrPixelConfig surfaceConfig, GrPixelConfig externalConfig, 1209 GrGLenum* externalFormat, GrGLenum* externalType) const { 1210 if (!this->getExternalFormat(surfaceConfig, externalConfig, kOther_ExternalFormatUsage, 1211 externalFormat, externalType)) { 1212 return false; 1213 } 1214 return true; 1215 } 1216 1217 bool GrGLCaps::getRenderbufferFormat(GrPixelConfig config, GrGLenum* internalFormat) const { 1218 *internalFormat = fConfigTable[config].fFormats.fInternalFormatRenderbuffer; 1219 return true; 1220 } 1221 1222 bool GrGLCaps::getExternalFormat(GrPixelConfig surfaceConfig, GrPixelConfig memoryConfig, 1223 ExternalFormatUsage usage, GrGLenum* externalFormat, 1224 GrGLenum* externalType) const { 1225 SkASSERT(externalFormat && externalType); 1226 1227 bool surfaceIsAlphaOnly = GrPixelConfigIsAlphaOnly(surfaceConfig); 1228 bool memoryIsAlphaOnly = GrPixelConfigIsAlphaOnly(memoryConfig); 1229 1230 // We don't currently support moving RGBA data into and out of ALPHA surfaces. It could be 1231 // made to work in many cases using glPixelStore and what not but is not needed currently. 1232 if (surfaceIsAlphaOnly && !memoryIsAlphaOnly) { 1233 return false; 1234 } 1235 1236 *externalFormat = fConfigTable[memoryConfig].fFormats.fExternalFormat[usage]; 1237 *externalType = fConfigTable[memoryConfig].fFormats.fExternalType; 1238 1239 // When GL_RED is supported as a texture format, our alpha-only textures are stored using 1240 // GL_RED and we swizzle in order to map all components to 'r'. However, in this case the 1241 // surface is not alpha-only and we want alpha to really mean the alpha component of the 1242 // texture, not the red component. 1243 if (memoryIsAlphaOnly && !surfaceIsAlphaOnly) { 1244 if (GR_GL_RED == *externalFormat) { 1245 *externalFormat = GR_GL_ALPHA; 1246 } 1247 } 1248 1249 return true; 1250 } 1251 1252 void GrGLCaps::initConfigTable(const GrContextOptions& contextOptions, 1253 const GrGLContextInfo& ctxInfo, const GrGLInterface* gli, 1254 GrShaderCaps* shaderCaps) { 1255 /* 1256 Comments on renderability of configs on various GL versions. 1257 OpenGL < 3.0: 1258 no built in support for render targets. 1259 GL_EXT_framebuffer_object adds possible support for any sized format with base internal 1260 format RGB, RGBA and NV float formats we don't use. 1261 This is the following: 1262 R3_G3_B2, RGB4, RGB5, RGB8, RGB10, RGB12, RGB16, RGBA2, RGBA4, RGB5_A1, RGBA8 1263 RGB10_A2, RGBA12,RGBA16 1264 Though, it is hard to believe the more obscure formats such as RGBA12 would work 1265 since they aren't required by later standards and the driver can simply return 1266 FRAMEBUFFER_UNSUPPORTED for anything it doesn't allow. 1267 GL_ARB_framebuffer_object adds everything added by the EXT extension and additionally 1268 any sized internal format with a base internal format of ALPHA, LUMINANCE, 1269 LUMINANCE_ALPHA, INTENSITY, RED, and RG. 1270 This adds a lot of additional renderable sized formats, including ALPHA8. 1271 The GL_ARB_texture_rg brings in the RED and RG formats (8, 8I, 8UI, 16, 16I, 16UI, 1272 16F, 32I, 32UI, and 32F variants). 1273 Again, the driver has an escape hatch via FRAMEBUFFER_UNSUPPORTED. 1274 1275 For both the above extensions we limit ourselves to those that are also required by 1276 OpenGL 3.0. 1277 1278 OpenGL 3.0: 1279 Any format with base internal format ALPHA, RED, RG, RGB or RGBA is "color-renderable" 1280 but are not required to be supported as renderable textures/renderbuffer. 1281 Required renderable color formats: 1282 - RGBA32F, RGBA32I, RGBA32UI, RGBA16, RGBA16F, RGBA16I, 1283 RGBA16UI, RGBA8, RGBA8I, RGBA8UI, SRGB8_ALPHA8, and 1284 RGB10_A2. 1285 - R11F_G11F_B10F. 1286 - RG32F, RG32I, RG32UI, RG16, RG16F, RG16I, RG16UI, RG8, RG8I, 1287 and RG8UI. 1288 - R32F, R32I, R32UI, R16F, R16I, R16UI, R16, R8, R8I, and R8UI. 1289 - ALPHA8 1290 1291 OpenGL 3.1, 3.2, 3.3 1292 Same as 3.0 except ALPHA8 requires GL_ARB_compatibility/compatibility profile. 1293 OpengGL 3.3, 4.0, 4.1 1294 Adds RGB10_A2UI. 1295 OpengGL 4.2 1296 Adds 1297 - RGB5_A1, RGBA4 1298 - RGB565 1299 OpenGL 4.4 1300 Does away with the separate list and adds a column to the sized internal color format 1301 table. However, no new formats become required color renderable. 1302 1303 ES 2.0 1304 color renderable: RGBA4, RGB5_A1, RGB565 1305 GL_EXT_texture_rg adds support for R8, RG5 as a color render target 1306 GL_OES_rgb8_rgba8 adds support for RGB8 and RGBA8 1307 GL_ARM_rgba8 adds support for RGBA8 (but not RGB8) 1308 GL_EXT_texture_format_BGRA8888 does not add renderbuffer support 1309 GL_CHROMIUM_renderbuffer_format_BGRA8888 adds BGRA8 as color-renderable 1310 GL_APPLE_texture_format_BGRA8888 does not add renderbuffer support 1311 1312 ES 3.0 1313 - RGBA32I, RGBA32UI, RGBA16I, RGBA16UI, RGBA8, RGBA8I, 1314 RGBA8UI, SRGB8_ALPHA8, RGB10_A2, RGB10_A2UI, RGBA4, and 1315 RGB5_A1. 1316 - RGB8 and RGB565. 1317 - RG32I, RG32UI, RG16I, RG16UI, RG8, RG8I, and RG8UI. 1318 - R32I, R32UI, R16I, R16UI, R8, R8I, and R8UI 1319 ES 3.1 1320 Adds RGB10_A2, RGB10_A2UI, 1321 ES 3.2 1322 Adds R16F, RG16F, RGBA16F, R32F, RG32F, RGBA32F, R11F_G11F_B10F. 1323 */ 1324 1325 // Correctness workarounds. 1326 bool disableTextureRedForMesa = false; 1327 bool disableSRGBForX86PowerVR = false; 1328 bool disableSRGBWriteControlForAdreno4xx = false; 1329 bool disableR8TexStorageForANGLEGL = false; 1330 bool disableSRGBRenderWithMSAAForMacAMD = false; 1331 1332 if (!contextOptions.fDisableDriverCorrectnessWorkarounds) { 1333 // ARB_texture_rg is part of OpenGL 3.0, but osmesa doesn't support GL_RED 1334 // and GL_RG on FBO textures. 1335 disableTextureRedForMesa = kOSMesa_GrGLRenderer == ctxInfo.renderer(); 1336 1337 bool isX86PowerVR = false; 1338 #if defined(SK_CPU_X86) 1339 if (kPowerVRRogue_GrGLRenderer == ctxInfo.renderer()) { 1340 isX86PowerVR = true; 1341 } 1342 #endif 1343 // NexusPlayer has strange bugs with sRGB (skbug.com/4148). This is a targeted fix to 1344 // blacklist that device (and any others that might be sharing the same driver). 1345 disableSRGBForX86PowerVR = isX86PowerVR; 1346 disableSRGBWriteControlForAdreno4xx = kAdreno4xx_GrGLRenderer == ctxInfo.renderer(); 1347 1348 // Angle with es2->GL has a bug where it will hang trying to call TexSubImage on GL_R8 1349 // formats on miplevels > 0. We already disable texturing on gles > 2.0 so just need to 1350 // check that we are not going to OpenGL. 1351 disableR8TexStorageForANGLEGL = GrGLANGLEBackend::kOpenGL == ctxInfo.angleBackend(); 1352 1353 // MacPro devices with AMD cards fail to create MSAA sRGB render buffers. 1354 #if defined(SK_BUILD_FOR_MAC) 1355 disableSRGBRenderWithMSAAForMacAMD = kATI_GrGLVendor == ctxInfo.vendor(); 1356 #endif 1357 } 1358 1359 uint32_t nonMSAARenderFlags = ConfigInfo::kRenderable_Flag | 1360 ConfigInfo::kFBOColorAttachment_Flag; 1361 uint32_t allRenderFlags = nonMSAARenderFlags; 1362 if (kNone_MSFBOType != fMSFBOType) { 1363 allRenderFlags |= ConfigInfo::kRenderableWithMSAA_Flag; 1364 } 1365 GrGLStandard standard = ctxInfo.standard(); 1366 GrGLVersion version = ctxInfo.version(); 1367 1368 bool texStorageSupported = false; 1369 if (kGL_GrGLStandard == standard) { 1370 // The EXT version can apply to either GL or GLES. 1371 texStorageSupported = version >= GR_GL_VER(4,2) || 1372 ctxInfo.hasExtension("GL_ARB_texture_storage") || 1373 ctxInfo.hasExtension("GL_EXT_texture_storage"); 1374 } else { 1375 texStorageSupported = version >= GR_GL_VER(3,0) || 1376 ctxInfo.hasExtension("GL_EXT_texture_storage"); 1377 } 1378 1379 bool texelBufferSupport = this->shaderCaps()->texelBufferSupport(); 1380 1381 bool textureRedSupport = false; 1382 1383 if (!disableTextureRedForMesa) { 1384 if (kGL_GrGLStandard == standard) { 1385 textureRedSupport = 1386 version >= GR_GL_VER(3, 0) || ctxInfo.hasExtension("GL_ARB_texture_rg"); 1387 } else { 1388 textureRedSupport = 1389 version >= GR_GL_VER(3, 0) || ctxInfo.hasExtension("GL_EXT_texture_rg"); 1390 } 1391 } 1392 1393 fConfigTable[kUnknown_GrPixelConfig].fFormats.fBaseInternalFormat = 0; 1394 fConfigTable[kUnknown_GrPixelConfig].fFormats.fSizedInternalFormat = 0; 1395 fConfigTable[kUnknown_GrPixelConfig].fFormats.fExternalFormat[kOther_ExternalFormatUsage] = 0; 1396 fConfigTable[kUnknown_GrPixelConfig].fFormats.fExternalType = 0; 1397 fConfigTable[kUnknown_GrPixelConfig].fFormatType = kNormalizedFixedPoint_FormatType; 1398 fConfigTable[kUnknown_GrPixelConfig].fSwizzle = GrSwizzle::RGBA(); 1399 1400 fConfigTable[kRGBA_8888_GrPixelConfig].fFormats.fBaseInternalFormat = GR_GL_RGBA; 1401 fConfigTable[kRGBA_8888_GrPixelConfig].fFormats.fSizedInternalFormat = GR_GL_RGBA8; 1402 fConfigTable[kRGBA_8888_GrPixelConfig].fFormats.fExternalFormat[kOther_ExternalFormatUsage] = 1403 GR_GL_RGBA; 1404 fConfigTable[kRGBA_8888_GrPixelConfig].fFormats.fExternalType = GR_GL_UNSIGNED_BYTE; 1405 fConfigTable[kRGBA_8888_GrPixelConfig].fFormatType = kNormalizedFixedPoint_FormatType; 1406 fConfigTable[kRGBA_8888_GrPixelConfig].fFlags = ConfigInfo::kTextureable_Flag; 1407 if (kGL_GrGLStandard == standard) { 1408 // We require some form of FBO support and all GLs with FBO support can render to RGBA8 1409 fConfigTable[kRGBA_8888_GrPixelConfig].fFlags |= allRenderFlags; 1410 } else { 1411 if (version >= GR_GL_VER(3,0) || ctxInfo.hasExtension("GL_OES_rgb8_rgba8") || 1412 ctxInfo.hasExtension("GL_ARM_rgba8")) { 1413 fConfigTable[kRGBA_8888_GrPixelConfig].fFlags |= allRenderFlags; 1414 } 1415 } 1416 if (texStorageSupported) { 1417 fConfigTable[kRGBA_8888_GrPixelConfig].fFlags |= ConfigInfo::kCanUseTexStorage_Flag; 1418 } 1419 if (texelBufferSupport) { 1420 fConfigTable[kRGBA_8888_GrPixelConfig].fFlags |= ConfigInfo::kCanUseWithTexelBuffer_Flag; 1421 } 1422 fConfigTable[kRGBA_8888_GrPixelConfig].fSwizzle = GrSwizzle::RGBA(); 1423 1424 fConfigTable[kBGRA_8888_GrPixelConfig].fFormats.fExternalFormat[kOther_ExternalFormatUsage] = 1425 GR_GL_BGRA; 1426 fConfigTable[kBGRA_8888_GrPixelConfig].fFormats.fExternalType = GR_GL_UNSIGNED_BYTE; 1427 fConfigTable[kBGRA_8888_GrPixelConfig].fFormatType = kNormalizedFixedPoint_FormatType; 1428 1429 // TexStorage requires using a sized internal format and BGRA8 is only supported if we have the 1430 // GL_APPLE_texture_format_BGRA8888 extension or if we have GL_EXT_texutre_storage and 1431 // GL_EXT_texture_format_BGRA8888. 1432 bool supportsBGRATexStorage = false; 1433 1434 if (kGL_GrGLStandard == standard) { 1435 fConfigTable[kBGRA_8888_GrPixelConfig].fFormats.fBaseInternalFormat = GR_GL_RGBA; 1436 fConfigTable[kBGRA_8888_GrPixelConfig].fFormats.fSizedInternalFormat = GR_GL_RGBA8; 1437 if (version >= GR_GL_VER(1, 2) || ctxInfo.hasExtension("GL_EXT_bgra")) { 1438 // Since the internal format is RGBA8, it is also renderable. 1439 fConfigTable[kBGRA_8888_GrPixelConfig].fFlags = ConfigInfo::kTextureable_Flag | 1440 allRenderFlags; 1441 } 1442 // Since we are using RGBA8 we can use tex storage. 1443 supportsBGRATexStorage = true; 1444 } else { 1445 fConfigTable[kBGRA_8888_GrPixelConfig].fFormats.fBaseInternalFormat = GR_GL_BGRA; 1446 fConfigTable[kBGRA_8888_GrPixelConfig].fFormats.fSizedInternalFormat = GR_GL_BGRA8; 1447 if (ctxInfo.hasExtension("GL_APPLE_texture_format_BGRA8888")) { 1448 // This APPLE extension introduces complexity on ES2. It leaves the internal format 1449 // as RGBA, but allows BGRA as the external format. From testing, it appears that the 1450 // driver remembers the external format when the texture is created (with TexImage). 1451 // If you then try to upload data in the other swizzle (with TexSubImage), it fails. 1452 // We could work around this, but it adds even more state tracking to code that is 1453 // already too tricky. Instead, we opt not to support BGRA on ES2 with this extension. 1454 // This also side-steps some ambiguous interactions with the texture storage extension. 1455 if (version >= GR_GL_VER(3,0)) { 1456 // The APPLE extension doesn't make this renderable. 1457 fConfigTable[kBGRA_8888_GrPixelConfig].fFlags = ConfigInfo::kTextureable_Flag; 1458 supportsBGRATexStorage = true; 1459 } 1460 } else if (ctxInfo.hasExtension("GL_EXT_texture_format_BGRA8888")) { 1461 fConfigTable[kBGRA_8888_GrPixelConfig].fFlags = ConfigInfo::kTextureable_Flag | 1462 nonMSAARenderFlags; 1463 1464 if (ctxInfo.hasExtension("GL_EXT_texture_storage")) { 1465 supportsBGRATexStorage = true; 1466 } 1467 if (ctxInfo.hasExtension("GL_CHROMIUM_renderbuffer_format_BGRA8888") && 1468 (this->usesMSAARenderBuffers() || this->fMSFBOType == kMixedSamples_MSFBOType)) { 1469 fConfigTable[kBGRA_8888_GrPixelConfig].fFlags |= 1470 ConfigInfo::kRenderableWithMSAA_Flag; 1471 } 1472 } 1473 } 1474 1475 if (texStorageSupported && supportsBGRATexStorage) { 1476 fConfigTable[kBGRA_8888_GrPixelConfig].fFlags |= ConfigInfo::kCanUseTexStorage_Flag; 1477 } 1478 fConfigTable[kBGRA_8888_GrPixelConfig].fSwizzle = GrSwizzle::RGBA(); 1479 1480 // We only enable srgb support if both textures and FBOs support srgb, 1481 // *and* we can disable sRGB decode-on-read, to support "legacy" mode. 1482 if (kGL_GrGLStandard == standard) { 1483 if (ctxInfo.version() >= GR_GL_VER(3,0)) { 1484 fSRGBSupport = true; 1485 } else if (ctxInfo.hasExtension("GL_EXT_texture_sRGB")) { 1486 if (ctxInfo.hasExtension("GL_ARB_framebuffer_sRGB") || 1487 ctxInfo.hasExtension("GL_EXT_framebuffer_sRGB")) { 1488 fSRGBSupport = true; 1489 } 1490 } 1491 // All the above srgb extensions support toggling srgb writes 1492 if (fSRGBSupport) { 1493 fSRGBWriteControl = true; 1494 } 1495 } else { 1496 fSRGBSupport = ctxInfo.version() >= GR_GL_VER(3,0) || ctxInfo.hasExtension("GL_EXT_sRGB"); 1497 if (disableSRGBForX86PowerVR) { 1498 fSRGBSupport = false; 1499 } 1500 // ES through 3.1 requires EXT_srgb_write_control to support toggling 1501 // sRGB writing for destinations. 1502 // See https://bug.skia.org/5329 for Adreno4xx issue. 1503 fSRGBWriteControl = !disableSRGBWriteControlForAdreno4xx && 1504 ctxInfo.hasExtension("GL_EXT_sRGB_write_control"); 1505 } 1506 if (contextOptions.fRequireDecodeDisableForSRGB && !fSRGBDecodeDisableSupport) { 1507 // To support "legacy" L32 mode, we require the ability to turn off sRGB decode. Clients 1508 // can opt-out of that requirement, if they intend to always do linear blending. 1509 fSRGBSupport = false; 1510 } 1511 1512 // This is very conservative, if we're on a platform where N32 is BGRA, and using ES, disable 1513 // all sRGB support. Too much code relies on creating surfaces with N32 + sRGB colorspace, 1514 // and sBGRA is basically impossible to support on any version of ES (with our current code). 1515 // In particular, ES2 doesn't support sBGRA at all, and even in ES3, there is no valid pair 1516 // of formats that can be used for TexImage calls to upload BGRA data to sRGBA (which is what 1517 // we *have* to use as the internal format, because sBGRA doesn't exist). This primarily 1518 // affects Windows. 1519 if (kSkia8888_GrPixelConfig == kBGRA_8888_GrPixelConfig && kGLES_GrGLStandard == standard) { 1520 fSRGBSupport = false; 1521 } 1522 1523 // ES2 Command Buffer has several TexStorage restrictions. It appears to fail for any format 1524 // not explicitly allowed by GL_EXT_texture_storage, particularly those from other extensions. 1525 bool isCommandBufferES2 = kChromium_GrGLDriver == ctxInfo.driver() && version < GR_GL_VER(3, 0); 1526 1527 uint32_t srgbRenderFlags = allRenderFlags; 1528 if (disableSRGBRenderWithMSAAForMacAMD) { 1529 srgbRenderFlags &= ~ConfigInfo::kRenderableWithMSAA_Flag; 1530 } 1531 1532 fConfigTable[kSRGBA_8888_GrPixelConfig].fFormats.fBaseInternalFormat = GR_GL_SRGB_ALPHA; 1533 fConfigTable[kSRGBA_8888_GrPixelConfig].fFormats.fSizedInternalFormat = GR_GL_SRGB8_ALPHA8; 1534 // GL does not do srgb<->rgb conversions when transferring between cpu and gpu. Thus, the 1535 // external format is GL_RGBA. See below for note about ES2.0 and glTex[Sub]Image. 1536 fConfigTable[kSRGBA_8888_GrPixelConfig].fFormats.fExternalFormat[kOther_ExternalFormatUsage] = 1537 GR_GL_RGBA; 1538 fConfigTable[kSRGBA_8888_GrPixelConfig].fFormats.fExternalType = GR_GL_UNSIGNED_BYTE; 1539 fConfigTable[kSRGBA_8888_GrPixelConfig].fFormatType = kNormalizedFixedPoint_FormatType; 1540 if (fSRGBSupport) { 1541 fConfigTable[kSRGBA_8888_GrPixelConfig].fFlags = ConfigInfo::kTextureable_Flag | 1542 srgbRenderFlags; 1543 } 1544 // ES2 Command Buffer does not allow TexStorage with SRGB8_ALPHA8_EXT 1545 if (texStorageSupported && !isCommandBufferES2) { 1546 fConfigTable[kSRGBA_8888_GrPixelConfig].fFlags |= ConfigInfo::kCanUseTexStorage_Flag; 1547 } 1548 fConfigTable[kSRGBA_8888_GrPixelConfig].fSwizzle = GrSwizzle::RGBA(); 1549 // sBGRA is not a "real" thing in OpenGL, but GPUs support it, and on platforms where 1550 // kN32 == BGRA, we need some way to work with it. (The default framebuffer on Windows 1551 // is in this format, for example). 1552 fConfigTable[kSBGRA_8888_GrPixelConfig].fFormats.fBaseInternalFormat = GR_GL_SRGB_ALPHA; 1553 fConfigTable[kSBGRA_8888_GrPixelConfig].fFormats.fSizedInternalFormat = GR_GL_SRGB8_ALPHA8; 1554 // GL does not do srgb<->rgb conversions when transferring between cpu and gpu. Thus, the 1555 // external format is GL_BGRA. 1556 fConfigTable[kSBGRA_8888_GrPixelConfig].fFormats.fExternalFormat[kOther_ExternalFormatUsage] = 1557 GR_GL_BGRA; 1558 fConfigTable[kSBGRA_8888_GrPixelConfig].fFormats.fExternalType = GR_GL_UNSIGNED_BYTE; 1559 fConfigTable[kSBGRA_8888_GrPixelConfig].fFormatType = kNormalizedFixedPoint_FormatType; 1560 if (fSRGBSupport && kGL_GrGLStandard == standard) { 1561 fConfigTable[kSBGRA_8888_GrPixelConfig].fFlags = ConfigInfo::kTextureable_Flag | 1562 srgbRenderFlags; 1563 } 1564 1565 if (texStorageSupported) { 1566 fConfigTable[kSBGRA_8888_GrPixelConfig].fFlags |= ConfigInfo::kCanUseTexStorage_Flag; 1567 } 1568 fConfigTable[kSBGRA_8888_GrPixelConfig].fSwizzle = GrSwizzle::RGBA(); 1569 1570 fConfigTable[kRGB_565_GrPixelConfig].fFormats.fBaseInternalFormat = GR_GL_RGB; 1571 if (this->ES2CompatibilitySupport()) { 1572 fConfigTable[kRGB_565_GrPixelConfig].fFormats.fSizedInternalFormat = GR_GL_RGB565; 1573 } else { 1574 fConfigTable[kRGB_565_GrPixelConfig].fFormats.fSizedInternalFormat = GR_GL_RGB5; 1575 } 1576 fConfigTable[kRGB_565_GrPixelConfig].fFormats.fExternalFormat[kOther_ExternalFormatUsage] = 1577 GR_GL_RGB; 1578 fConfigTable[kRGB_565_GrPixelConfig].fFormats.fExternalType = GR_GL_UNSIGNED_SHORT_5_6_5; 1579 fConfigTable[kRGB_565_GrPixelConfig].fFormatType = kNormalizedFixedPoint_FormatType; 1580 fConfigTable[kRGB_565_GrPixelConfig].fFlags = ConfigInfo::kTextureable_Flag; 1581 if (kGL_GrGLStandard == standard) { 1582 if (version >= GR_GL_VER(4, 2) || ctxInfo.hasExtension("GL_ARB_ES2_compatibility")) { 1583 fConfigTable[kRGB_565_GrPixelConfig].fFlags |= allRenderFlags; 1584 } 1585 } else { 1586 fConfigTable[kRGB_565_GrPixelConfig].fFlags |= allRenderFlags; 1587 } 1588 // 565 is not a sized internal format on desktop GL. So on desktop with 1589 // 565 we always use an unsized internal format to let the system pick 1590 // the best sized format to convert the 565 data to. Since TexStorage 1591 // only allows sized internal formats we disallow it. 1592 // 1593 // TODO: As of 4.2, regular GL supports 565. This logic is due for an 1594 // update. 1595 if (texStorageSupported && kGL_GrGLStandard != standard) { 1596 fConfigTable[kRGB_565_GrPixelConfig].fFlags |= ConfigInfo::kCanUseTexStorage_Flag; 1597 } 1598 fConfigTable[kRGB_565_GrPixelConfig].fSwizzle = GrSwizzle::RGBA(); 1599 1600 fConfigTable[kRGBA_4444_GrPixelConfig].fFormats.fBaseInternalFormat = GR_GL_RGBA; 1601 fConfigTable[kRGBA_4444_GrPixelConfig].fFormats.fSizedInternalFormat = GR_GL_RGBA4; 1602 fConfigTable[kRGBA_4444_GrPixelConfig].fFormats.fExternalFormat[kOther_ExternalFormatUsage] = 1603 GR_GL_RGBA; 1604 fConfigTable[kRGBA_4444_GrPixelConfig].fFormats.fExternalType = GR_GL_UNSIGNED_SHORT_4_4_4_4; 1605 fConfigTable[kRGBA_4444_GrPixelConfig].fFormatType = kNormalizedFixedPoint_FormatType; 1606 fConfigTable[kRGBA_4444_GrPixelConfig].fFlags = ConfigInfo::kTextureable_Flag; 1607 if (kGL_GrGLStandard == standard) { 1608 if (version >= GR_GL_VER(4, 2)) { 1609 fConfigTable[kRGBA_4444_GrPixelConfig].fFlags |= allRenderFlags; 1610 } 1611 } else { 1612 fConfigTable[kRGBA_4444_GrPixelConfig].fFlags |= allRenderFlags; 1613 } 1614 if (texStorageSupported) { 1615 fConfigTable[kRGBA_4444_GrPixelConfig].fFlags |= ConfigInfo::kCanUseTexStorage_Flag; 1616 } 1617 fConfigTable[kRGBA_4444_GrPixelConfig].fSwizzle = GrSwizzle::RGBA(); 1618 1619 fConfigTable[kRGBA_1010102_GrPixelConfig].fFormats.fBaseInternalFormat = GR_GL_RGBA; 1620 fConfigTable[kRGBA_1010102_GrPixelConfig].fFormats.fSizedInternalFormat = GR_GL_RGB10_A2; 1621 fConfigTable[kRGBA_1010102_GrPixelConfig].fFormats.fExternalFormat[kOther_ExternalFormatUsage] = 1622 GR_GL_RGBA; 1623 fConfigTable[kRGBA_1010102_GrPixelConfig].fFormats.fExternalType = 1624 GR_GL_UNSIGNED_INT_2_10_10_10_REV; 1625 fConfigTable[kRGBA_1010102_GrPixelConfig].fFormatType = kNormalizedFixedPoint_FormatType; 1626 if (kGL_GrGLStandard == standard || version >= GR_GL_VER(3, 0)) { 1627 fConfigTable[kRGBA_1010102_GrPixelConfig].fFlags = ConfigInfo::kTextureable_Flag | 1628 allRenderFlags; 1629 } 1630 if (texStorageSupported) { 1631 fConfigTable[kRGBA_1010102_GrPixelConfig].fFlags |= ConfigInfo::kCanUseTexStorage_Flag; 1632 } 1633 if (texelBufferSupport) { 1634 fConfigTable[kRGBA_1010102_GrPixelConfig].fFlags |= ConfigInfo::kCanUseWithTexelBuffer_Flag; 1635 } 1636 fConfigTable[kRGBA_1010102_GrPixelConfig].fSwizzle = GrSwizzle::RGBA(); 1637 1638 bool alpha8IsValidForGL = kGL_GrGLStandard == standard && 1639 (!fIsCoreProfile || version <= GR_GL_VER(3, 0)); 1640 1641 ConfigInfo& alphaInfo = fConfigTable[kAlpha_8_as_Alpha_GrPixelConfig]; 1642 alphaInfo.fFormats.fExternalType = GR_GL_UNSIGNED_BYTE; 1643 alphaInfo.fFormatType = kNormalizedFixedPoint_FormatType; 1644 if (alpha8IsValidForGL || (kGL_GrGLStandard != standard && version < GR_GL_VER(3, 0))) { 1645 alphaInfo.fFlags = ConfigInfo::kTextureable_Flag; 1646 } 1647 alphaInfo.fFormats.fBaseInternalFormat = GR_GL_ALPHA; 1648 alphaInfo.fFormats.fSizedInternalFormat = GR_GL_ALPHA8; 1649 alphaInfo.fFormats.fExternalFormat[kOther_ExternalFormatUsage] = GR_GL_ALPHA; 1650 alphaInfo.fSwizzle = GrSwizzle::AAAA(); 1651 if (fAlpha8IsRenderable && alpha8IsValidForGL) { 1652 alphaInfo.fFlags |= allRenderFlags; 1653 } 1654 1655 ConfigInfo& redInfo = fConfigTable[kAlpha_8_as_Red_GrPixelConfig]; 1656 redInfo.fFormats.fExternalType = GR_GL_UNSIGNED_BYTE; 1657 redInfo.fFormatType = kNormalizedFixedPoint_FormatType; 1658 redInfo.fFormats.fBaseInternalFormat = GR_GL_RED; 1659 redInfo.fFormats.fSizedInternalFormat = GR_GL_R8; 1660 redInfo.fFormats.fExternalFormat[kOther_ExternalFormatUsage] = GR_GL_RED; 1661 redInfo.fSwizzle = GrSwizzle::RRRR(); 1662 1663 // ES2 Command Buffer does not allow TexStorage with R8_EXT (so Alpha_8 and Gray_8) 1664 if (texStorageSupported && !isCommandBufferES2) { 1665 if (!disableR8TexStorageForANGLEGL) { 1666 alphaInfo.fFlags |= ConfigInfo::kCanUseTexStorage_Flag; 1667 } 1668 redInfo.fFlags |= ConfigInfo::kCanUseTexStorage_Flag; 1669 } 1670 1671 if (textureRedSupport) { 1672 redInfo.fFlags |= ConfigInfo::kTextureable_Flag | allRenderFlags; 1673 if (texelBufferSupport) { 1674 redInfo.fFlags |= ConfigInfo::kCanUseWithTexelBuffer_Flag; 1675 } 1676 1677 fConfigTable[kAlpha_8_GrPixelConfig] = redInfo; 1678 } else { 1679 redInfo.fFlags = 0; 1680 1681 fConfigTable[kAlpha_8_GrPixelConfig] = alphaInfo; 1682 } 1683 1684 ConfigInfo& grayLumInfo = fConfigTable[kGray_8_as_Lum_GrPixelConfig]; 1685 grayLumInfo.fFormats.fExternalType = GR_GL_UNSIGNED_BYTE; 1686 grayLumInfo.fFormatType = kNormalizedFixedPoint_FormatType; 1687 grayLumInfo.fFormats.fBaseInternalFormat = GR_GL_LUMINANCE; 1688 grayLumInfo.fFormats.fSizedInternalFormat = GR_GL_LUMINANCE8; 1689 grayLumInfo.fFormats.fExternalFormat[kOther_ExternalFormatUsage] = GR_GL_LUMINANCE; 1690 grayLumInfo.fSwizzle = GrSwizzle::RGBA(); 1691 if ((standard == kGL_GrGLStandard && version <= GR_GL_VER(3, 0)) || 1692 (standard == kGLES_GrGLStandard && version < GR_GL_VER(3, 0))) { 1693 grayLumInfo.fFlags = ConfigInfo::kTextureable_Flag; 1694 } 1695 1696 ConfigInfo& grayRedInfo = fConfigTable[kGray_8_as_Red_GrPixelConfig]; 1697 grayRedInfo.fFormats.fExternalType = GR_GL_UNSIGNED_BYTE; 1698 grayRedInfo.fFormatType = kNormalizedFixedPoint_FormatType; 1699 grayRedInfo.fFormats.fBaseInternalFormat = GR_GL_RED; 1700 grayRedInfo.fFormats.fSizedInternalFormat = GR_GL_R8; 1701 grayRedInfo.fFormats.fExternalFormat[kOther_ExternalFormatUsage] = GR_GL_RED; 1702 grayRedInfo.fSwizzle = GrSwizzle::RRRA(); 1703 grayRedInfo.fFlags = ConfigInfo::kTextureable_Flag; 1704 1705 #if 0 // Leaving Gray8 as non-renderable, to keep things simple and match raster. Needs to be 1706 // updated to support Gray8_as_Lum and Gray8_as_red if this is ever enabled. 1707 if (this->textureRedSupport() || 1708 (kDesktop_ARB_MSFBOType == this->msFBOType() && 1709 ctxInfo.renderer() != kOSMesa_GrGLRenderer)) { 1710 // desktop ARB extension/3.0+ supports LUMINANCE8 as renderable. 1711 // However, osmesa fails if it used even when GL_ARB_framebuffer_object is present. 1712 // Core profile removes LUMINANCE8 support, but we should have chosen R8 in that case. 1713 fConfigTable[kGray_8_GrPixelConfig].fFlags |= allRenderFlags; 1714 } 1715 #endif 1716 if (texStorageSupported && !isCommandBufferES2) { 1717 if (!disableR8TexStorageForANGLEGL) { 1718 grayLumInfo.fFlags |= ConfigInfo::kCanUseTexStorage_Flag; 1719 } 1720 grayRedInfo.fFlags |= ConfigInfo::kCanUseTexStorage_Flag; 1721 } 1722 1723 if (textureRedSupport) { 1724 if (texelBufferSupport) { 1725 grayRedInfo.fFlags |= ConfigInfo::kCanUseWithTexelBuffer_Flag; 1726 } 1727 fConfigTable[kGray_8_GrPixelConfig] = grayRedInfo; 1728 } else { 1729 grayRedInfo.fFlags = 0; 1730 fConfigTable[kGray_8_GrPixelConfig] = grayLumInfo; 1731 } 1732 1733 // Check for [half] floating point texture support 1734 // NOTE: We disallow floating point textures on ES devices if linear filtering modes are not 1735 // supported. This is for simplicity, but a more granular approach is possible. Coincidentally, 1736 // [half] floating point textures became part of the standard in ES3.1 / OGL 3.0. 1737 bool hasFPTextures = false; 1738 bool hasHalfFPTextures = false; 1739 bool rgIsTexturable = false; 1740 // for now we don't support floating point MSAA on ES 1741 uint32_t fpRenderFlags = (kGL_GrGLStandard == standard) ? allRenderFlags : nonMSAARenderFlags; 1742 1743 if (kGL_GrGLStandard == standard) { 1744 if (version >= GR_GL_VER(3, 0)) { 1745 hasFPTextures = true; 1746 hasHalfFPTextures = true; 1747 rgIsTexturable = true; 1748 } 1749 } else { 1750 if (version >= GR_GL_VER(3, 0)) { 1751 hasFPTextures = true; 1752 hasHalfFPTextures = true; 1753 rgIsTexturable = true; 1754 } else { 1755 if (ctxInfo.hasExtension("GL_OES_texture_float_linear") && 1756 ctxInfo.hasExtension("GL_OES_texture_float")) { 1757 hasFPTextures = true; 1758 } 1759 if (ctxInfo.hasExtension("GL_OES_texture_half_float_linear") && 1760 ctxInfo.hasExtension("GL_OES_texture_half_float")) { 1761 hasHalfFPTextures = true; 1762 } 1763 } 1764 } 1765 1766 for (auto fpconfig : {kRGBA_float_GrPixelConfig, kRG_float_GrPixelConfig}) { 1767 const GrGLenum format = kRGBA_float_GrPixelConfig == fpconfig ? GR_GL_RGBA : GR_GL_RG; 1768 fConfigTable[fpconfig].fFormats.fBaseInternalFormat = format; 1769 fConfigTable[fpconfig].fFormats.fSizedInternalFormat = 1770 kRGBA_float_GrPixelConfig == fpconfig ? GR_GL_RGBA32F : GR_GL_RG32F; 1771 fConfigTable[fpconfig].fFormats.fExternalFormat[kOther_ExternalFormatUsage] = format; 1772 fConfigTable[fpconfig].fFormats.fExternalType = GR_GL_FLOAT; 1773 fConfigTable[fpconfig].fFormatType = kFloat_FormatType; 1774 if (hasFPTextures) { 1775 fConfigTable[fpconfig].fFlags = rgIsTexturable ? ConfigInfo::kTextureable_Flag : 0; 1776 // For now we only enable rendering to float on desktop, because on ES we'd have to 1777 // solve many precision issues and no clients actually want this yet. 1778 if (kGL_GrGLStandard == standard /* || version >= GR_GL_VER(3,2) || 1779 ctxInfo.hasExtension("GL_EXT_color_buffer_float")*/) { 1780 fConfigTable[fpconfig].fFlags |= fpRenderFlags; 1781 } 1782 } 1783 if (texStorageSupported) { 1784 fConfigTable[fpconfig].fFlags |= ConfigInfo::kCanUseTexStorage_Flag; 1785 } 1786 if (texelBufferSupport) { 1787 fConfigTable[fpconfig].fFlags |= ConfigInfo::kCanUseWithTexelBuffer_Flag; 1788 } 1789 fConfigTable[fpconfig].fSwizzle = GrSwizzle::RGBA(); 1790 } 1791 1792 GrGLenum redHalfExternalType; 1793 if (kGL_GrGLStandard == ctxInfo.standard() || ctxInfo.version() >= GR_GL_VER(3, 0)) { 1794 redHalfExternalType = GR_GL_HALF_FLOAT; 1795 } else { 1796 redHalfExternalType = GR_GL_HALF_FLOAT_OES; 1797 } 1798 ConfigInfo& redHalf = fConfigTable[kAlpha_half_as_Red_GrPixelConfig]; 1799 redHalf.fFormats.fExternalType = redHalfExternalType; 1800 redHalf.fFormatType = kFloat_FormatType; 1801 redHalf.fFormats.fBaseInternalFormat = GR_GL_RED; 1802 redHalf.fFormats.fSizedInternalFormat = GR_GL_R16F; 1803 redHalf.fFormats.fExternalFormat[kOther_ExternalFormatUsage] = GR_GL_RED; 1804 redHalf.fSwizzle = GrSwizzle::RRRR(); 1805 if (textureRedSupport && hasHalfFPTextures) { 1806 redHalf.fFlags = ConfigInfo::kTextureable_Flag; 1807 1808 if (kGL_GrGLStandard == standard || version >= GR_GL_VER(3, 2) || 1809 (textureRedSupport && ctxInfo.hasExtension("GL_EXT_color_buffer_half_float"))) { 1810 redHalf.fFlags |= fpRenderFlags; 1811 } 1812 1813 if (texStorageSupported && !isCommandBufferES2) { 1814 redHalf.fFlags |= ConfigInfo::kCanUseTexStorage_Flag; 1815 } 1816 1817 if (texelBufferSupport) { 1818 redHalf.fFlags |= ConfigInfo::kCanUseWithTexelBuffer_Flag; 1819 } 1820 } 1821 fConfigTable[kAlpha_half_GrPixelConfig] = redHalf; 1822 1823 fConfigTable[kRGBA_half_GrPixelConfig].fFormats.fBaseInternalFormat = GR_GL_RGBA; 1824 fConfigTable[kRGBA_half_GrPixelConfig].fFormats.fSizedInternalFormat = GR_GL_RGBA16F; 1825 fConfigTable[kRGBA_half_GrPixelConfig].fFormats.fExternalFormat[kOther_ExternalFormatUsage] = 1826 GR_GL_RGBA; 1827 if (kGL_GrGLStandard == ctxInfo.standard() || ctxInfo.version() >= GR_GL_VER(3, 0)) { 1828 fConfigTable[kRGBA_half_GrPixelConfig].fFormats.fExternalType = GR_GL_HALF_FLOAT; 1829 } else { 1830 fConfigTable[kRGBA_half_GrPixelConfig].fFormats.fExternalType = GR_GL_HALF_FLOAT_OES; 1831 } 1832 fConfigTable[kRGBA_half_GrPixelConfig].fFormatType = kFloat_FormatType; 1833 if (hasHalfFPTextures) { 1834 fConfigTable[kRGBA_half_GrPixelConfig].fFlags = ConfigInfo::kTextureable_Flag; 1835 // ES requires 3.2 or EXT_color_buffer_half_float. 1836 if (kGL_GrGLStandard == standard || version >= GR_GL_VER(3,2) || 1837 ctxInfo.hasExtension("GL_EXT_color_buffer_half_float")) { 1838 fConfigTable[kRGBA_half_GrPixelConfig].fFlags |= fpRenderFlags; 1839 } 1840 } 1841 if (texStorageSupported) { 1842 fConfigTable[kRGBA_half_GrPixelConfig].fFlags |= ConfigInfo::kCanUseTexStorage_Flag; 1843 } 1844 if (texelBufferSupport) { 1845 fConfigTable[kRGBA_half_GrPixelConfig].fFlags |= ConfigInfo::kCanUseWithTexelBuffer_Flag; 1846 } 1847 fConfigTable[kRGBA_half_GrPixelConfig].fSwizzle = GrSwizzle::RGBA(); 1848 1849 // Bulk populate the texture internal/external formats here and then deal with exceptions below. 1850 1851 // ES 2.0 requires that the internal/external formats match. 1852 bool useSizedTexFormats = (kGL_GrGLStandard == ctxInfo.standard() || 1853 ctxInfo.version() >= GR_GL_VER(3,0)); 1854 // All ES versions (thus far) require sized internal formats for render buffers. 1855 // TODO: Always use sized internal format? 1856 bool useSizedRbFormats = kGLES_GrGLStandard == ctxInfo.standard(); 1857 1858 for (int i = 0; i < kGrPixelConfigCnt; ++i) { 1859 // Almost always we want to pass fExternalFormat[kOther_ExternalFormatUsage] as the <format> 1860 // param to glTex[Sub]Image. 1861 fConfigTable[i].fFormats.fExternalFormat[kTexImage_ExternalFormatUsage] = 1862 fConfigTable[i].fFormats.fExternalFormat[kOther_ExternalFormatUsage]; 1863 fConfigTable[i].fFormats.fInternalFormatTexImage = useSizedTexFormats ? 1864 fConfigTable[i].fFormats.fSizedInternalFormat : 1865 fConfigTable[i].fFormats.fBaseInternalFormat; 1866 fConfigTable[i].fFormats.fInternalFormatRenderbuffer = useSizedRbFormats ? 1867 fConfigTable[i].fFormats.fSizedInternalFormat : 1868 fConfigTable[i].fFormats.fBaseInternalFormat; 1869 } 1870 // If we're on ES 3.0+ but because of a driver workaround selected GL_ALPHA to implement the 1871 // kAlpha_8_GrPixelConfig then we actually have to use a base internal format rather than a 1872 // sized internal format. This is because there is no valid 8 bit alpha sized internal format 1873 // in ES. 1874 if (useSizedTexFormats && kGLES_GrGLStandard == ctxInfo.standard() && !textureRedSupport) { 1875 SkASSERT(fConfigTable[kAlpha_8_GrPixelConfig].fFormats.fBaseInternalFormat == GR_GL_ALPHA8); 1876 SkASSERT(fConfigTable[kAlpha_8_as_Alpha_GrPixelConfig].fFormats.fBaseInternalFormat == 1877 GR_GL_ALPHA8); 1878 fConfigTable[kAlpha_8_GrPixelConfig].fFormats.fInternalFormatTexImage = 1879 fConfigTable[kAlpha_8_GrPixelConfig].fFormats.fBaseInternalFormat; 1880 fConfigTable[kAlpha_8_as_Alpha_GrPixelConfig].fFormats.fInternalFormatTexImage = 1881 fConfigTable[kAlpha_8_as_Alpha_GrPixelConfig].fFormats.fBaseInternalFormat; 1882 } 1883 1884 // OpenGL ES 2.0 + GL_EXT_sRGB allows GL_SRGB_ALPHA to be specified as the <format> 1885 // param to Tex(Sub)Image. ES 2.0 requires the <internalFormat> and <format> params to match. 1886 // Thus, on ES 2.0 we will use GL_SRGB_ALPHA as the <format> param. 1887 // On OpenGL and ES 3.0+ GL_SRGB_ALPHA does not work for the <format> param to glTexImage. 1888 if (ctxInfo.standard() == kGLES_GrGLStandard && ctxInfo.version() == GR_GL_VER(2,0)) { 1889 fConfigTable[kSRGBA_8888_GrPixelConfig].fFormats.fExternalFormat[kTexImage_ExternalFormatUsage] = 1890 GR_GL_SRGB_ALPHA; 1891 1892 // Additionally, because we had to "invent" sBGRA, there is no way to make it work 1893 // in ES 2.0, because there is no <internalFormat> we can use. So just make that format 1894 // unsupported. (If we have no sRGB support at all, this will get overwritten below). 1895 fConfigTable[kSBGRA_8888_GrPixelConfig].fFlags = 0; 1896 } 1897 1898 // If BGRA is supported as an internal format it must always be specified to glTex[Sub]Image 1899 // as a base format. 1900 // GL_EXT_texture_format_BGRA8888: 1901 // This extension GL_BGRA as an unsized internal format. However, it is written against ES 1902 // 2.0 and therefore doesn't define a value for GL_BGRA8 as ES 2.0 uses unsized internal 1903 // formats. 1904 // GL_APPLE_texture_format_BGRA8888: 1905 // ES 2.0: the extension makes BGRA an external format but not an internal format. 1906 // ES 3.0: the extension explicitly states GL_BGRA8 is not a valid internal format for 1907 // glTexImage (just for glTexStorage). 1908 if (useSizedTexFormats && this->bgraIsInternalFormat()) { 1909 fConfigTable[kBGRA_8888_GrPixelConfig].fFormats.fInternalFormatTexImage = GR_GL_BGRA; 1910 } 1911 1912 // If we don't have texture swizzle support then the shader generator must insert the 1913 // swizzle into shader code. 1914 if (!this->textureSwizzleSupport()) { 1915 for (int i = 0; i < kGrPixelConfigCnt; ++i) { 1916 shaderCaps->fConfigTextureSwizzle[i] = fConfigTable[i].fSwizzle; 1917 } 1918 } 1919 1920 // Shader output swizzles will default to RGBA. When we've use GL_RED instead of GL_ALPHA to 1921 // implement kAlpha_8_GrPixelConfig we need to swizzle the shader outputs so the alpha channel 1922 // gets written to the single component. 1923 if (textureRedSupport) { 1924 for (int i = 0; i < kGrPixelConfigCnt; ++i) { 1925 GrPixelConfig config = static_cast<GrPixelConfig>(i); 1926 if (GrPixelConfigIsAlphaOnly(config) && 1927 fConfigTable[i].fFormats.fBaseInternalFormat == GR_GL_RED) { 1928 shaderCaps->fConfigOutputSwizzle[i] = GrSwizzle::AAAA(); 1929 } 1930 } 1931 } 1932 1933 for (int i = 0; i < kGrPixelConfigCnt; ++i) { 1934 if (ConfigInfo::kRenderableWithMSAA_Flag & fConfigTable[i].fFlags) { 1935 // We assume that MSAA rendering is supported only if we support non-MSAA rendering. 1936 SkASSERT(ConfigInfo::kRenderable_Flag & fConfigTable[i].fFlags); 1937 if ((kGL_GrGLStandard == ctxInfo.standard() && 1938 (ctxInfo.version() >= GR_GL_VER(4,2) || 1939 ctxInfo.hasExtension("GL_ARB_internalformat_query"))) || 1940 (kGLES_GrGLStandard == ctxInfo.standard() && ctxInfo.version() >= GR_GL_VER(3,0))) { 1941 int count; 1942 GrGLenum format = fConfigTable[i].fFormats.fInternalFormatRenderbuffer; 1943 GR_GL_GetInternalformativ(gli, GR_GL_RENDERBUFFER, format, GR_GL_NUM_SAMPLE_COUNTS, 1944 1, &count); 1945 if (count) { 1946 int* temp = new int[count]; 1947 GR_GL_GetInternalformativ(gli, GR_GL_RENDERBUFFER, format, GR_GL_SAMPLES, count, 1948 temp); 1949 // GL has a concept of MSAA rasterization with a single sample but we do not. 1950 if (count && temp[count - 1] == 1) { 1951 --count; 1952 SkASSERT(!count || temp[count -1] > 1); 1953 } 1954 fConfigTable[i].fColorSampleCounts.setCount(count+1); 1955 // We initialize our supported values with 1 (no msaa) and reverse the order 1956 // returned by GL so that the array is ascending. 1957 fConfigTable[i].fColorSampleCounts[0] = 1; 1958 for (int j = 0; j < count; ++j) { 1959 fConfigTable[i].fColorSampleCounts[j+1] = temp[count - j - 1]; 1960 } 1961 delete[] temp; 1962 } 1963 } else { 1964 // Fake out the table using some semi-standard counts up to the max allowed sample 1965 // count. 1966 int maxSampleCnt = 1; 1967 if (GrGLCaps::kES_IMG_MsToTexture_MSFBOType == fMSFBOType) { 1968 GR_GL_GetIntegerv(gli, GR_GL_MAX_SAMPLES_IMG, &maxSampleCnt); 1969 } else if (GrGLCaps::kNone_MSFBOType != fMSFBOType) { 1970 GR_GL_GetIntegerv(gli, GR_GL_MAX_SAMPLES, &maxSampleCnt); 1971 } 1972 // Chrome has a mock GL implementation that returns 0. 1973 maxSampleCnt = SkTMax(1, maxSampleCnt); 1974 1975 static constexpr int kDefaultSamples[] = {1, 2, 4, 8}; 1976 int count = SK_ARRAY_COUNT(kDefaultSamples); 1977 for (; count > 0; --count) { 1978 if (kDefaultSamples[count - 1] <= maxSampleCnt) { 1979 break; 1980 } 1981 } 1982 if (count > 0) { 1983 fConfigTable[i].fColorSampleCounts.append(count, kDefaultSamples); 1984 } 1985 } 1986 } else if (ConfigInfo::kRenderable_Flag & fConfigTable[i].fFlags) { 1987 fConfigTable[i].fColorSampleCounts.setCount(1); 1988 fConfigTable[i].fColorSampleCounts[0] = 1; 1989 } 1990 } 1991 1992 #ifdef SK_DEBUG 1993 // Make sure we initialized everything. 1994 ConfigInfo defaultEntry; 1995 for (int i = 0; i < kGrPixelConfigCnt; ++i) { 1996 // Make sure we didn't set renderable and not blittable or renderable with msaa and not 1997 // renderable. 1998 SkASSERT(!((ConfigInfo::kRenderable_Flag) && !(ConfigInfo::kFBOColorAttachment_Flag))); 1999 SkASSERT(!((ConfigInfo::kRenderableWithMSAA_Flag) && !(ConfigInfo::kRenderable_Flag))); 2000 SkASSERT(defaultEntry.fFormats.fBaseInternalFormat != 2001 fConfigTable[i].fFormats.fBaseInternalFormat); 2002 SkASSERT(defaultEntry.fFormats.fSizedInternalFormat != 2003 fConfigTable[i].fFormats.fSizedInternalFormat); 2004 for (int j = 0; j < kExternalFormatUsageCnt; ++j) { 2005 SkASSERT(defaultEntry.fFormats.fExternalFormat[j] != 2006 fConfigTable[i].fFormats.fExternalFormat[j]); 2007 } 2008 SkASSERT(defaultEntry.fFormats.fExternalType != fConfigTable[i].fFormats.fExternalType); 2009 } 2010 #endif 2011 } 2012 2013 bool GrGLCaps::initDescForDstCopy(const GrRenderTargetProxy* src, GrSurfaceDesc* desc, 2014 bool* rectsMustMatch, bool* disallowSubrect) const { 2015 // By default, we don't require rects to match. 2016 *rectsMustMatch = false; 2017 2018 // By default, we allow subrects. 2019 *disallowSubrect = false; 2020 2021 // If the src is a texture, we can implement the blit as a draw assuming the config is 2022 // renderable. 2023 if (src->asTextureProxy() && !this->isConfigRenderable(src->config())) { 2024 desc->fOrigin = kBottomLeft_GrSurfaceOrigin; 2025 desc->fFlags = kRenderTarget_GrSurfaceFlag; 2026 desc->fConfig = src->config(); 2027 return true; 2028 } 2029 2030 { 2031 // The only way we could see a non-GR_GL_TEXTURE_2D texture would be if it were 2032 // wrapped. In that case the proxy would already be instantiated. 2033 const GrTexture* srcTexture = src->priv().peekTexture(); 2034 const GrGLTexture* glSrcTexture = static_cast<const GrGLTexture*>(srcTexture); 2035 if (glSrcTexture && glSrcTexture->target() != GR_GL_TEXTURE_2D) { 2036 // Not supported for FBO blit or CopyTexSubImage 2037 return false; 2038 } 2039 } 2040 2041 // We look for opportunities to use CopyTexSubImage, or fbo blit. If neither are 2042 // possible and we return false to fallback to creating a render target dst for render-to- 2043 // texture. This code prefers CopyTexSubImage to fbo blit and avoids triggering temporary fbo 2044 // creation. It isn't clear that avoiding temporary fbo creation is actually optimal. 2045 GrSurfaceOrigin originForBlitFramebuffer = kTopLeft_GrSurfaceOrigin; 2046 bool rectsMustMatchForBlitFramebuffer = false; 2047 bool disallowSubrectForBlitFramebuffer = false; 2048 if (src->numColorSamples() > 1 && 2049 (this->blitFramebufferSupportFlags() & kResolveMustBeFull_BlitFrambufferFlag)) { 2050 rectsMustMatchForBlitFramebuffer = true; 2051 disallowSubrectForBlitFramebuffer = true; 2052 // Mirroring causes rects to mismatch later, don't allow it. 2053 originForBlitFramebuffer = src->origin(); 2054 } else if (src->numColorSamples() > 1 && (this->blitFramebufferSupportFlags() & 2055 kRectsMustMatchForMSAASrc_BlitFramebufferFlag)) { 2056 rectsMustMatchForBlitFramebuffer = true; 2057 // Mirroring causes rects to mismatch later, don't allow it. 2058 originForBlitFramebuffer = src->origin(); 2059 } else if (this->blitFramebufferSupportFlags() & kNoScalingOrMirroring_BlitFramebufferFlag) { 2060 originForBlitFramebuffer = src->origin(); 2061 } 2062 2063 // Check for format issues with glCopyTexSubImage2D 2064 if (this->bgraIsInternalFormat() && kBGRA_8888_GrPixelConfig == src->config()) { 2065 // glCopyTexSubImage2D doesn't work with this config. If the bgra can be used with fbo blit 2066 // then we set up for that, otherwise fail. 2067 if (this->canConfigBeFBOColorAttachment(kBGRA_8888_GrPixelConfig)) { 2068 desc->fOrigin = originForBlitFramebuffer; 2069 desc->fConfig = kBGRA_8888_GrPixelConfig; 2070 *rectsMustMatch = rectsMustMatchForBlitFramebuffer; 2071 *disallowSubrect = disallowSubrectForBlitFramebuffer; 2072 return true; 2073 } 2074 return false; 2075 } 2076 2077 { 2078 bool srcIsMSAARenderbuffer = GrFSAAType::kUnifiedMSAA == src->fsaaType() && 2079 this->usesMSAARenderBuffers(); 2080 if (srcIsMSAARenderbuffer) { 2081 // It's illegal to call CopyTexSubImage2D on a MSAA renderbuffer. Set up for FBO 2082 // blit or fail. 2083 if (this->canConfigBeFBOColorAttachment(src->config())) { 2084 desc->fOrigin = originForBlitFramebuffer; 2085 desc->fConfig = src->config(); 2086 *rectsMustMatch = rectsMustMatchForBlitFramebuffer; 2087 *disallowSubrect = disallowSubrectForBlitFramebuffer; 2088 return true; 2089 } 2090 return false; 2091 } 2092 } 2093 2094 // We'll do a CopyTexSubImage. Make the dst a plain old texture. 2095 desc->fConfig = src->config(); 2096 desc->fOrigin = src->origin(); 2097 desc->fFlags = kNone_GrSurfaceFlags; 2098 return true; 2099 } 2100 2101 void GrGLCaps::applyDriverCorrectnessWorkarounds(const GrGLContextInfo& ctxInfo, 2102 const GrContextOptions& contextOptions, 2103 GrShaderCaps* shaderCaps) { 2104 // A driver but on the nexus 6 causes incorrect dst copies when invalidate is called beforehand. 2105 // Thus we are blacklisting this extension for now on Adreno4xx devices. 2106 if (kAdreno4xx_GrGLRenderer == ctxInfo.renderer()) { 2107 fDiscardRenderTargetSupport = false; 2108 fInvalidateFBType = kNone_InvalidateFBType; 2109 } 2110 2111 // glClearTexImage seems to have a bug in NVIDIA drivers that was fixed sometime between 2112 // 340.96 and 367.57. 2113 if (kGL_GrGLStandard == ctxInfo.standard() && 2114 ctxInfo.driver() == kNVIDIA_GrGLDriver && 2115 ctxInfo.driverVersion() < GR_GL_DRIVER_VER(367, 57)) { 2116 fClearTextureSupport = false; 2117 } 2118 2119 // Calling glClearTexImage crashes on the NexusPlayer. 2120 if (kPowerVRRogue_GrGLRenderer == ctxInfo.renderer()) { 2121 fClearTextureSupport = false; 2122 } 2123 2124 // On at least some MacBooks, GLSL 4.0 geometry shaders break if we use invocations. 2125 #ifdef SK_BUILD_FOR_MAC 2126 if (shaderCaps->fGeometryShaderSupport) { 2127 shaderCaps->fGSInvocationsSupport = false; 2128 } 2129 #endif 2130 2131 // Qualcomm driver @103.0 has been observed to crash compiling ccpr geometry 2132 // shaders. @127.0 is the earliest verified driver to not crash. 2133 if (kQualcomm_GrGLDriver == ctxInfo.driver() && 2134 ctxInfo.driverVersion() < GR_GL_DRIVER_VER(127,0)) { 2135 shaderCaps->fGeometryShaderSupport = false; 2136 } 2137 2138 #if defined(__has_feature) 2139 #if defined(SK_BUILD_FOR_MAC) && __has_feature(thread_sanitizer) 2140 // See skbug.com/7058 2141 fMapBufferType = kNone_MapBufferType; 2142 fMapBufferFlags = kNone_MapFlags; 2143 #endif 2144 #endif 2145 2146 // We found that the Galaxy J5 with an Adreno 306 running 6.0.1 has a bug where 2147 // GL_INVALID_OPERATION thrown by glDrawArrays when using a buffer that was mapped. The same bug 2148 // did not reproduce on a Nexus7 2013 with a 320 running Android M with driver 127.0. It's 2149 // unclear whether this really affects a wide range of devices. 2150 if (ctxInfo.renderer() == kAdreno3xx_GrGLRenderer && 2151 ctxInfo.driverVersion() > GR_GL_DRIVER_VER(127, 0)) { 2152 fMapBufferType = kNone_MapBufferType; 2153 fMapBufferFlags = kNone_MapFlags; 2154 } 2155 2156 // TODO: re-enable for ANGLE 2157 if (kANGLE_GrGLDriver == ctxInfo.driver()) { 2158 fTransferBufferType = kNone_TransferBufferType; 2159 } 2160 2161 // Using MIPs on this GPU seems to be a source of trouble. 2162 if (kPowerVR54x_GrGLRenderer == ctxInfo.renderer()) { 2163 fMipMapSupport = false; 2164 } 2165 2166 if (kPowerVRRogue_GrGLRenderer == ctxInfo.renderer()) { 2167 // Temporarily disabling clip analytic fragments processors on Nexus player while we work 2168 // around a driver bug related to gl_FragCoord. 2169 // https://bugs.chromium.org/p/skia/issues/detail?id=7286 2170 fMaxClipAnalyticFPs = 0; 2171 } 2172 2173 #ifndef SK_BUILD_FOR_IOS 2174 if (kPowerVR54x_GrGLRenderer == ctxInfo.renderer() || 2175 kPowerVRRogue_GrGLRenderer == ctxInfo.renderer() || 2176 (kAdreno3xx_GrGLRenderer == ctxInfo.renderer() && 2177 ctxInfo.driver() != kChromium_GrGLDriver)) { 2178 fUseDrawToClearColor = true; 2179 } 2180 #endif 2181 2182 // A lot of GPUs have trouble with full screen clears (skbug.com/7195) 2183 if (kAMDRadeonHD7xxx_GrGLRenderer == ctxInfo.renderer() || 2184 kAMDRadeonR9M4xx_GrGLRenderer == ctxInfo.renderer()) { 2185 fUseDrawToClearColor = true; 2186 } 2187 2188 #ifdef SK_BUILD_FOR_MAC 2189 // crbug.com/768134 - On MacBook Pros, the Intel Iris Pro doesn't always perform 2190 // full screen clears 2191 // crbug.com/773107 - On MacBook Pros, a wide range of Intel GPUs don't always 2192 // perform full screen clears. 2193 if (kIntel_GrGLVendor == ctxInfo.vendor()) { 2194 fUseDrawToClearColor = true; 2195 } 2196 #endif 2197 2198 // See crbug.com/755871. This could probably be narrowed to just partial clears as the driver 2199 // bugs seems to involve clearing too much and not skipping the clear. 2200 // See crbug.com/768134. This is also needed for full clears and was seen on an nVidia K620 2201 // but only for D3D11 ANGLE. 2202 if (GrGLANGLEBackend::kD3D11 == ctxInfo.angleBackend()) { 2203 fUseDrawToClearColor = true; 2204 } 2205 2206 if (kAdreno4xx_GrGLRenderer == ctxInfo.renderer()) { 2207 // This is known to be fixed sometime between driver 145.0 and 219.0 2208 if (ctxInfo.driverVersion() <= GR_GL_DRIVER_VER(219, 0)) { 2209 fUseDrawToClearStencilClip = true; 2210 } 2211 fDisallowTexSubImageForUnormConfigTexturesEverBoundToFBO = true; 2212 } 2213 2214 // This was reproduced on the following configurations: 2215 // - A Galaxy J5 (Adreno 306) running Android 6 with driver 140.0 2216 // - A Nexus 7 2013 (Adreno 320) running Android 5 with driver 104.0 2217 // - A Nexus 7 2013 (Adreno 320) running Android 6 with driver 127.0 2218 // - A Nexus 5 (Adreno 330) running Android 6 with driver 127.0 2219 // and not produced on: 2220 // - A Nexus 7 2013 (Adreno 320) running Android 4 with driver 53.0 2221 // The particular lines that get dropped from test images varies across different devices. 2222 if (kAdreno3xx_GrGLRenderer == ctxInfo.renderer() && 2223 ctxInfo.driverVersion() > GR_GL_DRIVER_VER(53, 0)) { 2224 fRequiresCullFaceEnableDisableWhenDrawingLinesAfterNonLines = true; 2225 } 2226 2227 // Our Chromebook with kPowerVRRogue_GrGLRenderer seems to crash when glDrawArraysInstanced is 2228 // given 1 << 15 or more instances. 2229 if (kPowerVRRogue_GrGLRenderer == ctxInfo.renderer()) { 2230 fMaxInstancesPerDrawArraysWithoutCrashing = 0x7fff; 2231 } 2232 2233 // Texture uploads sometimes seem to be ignored to textures bound to FBOS on Tegra3. 2234 if (kTegra3_GrGLRenderer == ctxInfo.renderer()) { 2235 fDisallowTexSubImageForUnormConfigTexturesEverBoundToFBO = true; 2236 fUseDrawInsteadOfAllRenderTargetWrites = true; 2237 } 2238 2239 if (kGL_GrGLStandard == ctxInfo.standard() && kIntel_GrGLVendor == ctxInfo.vendor() ) { 2240 fSampleShadingSupport = false; 2241 } 2242 2243 #ifdef SK_BUILD_FOR_MAC 2244 static constexpr bool isMAC = true; 2245 #else 2246 static constexpr bool isMAC = false; 2247 #endif 2248 2249 // We support manual mip-map generation (via iterative downsampling draw calls). This fixes 2250 // bugs on some cards/drivers that produce incorrect mip-maps for sRGB textures when using 2251 // glGenerateMipmap. Our implementation requires mip-level sampling control. Additionally, 2252 // it can be much slower (especially on mobile GPUs), so we opt-in only when necessary: 2253 if (fMipMapLevelAndLodControlSupport && 2254 (contextOptions.fDoManualMipmapping || 2255 (kIntel_GrGLVendor == ctxInfo.vendor()) || 2256 (kNVIDIA_GrGLDriver == ctxInfo.driver() && isMAC) || 2257 (kATI_GrGLVendor == ctxInfo.vendor()))) { 2258 fDoManualMipmapping = true; 2259 } 2260 2261 // See http://crbug.com/710443 2262 #ifdef SK_BUILD_FOR_MAC 2263 if (kIntel6xxx_GrGLRenderer == ctxInfo.renderer()) { 2264 fClearToBoundaryValuesIsBroken = true; 2265 } 2266 #endif 2267 if (kQualcomm_GrGLVendor == ctxInfo.vendor()) { 2268 fDrawArraysBaseVertexIsBroken = true; 2269 } 2270 2271 // The ccpr vertex-shader implementation does not work on this platform. Only allow CCPR with 2272 // GS. 2273 2274 if (kANGLE_GrGLRenderer == ctxInfo.renderer() && 2275 GrGLANGLERenderer::kSkylake == ctxInfo.angleRenderer()) { 2276 bool gsSupport = fShaderCaps->geometryShaderSupport(); 2277 #if GR_TEST_UTILS 2278 gsSupport &= !contextOptions.fSuppressGeometryShaders; 2279 #endif 2280 fBlacklistCoverageCounting = !gsSupport; 2281 } 2282 2283 // Adreno GPUs have a tendency to drop tiles when there is a divide-by-zero in a shader 2284 shaderCaps->fDropsTileOnZeroDivide = kQualcomm_GrGLVendor == ctxInfo.vendor(); 2285 2286 // On the NexusS and GalaxyNexus, the use of 'any' causes the compilation error "Calls to any 2287 // function that may require a gradient calculation inside a conditional block may return 2288 // undefined results". This appears to be an issue with the 'any' call since even the simple 2289 // "result=black; if (any()) result=white;" code fails to compile. This issue comes into play 2290 // from our GrTextureDomain processor. 2291 shaderCaps->fCanUseAnyFunctionInShader = kImagination_GrGLVendor != ctxInfo.vendor(); 2292 2293 // Known issue on at least some Intel platforms: 2294 // http://code.google.com/p/skia/issues/detail?id=946 2295 if (kIntel_GrGLVendor == ctxInfo.vendor()) { 2296 shaderCaps->fFragCoordConventionsExtensionString = nullptr; 2297 } 2298 2299 if (kTegra3_GrGLRenderer == ctxInfo.renderer()) { 2300 // The Tegra3 compiler will sometimes never return if we have min(abs(x), 1.0), 2301 // so we must do the abs first in a separate expression. 2302 shaderCaps->fCanUseMinAndAbsTogether = false; 2303 2304 // Tegra3 fract() seems to trigger undefined behavior for negative values, so we 2305 // must avoid this condition. 2306 shaderCaps->fCanUseFractForNegativeValues = false; 2307 } 2308 2309 // On Intel GPU there is an issue where it reads the second argument to atan "- %s.x" as an int 2310 // thus must us -1.0 * %s.x to work correctly 2311 if (kIntel_GrGLVendor == ctxInfo.vendor()) { 2312 shaderCaps->fMustForceNegatedAtanParamToFloat = true; 2313 } 2314 2315 // On some Intel GPUs there is an issue where the driver outputs bogus values in the shader 2316 // when floor and abs are called on the same line. Thus we must execute an Op between them to 2317 // make sure the compiler doesn't re-inline them even if we break the calls apart. 2318 if (kIntel_GrGLVendor == ctxInfo.vendor()) { 2319 shaderCaps->fMustDoOpBetweenFloorAndAbs = true; 2320 } 2321 2322 // On Adreno devices with framebuffer fetch support, there is a bug where they always return 2323 // the original dst color when reading the outColor even after being written to. By using a 2324 // local outColor we can work around this bug. 2325 if (shaderCaps->fFBFetchSupport && kQualcomm_GrGLVendor == ctxInfo.vendor()) { 2326 shaderCaps->fRequiresLocalOutputColorForFBFetch = true; 2327 } 2328 2329 // Newer Mali GPUs do incorrect static analysis in specific situations: If there is uniform 2330 // color, and that uniform contains an opaque color, and the output of the shader is only based 2331 // on that uniform plus soemthing un-trackable (like a texture read), the compiler will deduce 2332 // that the shader always outputs opaque values. In that case, it appears to remove the shader 2333 // based blending code it normally injects, turning SrcOver into Src. To fix this, we always 2334 // insert an extra bit of math on the uniform that confuses the compiler just enough... 2335 if (kMaliT_GrGLRenderer == ctxInfo.renderer()) { 2336 shaderCaps->fMustObfuscateUniformColor = true; 2337 } 2338 #ifdef SK_BUILD_FOR_WIN 2339 // Check for ANGLE on Windows, so we can workaround a bug in D3D itself (anglebug.com/2098). 2340 // 2341 // Basically, if a shader has a construct like: 2342 // 2343 // float x = someCondition ? someValue : 0; 2344 // float2 result = (0 == x) ? float2(x, x) 2345 // : float2(2 * x / x, 0); 2346 // 2347 // ... the compiler will produce an error 'NaN and infinity literals not allowed', even though 2348 // we've explicitly guarded the division with a check against zero. This manifests in much 2349 // more complex ways in some of our shaders, so we use this caps bit to add an epsilon value 2350 // to the denominator of divisions, even when we've added checks that the denominator isn't 0. 2351 if (kANGLE_GrGLDriver == ctxInfo.driver() || kChromium_GrGLDriver == ctxInfo.driver()) { 2352 shaderCaps->fMustGuardDivisionEvenAfterExplicitZeroCheck = true; 2353 } 2354 #endif 2355 2356 // We've seen Adreno 3xx devices produce incorrect (flipped) values for gl_FragCoord, in some 2357 // (rare) situations. It's sporadic, and mostly on older drivers. It also seems to be the case 2358 // that the interpolation of vertex shader outputs is quite inaccurate. 2359 if (kAdreno3xx_GrGLRenderer == ctxInfo.renderer()) { 2360 shaderCaps->fCanUseFragCoord = false; 2361 shaderCaps->fInterpolantsAreInaccurate = true; 2362 } 2363 2364 // Disabling advanced blend on various platforms with major known issues. We also block Chrome 2365 // for now until its own blacklists can be updated. 2366 if (kAdreno4xx_GrGLRenderer == ctxInfo.renderer() || 2367 kAdreno5xx_GrGLRenderer == ctxInfo.renderer() || 2368 kIntel_GrGLDriver == ctxInfo.driver() || 2369 kChromium_GrGLDriver == ctxInfo.driver()) { 2370 fBlendEquationSupport = kBasic_BlendEquationSupport; 2371 shaderCaps->fAdvBlendEqInteraction = GrShaderCaps::kNotSupported_AdvBlendEqInteraction; 2372 } 2373 2374 // Non-coherent advanced blend has an issue on NVIDIA pre 337.00. 2375 if (kNVIDIA_GrGLDriver == ctxInfo.driver() && 2376 ctxInfo.driverVersion() < GR_GL_DRIVER_VER(337,00) && 2377 kAdvanced_BlendEquationSupport == fBlendEquationSupport) { 2378 fBlendEquationSupport = kBasic_BlendEquationSupport; 2379 shaderCaps->fAdvBlendEqInteraction = GrShaderCaps::kNotSupported_AdvBlendEqInteraction; 2380 } 2381 2382 if (this->advancedBlendEquationSupport()) { 2383 if (kNVIDIA_GrGLDriver == ctxInfo.driver() && 2384 ctxInfo.driverVersion() < GR_GL_DRIVER_VER(355,00)) { 2385 // Blacklist color-dodge and color-burn on pre-355.00 NVIDIA. 2386 fAdvBlendEqBlacklist |= (1 << kColorDodge_GrBlendEquation) | 2387 (1 << kColorBurn_GrBlendEquation); 2388 } 2389 if (kARM_GrGLVendor == ctxInfo.vendor()) { 2390 // Blacklist color-burn on ARM until the fix is released. 2391 fAdvBlendEqBlacklist |= (1 << kColorBurn_GrBlendEquation); 2392 } 2393 } 2394 2395 // Workaround NVIDIA bug related to glInvalidateFramebuffer and mixed samples. 2396 if (fMultisampleDisableSupport && 2397 this->shaderCaps()->dualSourceBlendingSupport() && 2398 this->shaderCaps()->pathRenderingSupport() && 2399 fUsesMixedSamples && 2400 #if GR_TEST_UTILS 2401 (contextOptions.fGpuPathRenderers & GpuPathRenderers::kStencilAndCover) && 2402 #endif 2403 (kNVIDIA_GrGLDriver == ctxInfo.driver() || 2404 kChromium_GrGLDriver == ctxInfo.driver())) { 2405 fDiscardRenderTargetSupport = false; 2406 fInvalidateFBType = kNone_InvalidateFBType; 2407 } 2408 } 2409 2410 void GrGLCaps::onApplyOptionsOverrides(const GrContextOptions& options) { 2411 if (options.fDisableDriverCorrectnessWorkarounds) { 2412 SkASSERT(!fDoManualMipmapping); 2413 SkASSERT(!fClearToBoundaryValuesIsBroken); 2414 SkASSERT(0 == fMaxInstancesPerDrawArraysWithoutCrashing); 2415 SkASSERT(!fDrawArraysBaseVertexIsBroken); 2416 SkASSERT(!fUseDrawToClearColor); 2417 SkASSERT(!fUseDrawToClearStencilClip); 2418 SkASSERT(!fDisallowTexSubImageForUnormConfigTexturesEverBoundToFBO); 2419 SkASSERT(!fUseDrawInsteadOfAllRenderTargetWrites); 2420 SkASSERT(!fRequiresCullFaceEnableDisableWhenDrawingLinesAfterNonLines); 2421 } 2422 if (GrContextOptions::Enable::kNo == options.fUseDrawInsteadOfGLClear) { 2423 fUseDrawToClearColor = false; 2424 } else if (GrContextOptions::Enable::kYes == options.fUseDrawInsteadOfGLClear) { 2425 fUseDrawToClearColor = true; 2426 } 2427 if (options.fDoManualMipmapping) { 2428 fDoManualMipmapping = true; 2429 } 2430 } 2431 2432 bool GrGLCaps::surfaceSupportsWritePixels(const GrSurface* surface) const { 2433 if (fDisallowTexSubImageForUnormConfigTexturesEverBoundToFBO) { 2434 if (auto tex = static_cast<const GrGLTexture*>(surface->asTexture())) { 2435 if (tex->hasBaseLevelBeenBoundToFBO()) { 2436 return false; 2437 } 2438 } 2439 } 2440 if (auto rt = surface->asRenderTarget()) { 2441 if (fUseDrawInsteadOfAllRenderTargetWrites) { 2442 return false; 2443 } 2444 if (rt->numColorSamples() > 1 && this->usesMSAARenderBuffers()) { 2445 return false; 2446 } 2447 return SkToBool(surface->asTexture()); 2448 } 2449 return true; 2450 } 2451 2452 bool GrGLCaps::onIsMixedSamplesSupportedForRT(const GrBackendRenderTarget& backendRT) const { 2453 const GrGLFramebufferInfo* fbInfo = backendRT.getGLFramebufferInfo(); 2454 SkASSERT(fbInfo); 2455 // Mixed samples are not supported for FBO 0; 2456 return fbInfo->fFBOID != 0; 2457 } 2458 2459 bool GrGLCaps::onIsWindowRectanglesSupportedForRT(const GrBackendRenderTarget& backendRT) const { 2460 const GrGLFramebufferInfo* fbInfo = backendRT.getGLFramebufferInfo(); 2461 SkASSERT(fbInfo); 2462 // Window Rectangles are not supported for FBO 0; 2463 return fbInfo->fFBOID != 0; 2464 } 2465 2466 int GrGLCaps::getRenderTargetSampleCount(int requestedCount, GrPixelConfig config) const { 2467 requestedCount = SkTMax(1, requestedCount); 2468 int count = fConfigTable[config].fColorSampleCounts.count(); 2469 if (!count) { 2470 return 0; 2471 } 2472 2473 if (1 == requestedCount) { 2474 return fConfigTable[config].fColorSampleCounts[0] == 1 ? 1 : 0; 2475 } 2476 2477 for (int i = 0; i < count; ++i) { 2478 if (fConfigTable[config].fColorSampleCounts[i] >= requestedCount) { 2479 return fConfigTable[config].fColorSampleCounts[i]; 2480 } 2481 } 2482 return 0; 2483 } 2484 2485 int GrGLCaps::maxRenderTargetSampleCount(GrPixelConfig config) const { 2486 const auto& table = fConfigTable[config].fColorSampleCounts; 2487 if (!table.count()) { 2488 return 0; 2489 } 2490 return table[table.count() - 1]; 2491 } 2492 2493 bool validate_sized_format(GrGLenum format, SkColorType ct, GrPixelConfig* config, 2494 GrGLStandard standard) { 2495 *config = kUnknown_GrPixelConfig; 2496 2497 switch (ct) { 2498 case kUnknown_SkColorType: 2499 return false; 2500 case kAlpha_8_SkColorType: 2501 if (GR_GL_ALPHA8 == format) { 2502 *config = kAlpha_8_as_Alpha_GrPixelConfig; 2503 } else if (GR_GL_R8 == format) { 2504 *config = kAlpha_8_as_Red_GrPixelConfig; 2505 } 2506 break; 2507 case kRGB_565_SkColorType: 2508 if (GR_GL_RGB565 == format) { 2509 *config = kRGB_565_GrPixelConfig; 2510 } 2511 break; 2512 case kARGB_4444_SkColorType: 2513 if (GR_GL_RGBA4 == format) { 2514 *config = kRGBA_4444_GrPixelConfig; 2515 } 2516 break; 2517 case kRGBA_8888_SkColorType: 2518 if (GR_GL_RGBA8 == format) { 2519 *config = kRGBA_8888_GrPixelConfig; 2520 } else if (GR_GL_SRGB8_ALPHA8 == format) { 2521 *config = kSRGBA_8888_GrPixelConfig; 2522 } 2523 break; 2524 case kRGB_888x_SkColorType: 2525 return false; 2526 case kBGRA_8888_SkColorType: 2527 if (GR_GL_RGBA8 == format) { 2528 if (kGL_GrGLStandard == standard) { 2529 *config = kBGRA_8888_GrPixelConfig; 2530 } 2531 } else if (GR_GL_BGRA8 == format) { 2532 if (kGLES_GrGLStandard == standard) { 2533 *config = kBGRA_8888_GrPixelConfig; 2534 } 2535 } else if (GR_GL_SRGB8_ALPHA8 == format) { 2536 *config = kSBGRA_8888_GrPixelConfig; 2537 } 2538 break; 2539 case kRGBA_1010102_SkColorType: 2540 if (GR_GL_RGB10_A2 == format) { 2541 *config = kRGBA_1010102_GrPixelConfig; 2542 } 2543 break; 2544 case kRGB_101010x_SkColorType: 2545 return false; 2546 case kGray_8_SkColorType: 2547 if (GR_GL_LUMINANCE8 == format) { 2548 *config = kGray_8_as_Lum_GrPixelConfig; 2549 } else if (GR_GL_R8 == format) { 2550 *config = kGray_8_as_Red_GrPixelConfig; 2551 } 2552 break; 2553 case kRGBA_F16_SkColorType: 2554 if (GR_GL_RGBA16F == format) { 2555 *config = kRGBA_half_GrPixelConfig; 2556 } 2557 break; 2558 } 2559 2560 return kUnknown_GrPixelConfig != *config; 2561 } 2562 2563 bool GrGLCaps::validateBackendTexture(const GrBackendTexture& tex, SkColorType ct, 2564 GrPixelConfig* config) const { 2565 const GrGLTextureInfo* texInfo = tex.getGLTextureInfo(); 2566 if (!texInfo) { 2567 return false; 2568 } 2569 return validate_sized_format(texInfo->fFormat, ct, config, fStandard); 2570 } 2571 2572 bool GrGLCaps::validateBackendRenderTarget(const GrBackendRenderTarget& rt, SkColorType ct, 2573 GrPixelConfig* config) const { 2574 const GrGLFramebufferInfo* fbInfo = rt.getGLFramebufferInfo(); 2575 if (!fbInfo) { 2576 return false; 2577 } 2578 return validate_sized_format(fbInfo->fFormat, ct, config, fStandard); 2579 } 2580 2581 bool GrGLCaps::getConfigFromBackendFormat(const GrBackendFormat& format, SkColorType ct, 2582 GrPixelConfig* config) const { 2583 const GrGLenum* glFormat = format.getGLFormat(); 2584 if (!glFormat) { 2585 return false; 2586 } 2587 return validate_sized_format(*glFormat, ct, config, fStandard); 2588 } 2589 2590 2591