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