blob: 88ed455bb11cb6c2678af3acdb35751ab9fdefe0 [file] [log] [blame]
bsalomon@google.comf7fa8062012-02-14 14:09:57 +00001/*
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
9#include "GrGLCaps.h"
joshualittb4384b92014-10-21 12:53:15 -070010
egdanielb7e7d572015-11-04 04:23:53 -080011#include "GrContextOptions.h"
robertphillips@google.com6177e692013-02-28 20:16:25 +000012#include "GrGLContext.h"
bsalomon1aa20292016-01-22 08:16:09 -080013#include "GrGLRenderTarget.h"
jvanverthcba99b82015-06-24 06:59:57 -070014#include "glsl/GrGLSLCaps.h"
bsalomon@google.comc9668ec2012-04-11 18:16:41 +000015#include "SkTSearch.h"
bsalomon@google.com20f7f172013-05-17 19:05:03 +000016#include "SkTSort.h"
bsalomon@google.comf7fa8062012-02-14 14:09:57 +000017
bsalomon682c2692015-05-22 14:01:46 -070018GrGLCaps::GrGLCaps(const GrContextOptions& contextOptions,
19 const GrGLContextInfo& ctxInfo,
20 const GrGLInterface* glInterface) : INHERITED(contextOptions) {
bsalomon1aa20292016-01-22 08:16:09 -080021 fStandard = ctxInfo.standard();
22
bsalomon@google.comf7fa8062012-02-14 14:09:57 +000023 fStencilFormats.reset();
bsalomon@google.comf7fa8062012-02-14 14:09:57 +000024 fMSFBOType = kNone_MSFBOType;
commit-bot@chromium.org52ffbf62014-04-02 16:19:33 +000025 fInvalidateFBType = kNone_InvalidateFBType;
commit-bot@chromium.org160b4782014-05-05 12:32:37 +000026 fMapBufferType = kNone_MapBufferType;
jvanverthd7a2c1f2015-12-07 07:36:44 -080027 fTransferBufferType = kNone_TransferBufferType;
bsalomon@google.comf7fa8062012-02-14 14:09:57 +000028 fMaxFragmentUniformVectors = 0;
bsalomon@google.comf7fa8062012-02-14 14:09:57 +000029 fUnpackRowLengthSupport = false;
30 fUnpackFlipYSupport = false;
31 fPackRowLengthSupport = false;
32 fPackFlipYSupport = false;
33 fTextureUsageSupport = false;
robertphillips@google.com443e5a52012-04-30 20:01:21 +000034 fTextureRedSupport = false;
bsalomon@google.come76b7cc2012-06-18 12:47:06 +000035 fImagingSupport = false;
bsalomon@google.com07631cf2013-03-05 14:14:58 +000036 fVertexArrayObjectSupport = false;
cdalton626e1ff2015-06-12 13:56:46 -070037 fDirectStateAccessSupport = false;
38 fDebugSupport = false;
jvanverth3f801cb2014-12-16 09:49:38 -080039 fES2CompatibilitySupport = false;
cdaltond4727922015-11-10 12:49:06 -080040 fMultisampleDisableSupport = false;
cdalton06604b92016-02-05 10:09:51 -080041 fDrawIndirectSupport = false;
42 fMultiDrawIndirectSupport = false;
43 fBaseInstanceSupport = false;
bsalomon@google.com96966a52013-02-21 16:34:21 +000044 fUseNonVBOVertexAndIndexDynamicData = false;
bsalomon@google.com2b1b8c02013-02-28 22:06:02 +000045 fIsCoreProfile = false;
joshualittc1f56b52015-06-22 12:31:31 -070046 fBindFragDataLocationSupport = false;
bsalomone5286e02016-01-14 09:24:09 -080047 fRectangleTextureSupport = false;
bsalomoncdee0092016-01-08 13:20:12 -080048 fTextureSwizzleSupport = false;
bsalomon88c7b982015-07-31 11:20:16 -070049 fRGBA8888PixelsOpsAreSlow = false;
50 fPartialFBOReadIsSlow = false;
cblume09bd2c02016-03-01 14:08:28 -080051 fMipMapLevelAndLodControlSupport = false;
ericrkb4ecabd2016-03-11 15:18:20 -080052 fRGBAToBGRAReadbackConversionsAreSlow = false;
brianosman09563ce2016-06-02 08:59:34 -070053 fDoManualMipmapping = false;
piotaixre4b23142014-10-02 10:57:53 -070054
bsalomon083617b2016-02-12 12:10:14 -080055 fBlitFramebufferSupport = kNone_BlitFramebufferSupport;
56
halcanary385fe4d2015-08-26 13:07:48 -070057 fShaderCaps.reset(new GrGLSLCaps(contextOptions));
bsalomon4ee6bd82015-05-27 13:23:23 -070058
cdalton4cd67132015-06-10 19:23:46 -070059 this->init(contextOptions, ctxInfo, glInterface);
bsalomon@google.comf7fa8062012-02-14 14:09:57 +000060}
61
cdalton4cd67132015-06-10 19:23:46 -070062void GrGLCaps::init(const GrContextOptions& contextOptions,
63 const GrGLContextInfo& ctxInfo,
64 const GrGLInterface* gli) {
commit-bot@chromium.org9e90aed2014-01-16 16:35:09 +000065 GrGLStandard standard = ctxInfo.standard();
bsalomon@google.comf7fa8062012-02-14 14:09:57 +000066 GrGLVersion version = ctxInfo.version();
67
bsalomon@google.combcce8922013-03-25 15:38:39 +000068 /**************************************************************************
69 * Caps specific to GrGLCaps
70 **************************************************************************/
71
commit-bot@chromium.org9e90aed2014-01-16 16:35:09 +000072 if (kGLES_GrGLStandard == standard) {
bsalomon@google.comf7fa8062012-02-14 14:09:57 +000073 GR_GL_GetIntegerv(gli, GR_GL_MAX_FRAGMENT_UNIFORM_VECTORS,
74 &fMaxFragmentUniformVectors);
75 } else {
commit-bot@chromium.org9e90aed2014-01-16 16:35:09 +000076 SkASSERT(kGL_GrGLStandard == standard);
bsalomon@google.comf7fa8062012-02-14 14:09:57 +000077 GrGLint max;
78 GR_GL_GetIntegerv(gli, GR_GL_MAX_FRAGMENT_UNIFORM_COMPONENTS, &max);
79 fMaxFragmentUniformVectors = max / 4;
commit-bot@chromium.org46fbfe02013-08-30 15:52:12 +000080 if (version >= GR_GL_VER(3, 2)) {
81 GrGLint profileMask;
82 GR_GL_GetIntegerv(gli, GR_GL_CONTEXT_PROFILE_MASK, &profileMask);
83 fIsCoreProfile = SkToBool(profileMask & GR_GL_CONTEXT_CORE_PROFILE_BIT);
84 }
bsalomon@google.comf7fa8062012-02-14 14:09:57 +000085 }
bsalomon@google.com60da4172012-06-01 19:25:00 +000086 GR_GL_GetIntegerv(gli, GR_GL_MAX_VERTEX_ATTRIBS, &fMaxVertexAttributes);
bsalomon@google.comf7fa8062012-02-14 14:09:57 +000087
commit-bot@chromium.org9e90aed2014-01-16 16:35:09 +000088 if (kGL_GrGLStandard == standard) {
bsalomon@google.comf7fa8062012-02-14 14:09:57 +000089 fUnpackRowLengthSupport = true;
90 fUnpackFlipYSupport = false;
91 fPackRowLengthSupport = true;
92 fPackFlipYSupport = false;
93 } else {
commit-bot@chromium.orgdc3134c2013-08-16 16:12:23 +000094 fUnpackRowLengthSupport = version >= GR_GL_VER(3,0) ||
95 ctxInfo.hasExtension("GL_EXT_unpack_subimage");
bsalomon@google.comf7fa8062012-02-14 14:09:57 +000096 fUnpackFlipYSupport = ctxInfo.hasExtension("GL_CHROMIUM_flipy");
commit-bot@chromium.orgdc3134c2013-08-16 16:12:23 +000097 fPackRowLengthSupport = version >= GR_GL_VER(3,0) ||
98 ctxInfo.hasExtension("GL_NV_pack_subimage");
bsalomon@google.comf7fa8062012-02-14 14:09:57 +000099 fPackFlipYSupport =
100 ctxInfo.hasExtension("GL_ANGLE_pack_reverse_row_order");
101 }
102
commit-bot@chromium.org9e90aed2014-01-16 16:35:09 +0000103 fTextureUsageSupport = (kGLES_GrGLStandard == standard) &&
bsalomon@google.comf7fa8062012-02-14 14:09:57 +0000104 ctxInfo.hasExtension("GL_ANGLE_texture_usage");
105
commit-bot@chromium.org9e90aed2014-01-16 16:35:09 +0000106 if (kGL_GrGLStandard == standard) {
cdaltonfd4167d2015-04-21 11:45:56 -0700107 fTextureBarrierSupport = version >= GR_GL_VER(4,5) ||
108 ctxInfo.hasExtension("GL_ARB_texture_barrier") ||
109 ctxInfo.hasExtension("GL_NV_texture_barrier");
110 } else {
111 fTextureBarrierSupport = ctxInfo.hasExtension("GL_NV_texture_barrier");
112 }
113
cdaltoneb79eea2016-02-26 10:39:34 -0800114 if (kGL_GrGLStandard == standard) {
115 fSampleLocationsSupport = version >= GR_GL_VER(3,2) ||
116 ctxInfo.hasExtension("GL_ARB_texture_multisample");
117 } else {
118 fSampleLocationsSupport = version >= GR_GL_VER(3,1);
119 }
120
halcanary9d524f22016-03-29 09:03:52 -0700121 // ARB_texture_rg is part of OpenGL 3.0, but mesa doesn't support GL_RED
hendrikwa0d5ad72014-12-02 07:30:30 -0800122 // and GL_RG on FBO textures.
cdalton1acea862015-06-02 13:05:52 -0700123 if (kMesa_GrGLDriver != ctxInfo.driver()) {
hendrikwa0d5ad72014-12-02 07:30:30 -0800124 if (kGL_GrGLStandard == standard) {
commit-bot@chromium.org459104c2013-06-14 14:42:56 +0000125 fTextureRedSupport = version >= GR_GL_VER(3,0) ||
126 ctxInfo.hasExtension("GL_ARB_texture_rg");
hendrikwa0d5ad72014-12-02 07:30:30 -0800127 } else {
128 fTextureRedSupport = version >= GR_GL_VER(3,0) ||
129 ctxInfo.hasExtension("GL_EXT_texture_rg");
commit-bot@chromium.org459104c2013-06-14 14:42:56 +0000130 }
robertphillips@google.com443e5a52012-04-30 20:01:21 +0000131 }
commit-bot@chromium.org9e90aed2014-01-16 16:35:09 +0000132 fImagingSupport = kGL_GrGLStandard == standard &&
bsalomon@google.come76b7cc2012-06-18 12:47:06 +0000133 ctxInfo.hasExtension("GL_ARB_imaging");
134
bsalomon@google.com3012ded2013-02-22 16:44:04 +0000135 // SGX and Mali GPUs that are based on a tiled-deferred architecture that have trouble with
136 // frequently changing VBOs. We've measured a performance increase using non-VBO vertex
137 // data for dynamic content on these GPUs. Perhaps we should read the renderer string and
138 // limit this decision to specific GPU families rather than basing it on the vendor alone.
139 if (!GR_GL_MUST_USE_VBO &&
cdaltone2e71c22016-04-07 18:13:29 -0700140 !fIsCoreProfile &&
bsalomoned82c4e2014-09-02 07:54:47 -0700141 (kARM_GrGLVendor == ctxInfo.vendor() ||
142 kImagination_GrGLVendor == ctxInfo.vendor() ||
143 kQualcomm_GrGLVendor == ctxInfo.vendor())) {
bsalomon@google.com96966a52013-02-21 16:34:21 +0000144 fUseNonVBOVertexAndIndexDynamicData = true;
145 }
skia.committer@gmail.com631cdcb2013-03-01 12:12:55 +0000146
egdaniel9250d242015-05-18 13:04:26 -0700147 // A driver but on the nexus 6 causes incorrect dst copies when invalidate is called beforehand.
148 // Thus we are blacklisting this extension for now on Adreno4xx devices.
149 if (kAdreno4xx_GrGLRenderer != ctxInfo.renderer() &&
150 ((kGL_GrGLStandard == standard && version >= GR_GL_VER(4,3)) ||
151 (kGLES_GrGLStandard == standard && version >= GR_GL_VER(3,0)) ||
152 ctxInfo.hasExtension("GL_ARB_invalidate_subdata"))) {
commit-bot@chromium.org52ffbf62014-04-02 16:19:33 +0000153 fDiscardRenderTargetSupport = true;
154 fInvalidateFBType = kInvalidate_InvalidateFBType;
155 } else if (ctxInfo.hasExtension("GL_EXT_discard_framebuffer")) {
156 fDiscardRenderTargetSupport = true;
157 fInvalidateFBType = kDiscard_InvalidateFBType;
158 }
robertphillips@google.coma6ffb582013-04-29 16:50:17 +0000159
robertphillips@google.com56ce48a2013-10-31 21:44:25 +0000160 if (kARM_GrGLVendor == ctxInfo.vendor() || kImagination_GrGLVendor == ctxInfo.vendor()) {
161 fFullClearIsFree = true;
162 }
163
commit-bot@chromium.org9e90aed2014-01-16 16:35:09 +0000164 if (kGL_GrGLStandard == standard) {
bsalomon@google.com07631cf2013-03-05 14:14:58 +0000165 fVertexArrayObjectSupport = version >= GR_GL_VER(3, 0) ||
tomhudson612e9262014-11-24 11:22:36 -0800166 ctxInfo.hasExtension("GL_ARB_vertex_array_object") ||
167 ctxInfo.hasExtension("GL_APPLE_vertex_array_object");
bsalomon@google.com07631cf2013-03-05 14:14:58 +0000168 } else {
commit-bot@chromium.org2276c012013-08-16 15:53:33 +0000169 fVertexArrayObjectSupport = version >= GR_GL_VER(3, 0) ||
170 ctxInfo.hasExtension("GL_OES_vertex_array_object");
bsalomon@google.com07631cf2013-03-05 14:14:58 +0000171 }
172
cdalton626e1ff2015-06-12 13:56:46 -0700173 if (kGL_GrGLStandard == standard) {
174 fDirectStateAccessSupport = ctxInfo.hasExtension("GL_EXT_direct_state_access");
175 } else {
176 fDirectStateAccessSupport = false;
177 }
178
179 if (kGL_GrGLStandard == standard && version >= GR_GL_VER(4,3)) {
180 fDebugSupport = true;
181 } else {
182 fDebugSupport = ctxInfo.hasExtension("GL_KHR_debug");
183 }
184
jvanverth3f801cb2014-12-16 09:49:38 -0800185 if (kGL_GrGLStandard == standard) {
186 fES2CompatibilitySupport = ctxInfo.hasExtension("GL_ARB_ES2_compatibility");
187 }
188 else {
189 fES2CompatibilitySupport = true;
190 }
191
cdalton0edea2c2015-05-21 08:27:44 -0700192 if (kGL_GrGLStandard == standard) {
193 fMultisampleDisableSupport = true;
194 } else {
kkinnunenbf49e462015-07-30 22:43:52 -0700195 fMultisampleDisableSupport = ctxInfo.hasExtension("GL_EXT_multisample_compatibility");
cdalton0edea2c2015-05-21 08:27:44 -0700196 }
197
kkinnunend94708e2015-07-30 22:47:04 -0700198 if (kGL_GrGLStandard == standard) {
199 if (version >= GR_GL_VER(3, 0)) {
200 fBindFragDataLocationSupport = true;
201 }
202 } else {
203 if (version >= GR_GL_VER(3, 0) && ctxInfo.hasExtension("GL_EXT_blend_func_extended")) {
204 fBindFragDataLocationSupport = true;
205 }
joshualittc1f56b52015-06-22 12:31:31 -0700206 }
207
bsalomonb8909d32016-01-28 07:09:52 -0800208#if 0 // Disabled due to https://bug.skia.org/4454
joshualitt7bdd70a2015-10-01 06:28:11 -0700209 fBindUniformLocationSupport = ctxInfo.hasExtension("GL_CHROMIUM_bind_uniform_location");
bsalomonb8909d32016-01-28 07:09:52 -0800210#else
211 fBindUniformLocationSupport = false;
212#endif
joshualitt7bdd70a2015-10-01 06:28:11 -0700213
kkinnunene06ed252016-02-16 23:15:40 -0800214 if (kGL_GrGLStandard == standard) {
215 if (version >= GR_GL_VER(3, 1) || ctxInfo.hasExtension("GL_ARB_texture_rectangle")) {
216 // We also require textureSize() support for rectangle 2D samplers which was added in
217 // GLSL 1.40.
218 if (ctxInfo.glslGeneration() >= k140_GrGLSLGeneration) {
219 fRectangleTextureSupport = true;
220 }
bsalomone179a912016-01-20 06:18:10 -0800221 }
kkinnunene06ed252016-02-16 23:15:40 -0800222 } else {
223 // Command buffer exposes this in GL ES context for Chromium reasons,
224 // but it should not be used. Also, at the time of writing command buffer
225 // lacks TexImage2D support and ANGLE lacks GL ES 3.0 support.
bsalomone5286e02016-01-14 09:24:09 -0800226 }
227
bsalomoncdee0092016-01-08 13:20:12 -0800228 if (kGL_GrGLStandard == standard) {
229 if (version >= GR_GL_VER(3,3) || ctxInfo.hasExtension("GL_ARB_texture_swizzle")) {
230 fTextureSwizzleSupport = true;
231 }
232 } else {
233 if (version >= GR_GL_VER(3,0)) {
234 fTextureSwizzleSupport = true;
235 }
236 }
237
cblume09bd2c02016-03-01 14:08:28 -0800238 if (kGL_GrGLStandard == standard) {
239 fMipMapLevelAndLodControlSupport = true;
240 } else if (kGLES_GrGLStandard == standard) {
241 if (version >= GR_GL_VER(3,0)) {
242 fMipMapLevelAndLodControlSupport = true;
243 }
244 }
245
bsalomon88c7b982015-07-31 11:20:16 -0700246#ifdef SK_BUILD_FOR_WIN
247 // We're assuming that on Windows Chromium we're using ANGLE.
248 bool isANGLE = kANGLE_GrGLDriver == ctxInfo.driver() ||
249 kChromium_GrGLDriver == ctxInfo.driver();
halcanary9d524f22016-03-29 09:03:52 -0700250 // Angle has slow read/write pixel paths for 32bit RGBA (but fast for BGRA).
bsalomon88c7b982015-07-31 11:20:16 -0700251 fRGBA8888PixelsOpsAreSlow = isANGLE;
252 // On DX9 ANGLE reading a partial FBO is slow. TODO: Check whether this is still true and
253 // check DX11 ANGLE.
254 fPartialFBOReadIsSlow = isANGLE;
255#endif
256
ericrkb4ecabd2016-03-11 15:18:20 -0800257 bool isMESA = kMesa_GrGLDriver == ctxInfo.driver();
258 bool isMAC = false;
259#ifdef SK_BUILD_FOR_MAC
260 isMAC = true;
261#endif
262
263 // Both mesa and mac have reduced performance if reading back an RGBA framebuffer as BGRA or
264 // vis-versa.
265 fRGBAToBGRAReadbackConversionsAreSlow = isMESA || isMAC;
266
cdalton4cd67132015-06-10 19:23:46 -0700267 /**************************************************************************
egdaniel05ded892015-10-26 07:38:05 -0700268 * GrShaderCaps fields
269 **************************************************************************/
270
egdaniel0a482332015-10-26 08:59:10 -0700271 // This must be called after fCoreProfile is set on the GrGLCaps
272 this->initGLSL(ctxInfo);
273 GrGLSLCaps* glslCaps = static_cast<GrGLSLCaps*>(fShaderCaps.get());
274
egdaniel05ded892015-10-26 07:38:05 -0700275 glslCaps->fPathRenderingSupport = this->hasPathRenderingSupport(ctxInfo, gli);
276
277 // For now these two are equivalent but we could have dst read in shader via some other method.
278 // Before setting this, initGLSL() must have been called.
279 glslCaps->fDstReadInShaderSupport = glslCaps->fFBFetchSupport;
280
281 // Enable supported shader-related caps
282 if (kGL_GrGLStandard == standard) {
283 glslCaps->fDualSourceBlendingSupport = (ctxInfo.version() >= GR_GL_VER(3, 3) ||
284 ctxInfo.hasExtension("GL_ARB_blend_func_extended")) &&
285 GrGLSLSupportsNamedFragmentShaderOutputs(ctxInfo.glslGeneration());
286 glslCaps->fShaderDerivativeSupport = true;
287 // we don't support GL_ARB_geometry_shader4, just GL 3.2+ GS
288 glslCaps->fGeometryShaderSupport = ctxInfo.version() >= GR_GL_VER(3, 2) &&
289 ctxInfo.glslGeneration() >= k150_GrGLSLGeneration;
cdalton793dc262016-02-08 10:11:47 -0800290 glslCaps->fIntegerSupport = ctxInfo.version() >= GR_GL_VER(3, 0) &&
291 ctxInfo.glslGeneration() >= k130_GrGLSLGeneration;
egdaniel05ded892015-10-26 07:38:05 -0700292 }
293 else {
294 glslCaps->fDualSourceBlendingSupport = ctxInfo.hasExtension("GL_EXT_blend_func_extended");
295
296 glslCaps->fShaderDerivativeSupport = ctxInfo.version() >= GR_GL_VER(3, 0) ||
297 ctxInfo.hasExtension("GL_OES_standard_derivatives");
cdalton793dc262016-02-08 10:11:47 -0800298
299 glslCaps->fIntegerSupport = ctxInfo.version() >= GR_GL_VER(3, 0) &&
300 ctxInfo.glslGeneration() >= k330_GrGLSLGeneration; // We use this value for GLSL ES 3.0.
egdaniel05ded892015-10-26 07:38:05 -0700301 }
302
ethannicholas22793252016-01-30 09:59:10 -0800303 if (ctxInfo.hasExtension("GL_EXT_shader_pixel_local_storage")) {
304 #define GL_MAX_SHADER_PIXEL_LOCAL_STORAGE_FAST_SIZE_EXT 0x8F63
halcanary9d524f22016-03-29 09:03:52 -0700305 GR_GL_GetIntegerv(gli, GL_MAX_SHADER_PIXEL_LOCAL_STORAGE_FAST_SIZE_EXT,
ethannicholas22793252016-01-30 09:59:10 -0800306 &glslCaps->fPixelLocalStorageSize);
307 glslCaps->fPLSPathRenderingSupport = glslCaps->fFBFetchSupport;
308 }
309 else {
310 glslCaps->fPixelLocalStorageSize = 0;
311 glslCaps->fPLSPathRenderingSupport = false;
312 }
313
cdalton9c3f1432016-03-11 10:07:37 -0800314 // Protect ourselves against tracking huge amounts of texture state.
315 static const uint8_t kMaxSaneSamplers = 32;
316 GrGLint maxSamplers;
317 GR_GL_GetIntegerv(gli, GR_GL_MAX_VERTEX_TEXTURE_IMAGE_UNITS, &maxSamplers);
318 glslCaps->fMaxVertexSamplers = SkTMin<GrGLint>(kMaxSaneSamplers, maxSamplers);
319 if (glslCaps->fGeometryShaderSupport) {
320 GR_GL_GetIntegerv(gli, GR_GL_MAX_GEOMETRY_TEXTURE_IMAGE_UNITS, &maxSamplers);
321 glslCaps->fMaxGeometrySamplers = SkTMin<GrGLint>(kMaxSaneSamplers, maxSamplers);
322 }
323 GR_GL_GetIntegerv(gli, GR_GL_MAX_TEXTURE_IMAGE_UNITS, &maxSamplers);
324 glslCaps->fMaxFragmentSamplers = SkTMin<GrGLint>(kMaxSaneSamplers, maxSamplers);
325 GR_GL_GetIntegerv(gli, GR_GL_MAX_COMBINED_TEXTURE_IMAGE_UNITS, &maxSamplers);
326 glslCaps->fMaxCombinedSamplers = SkTMin<GrGLint>(kMaxSaneSamplers, maxSamplers);
327
egdaniel05ded892015-10-26 07:38:05 -0700328 /**************************************************************************
bsalomon4b91f762015-05-19 09:29:46 -0700329 * GrCaps fields
bsalomon@google.combcce8922013-03-25 15:38:39 +0000330 **************************************************************************/
cdalton4cd67132015-06-10 19:23:46 -0700331
cdalton63f6c1f2015-11-06 07:09:43 -0800332 // We need dual source blending and the ability to disable multisample in order to support mixed
333 // samples in every corner case.
egdanieleed519e2016-01-15 11:36:18 -0800334 if (fMultisampleDisableSupport &&
335 glslCaps->dualSourceBlendingSupport() &&
336 fShaderCaps->pathRenderingSupport()) {
337 fUsesMixedSamples = ctxInfo.hasExtension("GL_NV_framebuffer_mixed_samples") ||
kkinnunenea409432015-12-10 01:21:59 -0800338 ctxInfo.hasExtension("GL_CHROMIUM_framebuffer_mixed_samples");
cdalton63f6c1f2015-11-06 07:09:43 -0800339 // Workaround NVIDIA bug related to glInvalidateFramebuffer and mixed samples.
kkinnunen9f63b442016-01-25 00:31:49 -0800340 if (fUsesMixedSamples && (kNVIDIA_GrGLDriver == ctxInfo.driver() ||
341 kChromium_GrGLDriver == ctxInfo.driver())) {
cdalton63f6c1f2015-11-06 07:09:43 -0800342 fDiscardRenderTargetSupport = false;
343 fInvalidateFBType = kNone_InvalidateFBType;
344 }
345 }
346
egdanieleed519e2016-01-15 11:36:18 -0800347 // fUsesMixedSamples must be set before calling initFSAASupport.
cdalton4cd67132015-06-10 19:23:46 -0700348 this->initFSAASupport(ctxInfo, gli);
cdalton1dd05422015-06-12 09:01:18 -0700349 this->initBlendEqationSupport(ctxInfo);
cdalton4cd67132015-06-10 19:23:46 -0700350 this->initStencilFormats(ctxInfo);
351
commit-bot@chromium.org9e90aed2014-01-16 16:35:09 +0000352 if (kGL_GrGLStandard == standard) {
bsalomon@google.combcce8922013-03-25 15:38:39 +0000353 // we could also look for GL_ATI_separate_stencil extension or
354 // GL_EXT_stencil_two_side but they use different function signatures
355 // than GL2.0+ (and than each other).
356 fTwoSidedStencilSupport = (ctxInfo.version() >= GR_GL_VER(2,0));
357 // supported on GL 1.4 and higher or by extension
358 fStencilWrapOpsSupport = (ctxInfo.version() >= GR_GL_VER(1,4)) ||
359 ctxInfo.hasExtension("GL_EXT_stencil_wrap");
360 } else {
361 // ES 2 has two sided stencil and stencil wrap
362 fTwoSidedStencilSupport = true;
363 fStencilWrapOpsSupport = true;
364 }
365
commit-bot@chromium.org9e90aed2014-01-16 16:35:09 +0000366 if (kGL_GrGLStandard == standard) {
commit-bot@chromium.org160b4782014-05-05 12:32:37 +0000367 fMapBufferFlags = kCanMap_MapFlag; // we require VBO support and the desktop VBO
368 // extension includes glMapBuffer.
369 if (version >= GR_GL_VER(3, 0) || ctxInfo.hasExtension("GL_ARB_map_buffer_range")) {
370 fMapBufferFlags |= kSubset_MapFlag;
371 fMapBufferType = kMapBufferRange_MapBufferType;
372 } else {
373 fMapBufferType = kMapBuffer_MapBufferType;
374 }
bsalomon@google.combcce8922013-03-25 15:38:39 +0000375 } else {
commit-bot@chromium.org160b4782014-05-05 12:32:37 +0000376 // Unextended GLES2 doesn't have any buffer mapping.
377 fMapBufferFlags = kNone_MapBufferType;
kkinnunenf655e932016-03-03 07:39:48 -0800378 if (ctxInfo.hasExtension("GL_CHROMIUM_map_sub")) {
kkinnunen45c2c812016-02-25 02:03:43 -0800379 fMapBufferFlags = kCanMap_MapFlag | kSubset_MapFlag;
380 fMapBufferType = kChromium_MapBufferType;
kkinnunenf655e932016-03-03 07:39:48 -0800381 } else if (version >= GR_GL_VER(3, 0) || ctxInfo.hasExtension("GL_EXT_map_buffer_range")) {
382 fMapBufferFlags = kCanMap_MapFlag | kSubset_MapFlag;
383 fMapBufferType = kMapBufferRange_MapBufferType;
commit-bot@chromium.org160b4782014-05-05 12:32:37 +0000384 } else if (ctxInfo.hasExtension("GL_OES_mapbuffer")) {
385 fMapBufferFlags = kCanMap_MapFlag;
386 fMapBufferType = kMapBuffer_MapBufferType;
387 }
bsalomon@google.combcce8922013-03-25 15:38:39 +0000388 }
389
jvanverthd7a2c1f2015-12-07 07:36:44 -0800390 if (kGL_GrGLStandard == standard) {
391 if (version >= GR_GL_VER(3, 0) || ctxInfo.hasExtension("GL_ARB_pixel_buffer_object")) {
392 fTransferBufferType = kPBO_TransferBufferType;
halcanary9d524f22016-03-29 09:03:52 -0700393 }
jvanverthd7a2c1f2015-12-07 07:36:44 -0800394 } else {
395 if (version >= GR_GL_VER(3, 0) || ctxInfo.hasExtension("GL_NV_pixel_buffer_object")) {
396 fTransferBufferType = kPBO_TransferBufferType;
jvanverthc3d706f2016-04-20 10:33:27 -0700397 } else if (ctxInfo.hasExtension("GL_CHROMIUM_pixel_transfer_buffer_object")) {
398 fTransferBufferType = kChromium_TransferBufferType;
jvanverthd7a2c1f2015-12-07 07:36:44 -0800399 }
400 }
401
joshualitte5b74c62015-06-01 14:17:47 -0700402 // On many GPUs, map memory is very expensive, so we effectively disable it here by setting the
403 // threshold to the maximum unless the client gives us a hint that map memory is cheap.
cdalton397536c2016-03-25 12:15:03 -0700404 if (fBufferMapThreshold < 0) {
bsalomonbc233752015-06-26 11:38:25 -0700405 // We think mapping on Chromium will be cheaper once we know ahead of time how much space
406 // we will use for all GrBatchs. Right now we might wind up mapping a large buffer and using
407 // a small subset.
408#if 0
cdalton397536c2016-03-25 12:15:03 -0700409 fBufferMapThreshold = kChromium_GrGLDriver == ctxInfo.driver() ? 0 : SK_MaxS32;
bsalomonbc233752015-06-26 11:38:25 -0700410#else
cdalton397536c2016-03-25 12:15:03 -0700411 fBufferMapThreshold = SK_MaxS32;
bsalomonbc233752015-06-26 11:38:25 -0700412#endif
joshualitte5b74c62015-06-01 14:17:47 -0700413 }
414
commit-bot@chromium.org9e90aed2014-01-16 16:35:09 +0000415 if (kGL_GrGLStandard == standard) {
commit-bot@chromium.org47442312013-12-19 16:18:01 +0000416 SkASSERT(ctxInfo.version() >= GR_GL_VER(2,0) ||
417 ctxInfo.hasExtension("GL_ARB_texture_non_power_of_two"));
418 fNPOTTextureTileSupport = true;
419 fMipMapSupport = true;
bsalomon@google.combcce8922013-03-25 15:38:39 +0000420 } else {
421 // Unextended ES2 supports NPOT textures with clamp_to_edge and non-mip filters only
commit-bot@chromium.org22dd6b92013-08-16 18:13:48 +0000422 // ES3 has no limitations.
423 fNPOTTextureTileSupport = ctxInfo.version() >= GR_GL_VER(3,0) ||
424 ctxInfo.hasExtension("GL_OES_texture_npot");
commit-bot@chromium.org47442312013-12-19 16:18:01 +0000425 // ES2 supports MIP mapping for POT textures but our caps don't allow for limited MIP
426 // support. The OES extension or ES 3.0 allow for MIPS on NPOT textures. So, apparently,
427 // does the undocumented GL_IMG_texture_npot extension. This extension does not seem to
428 // to alllow arbitrary wrap modes, however.
429 fMipMapSupport = fNPOTTextureTileSupport || ctxInfo.hasExtension("GL_IMG_texture_npot");
bsalomon@google.combcce8922013-03-25 15:38:39 +0000430 }
431
bsalomone72bd022015-10-26 07:33:03 -0700432 // Using MIPs on this GPU seems to be a source of trouble.
433 if (kPowerVR54x_GrGLRenderer == ctxInfo.renderer()) {
434 fMipMapSupport = false;
435 }
436
bsalomon@google.combcce8922013-03-25 15:38:39 +0000437 GR_GL_GetIntegerv(gli, GR_GL_MAX_TEXTURE_SIZE, &fMaxTextureSize);
438 GR_GL_GetIntegerv(gli, GR_GL_MAX_RENDERBUFFER_SIZE, &fMaxRenderTargetSize);
439 // Our render targets are always created with textures as the color
440 // attachment, hence this min:
commit-bot@chromium.org972f9cd2014-03-28 17:58:28 +0000441 fMaxRenderTargetSize = SkTMin(fMaxTextureSize, fMaxRenderTargetSize);
bsalomon@google.combcce8922013-03-25 15:38:39 +0000442
commit-bot@chromium.orga3baf3b2014-02-21 18:45:30 +0000443 fGpuTracingSupport = ctxInfo.hasExtension("GL_EXT_debug_marker");
444
robertphillips@google.com8995b7b2013-11-01 15:03:34 +0000445 // Disable scratch texture reuse on Mali and Adreno devices
446 fReuseScratchTextures = kARM_GrGLVendor != ctxInfo.vendor() &&
447 kQualcomm_GrGLVendor != ctxInfo.vendor();
commit-bot@chromium.orgb8356522013-07-18 22:26:39 +0000448
robertphillips1b8e1b52015-06-24 06:54:10 -0700449#if 0
450 fReuseScratchBuffers = kARM_GrGLVendor != ctxInfo.vendor() &&
451 kQualcomm_GrGLVendor != ctxInfo.vendor();
452#endif
453
egdaniel05ded892015-10-26 07:38:05 -0700454 // initFSAASupport() must have been called before this point
bsalomon@google.com347c3822013-05-01 20:10:01 +0000455 if (GrGLCaps::kES_IMG_MsToTexture_MSFBOType == fMSFBOType) {
cdaltonaf8bc7d2016-02-05 09:35:20 -0800456 GR_GL_GetIntegerv(gli, GR_GL_MAX_SAMPLES_IMG, &fMaxStencilSampleCount);
bsalomon@google.combcce8922013-03-25 15:38:39 +0000457 } else if (GrGLCaps::kNone_MSFBOType != fMSFBOType) {
cdaltonaf8bc7d2016-02-05 09:35:20 -0800458 GR_GL_GetIntegerv(gli, GR_GL_MAX_SAMPLES, &fMaxStencilSampleCount);
bsalomon@google.combcce8922013-03-25 15:38:39 +0000459 }
cdaltonaf8bc7d2016-02-05 09:35:20 -0800460 // We only have a use for raster multisample if there is coverage modulation from mixed samples.
461 if (fUsesMixedSamples && ctxInfo.hasExtension("GL_EXT_raster_multisample")) {
462 GR_GL_GetIntegerv(gli, GR_GL_MAX_RASTER_SAMPLES, &fMaxRasterSamples);
463 // This is to guard against platforms that may not support as many samples for
464 // glRasterSamples as they do for framebuffers.
465 fMaxStencilSampleCount = SkTMin(fMaxStencilSampleCount, fMaxRasterSamples);
466 }
467 fMaxColorSampleCount = fMaxStencilSampleCount;
commit-bot@chromium.org73880512013-10-14 15:33:45 +0000468
bsalomon63b21962014-11-05 07:05:34 -0800469 if (kPowerVR54x_GrGLRenderer == ctxInfo.renderer() ||
bsalomone702d972015-01-29 10:07:32 -0800470 kPowerVRRogue_GrGLRenderer == ctxInfo.renderer() ||
bsalomona8fcea02015-02-13 09:00:39 -0800471 kAdreno3xx_GrGLRenderer == ctxInfo.renderer()) {
bsalomon63b21962014-11-05 07:05:34 -0800472 fUseDrawInsteadOfClear = true;
473 }
474
joshualitt83bc2292015-06-18 14:18:02 -0700475 if (kAdreno4xx_GrGLRenderer == ctxInfo.renderer()) {
476 fUseDrawInsteadOfPartialRenderTargetWrite = true;
477 }
478
bsalomonbabafcc2016-02-16 11:36:47 -0800479 // Texture uploads sometimes seem to be ignored to textures bound to FBOS on Tegra3.
480 if (kTegra3_GrGLRenderer == ctxInfo.renderer()) {
481 fUseDrawInsteadOfPartialRenderTargetWrite = true;
482 fUseDrawInsteadOfAllRenderTargetWrites = true;
483 }
484
robertphillips63926682015-08-20 09:39:02 -0700485#ifdef SK_BUILD_FOR_WIN
486 // On ANGLE deferring flushes can lead to GPU starvation
487 fPreferVRAMUseOverFlushes = !isANGLE;
488#endif
489
bsalomon7dea7b72015-08-19 08:26:51 -0700490 if (kChromium_GrGLDriver == ctxInfo.driver()) {
491 fMustClearUploadedBufferData = true;
492 }
493
bsalomond08ea5f2015-02-20 06:58:13 -0800494 if (kGL_GrGLStandard == standard) {
495 // ARB allows mixed size FBO attachments, EXT does not.
496 if (ctxInfo.version() >= GR_GL_VER(3, 0) ||
497 ctxInfo.hasExtension("GL_ARB_framebuffer_object")) {
498 fOversizedStencilSupport = true;
499 } else {
500 SkASSERT(ctxInfo.hasExtension("GL_EXT_framebuffer_object"));
501 }
502 } else {
503 // ES 3.0 supports mixed size FBO attachments, 2.0 does not.
504 fOversizedStencilSupport = ctxInfo.version() >= GR_GL_VER(3, 0);
505 }
506
joshualitt58001552015-06-26 12:46:36 -0700507 if (kGL_GrGLStandard == standard) {
508 // 3.1 has draw_instanced but not instanced_arrays, for the time being we only care about
509 // instanced arrays, but we could make this more granular if we wanted
510 fSupportsInstancedDraws =
511 version >= GR_GL_VER(3, 2) ||
512 (ctxInfo.hasExtension("GL_ARB_draw_instanced") &&
513 ctxInfo.hasExtension("GL_ARB_instanced_arrays"));
514 } else {
515 fSupportsInstancedDraws =
516 version >= GR_GL_VER(3, 0) ||
517 (ctxInfo.hasExtension("GL_EXT_draw_instanced") &&
518 ctxInfo.hasExtension("GL_EXT_instanced_arrays"));
519 }
520
cdalton06604b92016-02-05 10:09:51 -0800521 if (kGL_GrGLStandard == standard) {
522 // We don't use ARB_draw_indirect because it does not support a base instance.
523 // We don't use ARB_multi_draw_indirect because it does not support GL_DRAW_INDIRECT_BUFFER.
524 fDrawIndirectSupport =
525 fMultiDrawIndirectSupport = fBaseInstanceSupport = version >= GR_GL_VER(4,3);
526 } else {
527 fDrawIndirectSupport = version >= GR_GL_VER(3,1);
528 fMultiDrawIndirectSupport = ctxInfo.hasExtension("GL_EXT_multi_draw_indirect");
529 fBaseInstanceSupport = ctxInfo.hasExtension("GL_EXT_base_instance");
530 }
531
jvanverthcba99b82015-06-24 06:59:57 -0700532 this->initShaderPrecisionTable(ctxInfo, gli, glslCaps);
bsalomoncdee0092016-01-08 13:20:12 -0800533
534 if (contextOptions.fUseShaderSwizzling) {
535 fTextureSwizzleSupport = false;
536 }
537
ethannicholas28ef4452016-03-25 09:26:03 -0700538 if (kGL_GrGLStandard == standard) {
ethannicholas6536ae52016-05-02 12:16:49 -0700539 if ((version >= GR_GL_VER(4, 0) || ctxInfo.hasExtension("GL_ARB_sample_shading")) &&
540 ctxInfo.vendor() != kIntel_GrGLVendor) {
ethannicholas28ef4452016-03-25 09:26:03 -0700541 fSampleShadingSupport = true;
542 }
543 } else if (ctxInfo.hasExtension("GL_OES_sample_shading")) {
544 fSampleShadingSupport = true;
545 }
546
brianosman09563ce2016-06-02 08:59:34 -0700547 // Manual mip-mapping requires mip-level sampling control.
548 // Additionally, Adreno330 will produce empty mip-maps for the very smallest mips with
549 // our manual (draw-call) implementation.
550 if (fMipMapLevelAndLodControlSupport &&
551 kAdreno3xx_GrGLRenderer != ctxInfo.renderer()) {
552 fDoManualMipmapping = true;
553 }
554
bsalomoncdee0092016-01-08 13:20:12 -0800555 // Requires fTextureRedSupport, fTextureSwizzleSupport, msaa support, ES compatibility have
556 // already been detected.
557 this->initConfigTable(ctxInfo, gli, glslCaps);
cdalton4cd67132015-06-10 19:23:46 -0700558
559 this->applyOptionsOverrides(contextOptions);
560 glslCaps->applyOptionsOverrides(contextOptions);
commit-bot@chromium.org73880512013-10-14 15:33:45 +0000561}
562
egdaniel472d44e2015-10-22 08:20:00 -0700563const char* get_glsl_version_decl_string(GrGLStandard standard, GrGLSLGeneration generation,
564 bool isCoreProfile) {
565 switch (generation) {
566 case k110_GrGLSLGeneration:
567 if (kGLES_GrGLStandard == standard) {
568 // ES2s shader language is based on version 1.20 but is version
569 // 1.00 of the ES language.
570 return "#version 100\n";
571 } else {
572 SkASSERT(kGL_GrGLStandard == standard);
573 return "#version 110\n";
574 }
575 case k130_GrGLSLGeneration:
576 SkASSERT(kGL_GrGLStandard == standard);
577 return "#version 130\n";
578 case k140_GrGLSLGeneration:
579 SkASSERT(kGL_GrGLStandard == standard);
580 return "#version 140\n";
581 case k150_GrGLSLGeneration:
582 SkASSERT(kGL_GrGLStandard == standard);
583 if (isCoreProfile) {
584 return "#version 150\n";
585 } else {
586 return "#version 150 compatibility\n";
587 }
588 case k330_GrGLSLGeneration:
589 if (kGLES_GrGLStandard == standard) {
590 return "#version 300 es\n";
591 } else {
592 SkASSERT(kGL_GrGLStandard == standard);
593 if (isCoreProfile) {
594 return "#version 330\n";
595 } else {
596 return "#version 330 compatibility\n";
597 }
598 }
cdalton33ad7012016-02-22 07:55:44 -0800599 case k400_GrGLSLGeneration:
600 SkASSERT(kGL_GrGLStandard == standard);
601 if (isCoreProfile) {
602 return "#version 400\n";
603 } else {
604 return "#version 400 compatibility\n";
605 }
egdaniel472d44e2015-10-22 08:20:00 -0700606 case k310es_GrGLSLGeneration:
607 SkASSERT(kGLES_GrGLStandard == standard);
608 return "#version 310 es\n";
cdalton33ad7012016-02-22 07:55:44 -0800609 case k320es_GrGLSLGeneration:
610 SkASSERT(kGLES_GrGLStandard == standard);
611 return "#version 320 es\n";
egdaniel472d44e2015-10-22 08:20:00 -0700612 }
613 return "<no version>";
614}
615
egdaniel05ded892015-10-26 07:38:05 -0700616void GrGLCaps::initGLSL(const GrGLContextInfo& ctxInfo) {
egdaniel472d44e2015-10-22 08:20:00 -0700617 GrGLStandard standard = ctxInfo.standard();
618 GrGLVersion version = ctxInfo.version();
619
620 /**************************************************************************
621 * Caps specific to GrGLSLCaps
622 **************************************************************************/
623
624 GrGLSLCaps* glslCaps = static_cast<GrGLSLCaps*>(fShaderCaps.get());
625 glslCaps->fGLSLGeneration = ctxInfo.glslGeneration();
egdaniel472d44e2015-10-22 08:20:00 -0700626 if (kGLES_GrGLStandard == standard) {
627 if (ctxInfo.hasExtension("GL_EXT_shader_framebuffer_fetch")) {
628 glslCaps->fFBFetchNeedsCustomOutput = (version >= GR_GL_VER(3, 0));
629 glslCaps->fFBFetchSupport = true;
630 glslCaps->fFBFetchColorName = "gl_LastFragData[0]";
631 glslCaps->fFBFetchExtensionString = "GL_EXT_shader_framebuffer_fetch";
632 }
633 else if (ctxInfo.hasExtension("GL_NV_shader_framebuffer_fetch")) {
634 // Actually, we haven't seen an ES3.0 device with this extension yet, so we don't know
635 glslCaps->fFBFetchNeedsCustomOutput = false;
636 glslCaps->fFBFetchSupport = true;
637 glslCaps->fFBFetchColorName = "gl_LastFragData[0]";
638 glslCaps->fFBFetchExtensionString = "GL_NV_shader_framebuffer_fetch";
639 }
640 else if (ctxInfo.hasExtension("GL_ARM_shader_framebuffer_fetch")) {
641 // The arm extension also requires an additional flag which we will set onResetContext
642 glslCaps->fFBFetchNeedsCustomOutput = false;
643 glslCaps->fFBFetchSupport = true;
644 glslCaps->fFBFetchColorName = "gl_LastFragColorARM";
645 glslCaps->fFBFetchExtensionString = "GL_ARM_shader_framebuffer_fetch";
646 }
647 glslCaps->fUsesPrecisionModifiers = true;
648 }
649
650 glslCaps->fBindlessTextureSupport = ctxInfo.hasExtension("GL_NV_bindless_texture");
651
cdaltonc08f1962016-02-12 12:14:06 -0800652 if (kGL_GrGLStandard == standard) {
653 glslCaps->fFlatInterpolationSupport = ctxInfo.glslGeneration() >= k130_GrGLSLGeneration;
654 } else {
655 glslCaps->fFlatInterpolationSupport =
656 ctxInfo.glslGeneration() >= k330_GrGLSLGeneration; // This is the value for GLSL ES 3.0.
657 }
658
659 if (kGL_GrGLStandard == standard) {
660 glslCaps->fNoPerspectiveInterpolationSupport =
661 ctxInfo.glslGeneration() >= k130_GrGLSLGeneration;
662 } else {
663 if (ctxInfo.hasExtension("GL_NV_shader_noperspective_interpolation")) {
664 glslCaps->fNoPerspectiveInterpolationSupport = true;
665 glslCaps->fNoPerspectiveInterpolationExtensionString =
666 "GL_NV_shader_noperspective_interpolation";
667 }
668 }
669
cdalton33ad7012016-02-22 07:55:44 -0800670 if (kGL_GrGLStandard == standard) {
cdalton4a98cdb2016-03-01 12:12:20 -0800671 glslCaps->fMultisampleInterpolationSupport =
672 ctxInfo.glslGeneration() >= k400_GrGLSLGeneration;
673 } else {
674 if (ctxInfo.glslGeneration() >= k320es_GrGLSLGeneration) {
675 glslCaps->fMultisampleInterpolationSupport = true;
676 } else if (ctxInfo.hasExtension("GL_OES_shader_multisample_interpolation")) {
677 glslCaps->fMultisampleInterpolationSupport = true;
678 glslCaps->fMultisampleInterpolationExtensionString =
679 "GL_OES_shader_multisample_interpolation";
680 }
681 }
682
683 if (kGL_GrGLStandard == standard) {
cdalton33ad7012016-02-22 07:55:44 -0800684 glslCaps->fSampleVariablesSupport = ctxInfo.glslGeneration() >= k400_GrGLSLGeneration;
685 } else {
686 if (ctxInfo.glslGeneration() >= k320es_GrGLSLGeneration) {
687 glslCaps->fSampleVariablesSupport = true;
688 } else if (ctxInfo.hasExtension("GL_OES_sample_variables")) {
689 glslCaps->fSampleVariablesSupport = true;
690 glslCaps->fSampleVariablesExtensionString = "GL_OES_sample_variables";
691 }
692 }
693
694 if (glslCaps->fSampleVariablesSupport) {
695 glslCaps->fSampleMaskOverrideCoverageSupport =
696 ctxInfo.hasExtension("GL_NV_sample_mask_override_coverage");
697 }
698
egdaniel472d44e2015-10-22 08:20:00 -0700699 // Adreno GPUs have a tendency to drop tiles when there is a divide-by-zero in a shader
700 glslCaps->fDropsTileOnZeroDivide = kQualcomm_GrGLVendor == ctxInfo.vendor();
701
702 // On the NexusS and GalaxyNexus, the use of 'any' causes the compilation error "Calls to any
703 // function that may require a gradient calculation inside a conditional block may return
704 // undefined results". This appears to be an issue with the 'any' call since even the simple
705 // "result=black; if (any()) result=white;" code fails to compile. This issue comes into play
706 // from our GrTextureDomain processor.
707 glslCaps->fCanUseAnyFunctionInShader = kImagination_GrGLVendor != ctxInfo.vendor();
708
egdaniel472d44e2015-10-22 08:20:00 -0700709 glslCaps->fVersionDeclString = get_glsl_version_decl_string(standard, glslCaps->fGLSLGeneration,
710 fIsCoreProfile);
egdaniel574a4c12015-11-02 06:22:44 -0800711
712 if (kGLES_GrGLStandard == standard && k110_GrGLSLGeneration == glslCaps->fGLSLGeneration) {
713 glslCaps->fShaderDerivativeExtensionString = "GL_OES_standard_derivatives";
714 }
egdaniel8dcdedc2015-11-11 06:27:20 -0800715
716 // Frag Coords Convention support is not part of ES
717 // Known issue on at least some Intel platforms:
718 // http://code.google.com/p/skia/issues/detail?id=946
719 if (kIntel_GrGLVendor != ctxInfo.vendor() &&
720 kGLES_GrGLStandard != standard &&
721 (ctxInfo.glslGeneration() >= k150_GrGLSLGeneration ||
722 ctxInfo.hasExtension("GL_ARB_fragment_coord_conventions"))) {
723 glslCaps->fFragCoordConventionsExtensionString = "GL_ARB_fragment_coord_conventions";
724 }
725
726 if (kGLES_GrGLStandard == standard) {
727 glslCaps->fSecondaryOutputExtensionString = "GL_EXT_blend_func_extended";
728 }
729
cdalton9c3f1432016-03-11 10:07:37 -0800730 if (ctxInfo.hasExtension("GL_OES_EGL_image_external")) {
731 if (ctxInfo.glslGeneration() == k110_GrGLSLGeneration) {
732 glslCaps->fExternalTextureSupport = true;
733 } else if (ctxInfo.hasExtension("GL_OES_EGL_image_external_essl3") ||
734 ctxInfo.hasExtension("OES_EGL_image_external_essl3")) {
735 // At least one driver has been found that has this extension without the "GL_" prefix.
736 glslCaps->fExternalTextureSupport = true;
737 }
738 }
739
740 if (glslCaps->fExternalTextureSupport) {
bsalomon7ea33f52015-11-22 14:51:00 -0800741 if (ctxInfo.glslGeneration() == k110_GrGLSLGeneration) {
742 glslCaps->fExternalTextureExtensionString = "GL_OES_EGL_image_external";
743 } else {
744 glslCaps->fExternalTextureExtensionString = "GL_OES_EGL_image_external_essl3";
745 }
746 }
747
cdaltonc04ce672016-03-11 14:07:38 -0800748 if (kGL_GrGLStandard == standard) {
cdaltonf8a6ce82016-04-11 13:02:05 -0700749 glslCaps->fTexelFetchSupport = ctxInfo.glslGeneration() >= k130_GrGLSLGeneration;
cdaltonc04ce672016-03-11 14:07:38 -0800750 } else {
cdaltonf8a6ce82016-04-11 13:02:05 -0700751 glslCaps->fTexelFetchSupport =
752 ctxInfo.glslGeneration() >= k330_GrGLSLGeneration; // We use this value for GLSL ES 3.0.
753 }
754
755 if (glslCaps->fTexelFetchSupport) {
756 if (kGL_GrGLStandard == standard) {
757 glslCaps->fTexelBufferSupport = ctxInfo.version() >= GR_GL_VER(4, 3) &&
758 ctxInfo.glslGeneration() >= k330_GrGLSLGeneration;
759 } else {
760 if (ctxInfo.version() >= GR_GL_VER(3, 2) &&
761 ctxInfo.glslGeneration() >= k320es_GrGLSLGeneration) {
762 glslCaps->fTexelBufferSupport = true;
763 } else if (ctxInfo.hasExtension("GL_OES_texture_buffer")) {
764 glslCaps->fTexelBufferSupport = true;
765 glslCaps->fTexelBufferExtensionString = "GL_OES_texture_buffer";
766 } else if (ctxInfo.hasExtension("GL_EXT_texture_buffer")) {
767 glslCaps->fTexelBufferSupport = true;
768 glslCaps->fTexelBufferExtensionString = "GL_EXT_texture_buffer";
769 }
cdaltonc04ce672016-03-11 14:07:38 -0800770 }
771 }
772
egdaniel8dcdedc2015-11-11 06:27:20 -0800773 // The Tegra3 compiler will sometimes never return if we have min(abs(x), 1.0), so we must do
774 // the abs first in a separate expression.
775 if (kTegra3_GrGLRenderer == ctxInfo.renderer()) {
776 glslCaps->fCanUseMinAndAbsTogether = false;
777 }
778
bsalomon7ea33f52015-11-22 14:51:00 -0800779 // On Intel GPU there is an issue where it reads the second argument to atan "- %s.x" as an int
egdaniel8dcdedc2015-11-11 06:27:20 -0800780 // thus must us -1.0 * %s.x to work correctly
781 if (kIntel_GrGLVendor == ctxInfo.vendor()) {
782 glslCaps->fMustForceNegatedAtanParamToFloat = true;
783 }
egdaniel472d44e2015-10-22 08:20:00 -0700784}
785
kkinnunencfe62e32015-07-01 02:58:50 -0700786bool GrGLCaps::hasPathRenderingSupport(const GrGLContextInfo& ctxInfo, const GrGLInterface* gli) {
kkinnunen6bb6d402015-07-14 10:59:23 -0700787 bool hasChromiumPathRendering = ctxInfo.hasExtension("GL_CHROMIUM_path_rendering");
788
789 if (!(ctxInfo.hasExtension("GL_NV_path_rendering") || hasChromiumPathRendering)) {
kkinnunencfe62e32015-07-01 02:58:50 -0700790 return false;
791 }
kkinnunen6bb6d402015-07-14 10:59:23 -0700792
kkinnunencfe62e32015-07-01 02:58:50 -0700793 if (kGL_GrGLStandard == ctxInfo.standard()) {
794 if (ctxInfo.version() < GR_GL_VER(4, 3) &&
795 !ctxInfo.hasExtension("GL_ARB_program_interface_query")) {
796 return false;
797 }
798 } else {
kkinnunen6bb6d402015-07-14 10:59:23 -0700799 if (!hasChromiumPathRendering &&
800 ctxInfo.version() < GR_GL_VER(3, 1)) {
kkinnunencfe62e32015-07-01 02:58:50 -0700801 return false;
802 }
803 }
804 // We only support v1.3+ of GL_NV_path_rendering which allows us to
805 // set individual fragment inputs with ProgramPathFragmentInputGen. The API
806 // additions are detected by checking the existence of the function.
807 // We also use *Then* functions that not all drivers might have. Check
808 // them for consistency.
bsalomon9f2dc272016-02-08 07:22:17 -0800809 if (!gli->fFunctions.fStencilThenCoverFillPath ||
810 !gli->fFunctions.fStencilThenCoverStrokePath ||
811 !gli->fFunctions.fStencilThenCoverFillPathInstanced ||
812 !gli->fFunctions.fStencilThenCoverStrokePathInstanced ||
813 !gli->fFunctions.fProgramPathFragmentInputGen) {
kkinnunencfe62e32015-07-01 02:58:50 -0700814 return false;
815 }
816 return true;
817}
bsalomon1aa20292016-01-22 08:16:09 -0800818
819bool GrGLCaps::readPixelsSupported(GrPixelConfig rtConfig,
bsalomon7928ef62016-01-05 10:26:39 -0800820 GrPixelConfig readConfig,
bsalomon1aa20292016-01-22 08:16:09 -0800821 std::function<void (GrGLenum, GrGLint*)> getIntegerv,
822 std::function<bool ()> bindRenderTarget) const {
bsalomone9573312016-01-25 14:33:25 -0800823 // If it's not possible to even have a render target of rtConfig then read pixels is
824 // not supported regardless of readConfig.
825 if (!this->isConfigRenderable(rtConfig, false)) {
826 return false;
827 }
bsalomon7928ef62016-01-05 10:26:39 -0800828
bsalomon76148af2016-01-12 11:13:47 -0800829 GrGLenum readFormat;
830 GrGLenum readType;
bsalomon1aa20292016-01-22 08:16:09 -0800831 if (!this->getReadPixelsFormat(rtConfig, readConfig, &readFormat, &readType)) {
bsalomon76148af2016-01-12 11:13:47 -0800832 return false;
833 }
834
bsalomon1aa20292016-01-22 08:16:09 -0800835 if (kGL_GrGLStandard == fStandard) {
bsalomone9573312016-01-25 14:33:25 -0800836 // Some OpenGL implementations allow GL_ALPHA as a format to glReadPixels. However,
837 // the manual (https://www.opengl.org/sdk/docs/man/) says only these formats are allowed:
838 // GL_STENCIL_INDEX, GL_DEPTH_COMPONENT, GL_DEPTH_STENCIL, GL_RED, GL_GREEN, GL_BLUE,
839 // GL_RGB, GL_BGR, GL_RGBA, and GL_BGRA. We check for the subset that we would use.
840 if (readFormat != GR_GL_RED && readFormat != GR_GL_RGB && readFormat != GR_GL_RGBA &&
841 readFormat != GR_GL_BGRA) {
842 return false;
843 }
844 // There is also a set of allowed types, but all the types we use are in the set:
845 // GL_UNSIGNED_BYTE, GL_BYTE, GL_UNSIGNED_SHORT, GL_SHORT, GL_UNSIGNED_INT, GL_INT,
846 // GL_HALF_FLOAT, GL_FLOAT, GL_UNSIGNED_BYTE_3_3_2, GL_UNSIGNED_BYTE_2_3_3_REV,
847 // GL_UNSIGNED_SHORT_5_6_5, GL_UNSIGNED_SHORT_5_6_5_REV, GL_UNSIGNED_SHORT_4_4_4_4,
848 // GL_UNSIGNED_SHORT_4_4_4_4_REV, GL_UNSIGNED_SHORT_5_5_5_1, GL_UNSIGNED_SHORT_1_5_5_5_REV,
849 // GL_UNSIGNED_INT_8_8_8_8, GL_UNSIGNED_INT_8_8_8_8_REV,GL_UNSIGNED_INT_10_10_10_2,
850 // GL_UNSIGNED_INT_2_10_10_10_REV, GL_UNSIGNED_INT_24_8, GL_UNSIGNED_INT_10F_11F_11F_REV,
851 // GL_UNSIGNED_INT_5_9_9_9_REV, or GL_FLOAT_32_UNSIGNED_INT_24_8_REV.
bsalomon7928ef62016-01-05 10:26:39 -0800852 return true;
piotaixre4b23142014-10-02 10:57:53 -0700853 }
bsalomon7928ef62016-01-05 10:26:39 -0800854
bsalomon76148af2016-01-12 11:13:47 -0800855 // See Section 16.1.2 in the ES 3.2 specification.
bsalomon7928ef62016-01-05 10:26:39 -0800856
bsalomon1aa20292016-01-22 08:16:09 -0800857 if (kNormalizedFixedPoint_FormatType == fConfigTable[rtConfig].fFormatType) {
bsalomon7928ef62016-01-05 10:26:39 -0800858 if (GR_GL_RGBA == readFormat && GR_GL_UNSIGNED_BYTE == readType) {
859 return true;
860 }
861 } else {
bsalomon1aa20292016-01-22 08:16:09 -0800862 SkASSERT(kFloat_FormatType == fConfigTable[rtConfig].fFormatType);
bsalomon7928ef62016-01-05 10:26:39 -0800863 if (GR_GL_RGBA == readFormat && GR_GL_FLOAT == readType) {
864 return true;
865 }
866 }
867
bsalomon1aa20292016-01-22 08:16:09 -0800868 if (0 == fConfigTable[rtConfig].fSecondReadPixelsFormat.fFormat) {
bsalomon7928ef62016-01-05 10:26:39 -0800869 ReadPixelsFormat* rpFormat =
bsalomon1aa20292016-01-22 08:16:09 -0800870 const_cast<ReadPixelsFormat*>(&fConfigTable[rtConfig].fSecondReadPixelsFormat);
bsalomon7928ef62016-01-05 10:26:39 -0800871 GrGLint format = 0, type = 0;
bsalomon1aa20292016-01-22 08:16:09 -0800872 if (!bindRenderTarget()) {
873 return false;
874 }
875 getIntegerv(GR_GL_IMPLEMENTATION_COLOR_READ_FORMAT, &format);
876 getIntegerv(GR_GL_IMPLEMENTATION_COLOR_READ_TYPE, &type);
bsalomon7928ef62016-01-05 10:26:39 -0800877 rpFormat->fFormat = format;
878 rpFormat->fType = type;
879 }
880
bsalomon1aa20292016-01-22 08:16:09 -0800881 return fConfigTable[rtConfig].fSecondReadPixelsFormat.fFormat == readFormat &&
882 fConfigTable[rtConfig].fSecondReadPixelsFormat.fType == readType;
piotaixre4b23142014-10-02 10:57:53 -0700883}
884
robertphillips@google.com6177e692013-02-28 20:16:25 +0000885void GrGLCaps::initFSAASupport(const GrGLContextInfo& ctxInfo, const GrGLInterface* gli) {
bsalomon@google.comf7fa8062012-02-14 14:09:57 +0000886
887 fMSFBOType = kNone_MSFBOType;
commit-bot@chromium.org9e90aed2014-01-16 16:35:09 +0000888 if (kGL_GrGLStandard != ctxInfo.standard()) {
commit-bot@chromium.orga8e5a062013-09-05 23:44:09 +0000889 // We prefer the EXT/IMG extension over ES3 MSAA because we've observed
890 // ES3 driver bugs on at least one device with a tiled GPU (N10).
891 if (ctxInfo.hasExtension("GL_EXT_multisampled_render_to_texture")) {
892 fMSFBOType = kES_EXT_MsToTexture_MSFBOType;
893 } else if (ctxInfo.hasExtension("GL_IMG_multisampled_render_to_texture")) {
894 fMSFBOType = kES_IMG_MsToTexture_MSFBOType;
egdanieleed519e2016-01-15 11:36:18 -0800895 } else if (fUsesMixedSamples) {
vbuzinovdded6962015-06-12 08:59:45 -0700896 fMSFBOType = kMixedSamples_MSFBOType;
commit-bot@chromium.org92b78842014-01-16 20:49:46 +0000897 } else if (ctxInfo.version() >= GR_GL_VER(3,0)) {
commit-bot@chromium.orga8e5a062013-09-05 23:44:09 +0000898 fMSFBOType = GrGLCaps::kES_3_0_MSFBOType;
899 } else if (ctxInfo.hasExtension("GL_CHROMIUM_framebuffer_multisample")) {
900 // chrome's extension is equivalent to the EXT msaa
901 // and fbo_blit extensions.
902 fMSFBOType = kDesktop_EXT_MSFBOType;
903 } else if (ctxInfo.hasExtension("GL_APPLE_framebuffer_multisample")) {
904 fMSFBOType = kES_Apple_MSFBOType;
905 }
bsalomon083617b2016-02-12 12:10:14 -0800906
907 // Above determined the preferred MSAA approach, now decide whether glBlitFramebuffer
908 // is available.
909 if (ctxInfo.version() >= GR_GL_VER(3, 0)) {
910 fBlitFramebufferSupport = kFull_BlitFramebufferSupport;
911 } else if (ctxInfo.hasExtension("GL_CHROMIUM_framebuffer_multisample")) {
912 // The CHROMIUM extension uses the ANGLE version of glBlitFramebuffer and includes its
913 // limitations.
914 fBlitFramebufferSupport = kNoScalingNoMirroring_BlitFramebufferSupport;
915 }
bsalomon@google.comf7fa8062012-02-14 14:09:57 +0000916 } else {
egdanieleed519e2016-01-15 11:36:18 -0800917 if (fUsesMixedSamples) {
vbuzinovdded6962015-06-12 08:59:45 -0700918 fMSFBOType = kMixedSamples_MSFBOType;
bsalomon083617b2016-02-12 12:10:14 -0800919 fBlitFramebufferSupport = kFull_BlitFramebufferSupport;
vbuzinovdded6962015-06-12 08:59:45 -0700920 } else if ((ctxInfo.version() >= GR_GL_VER(3,0)) ||
bsalomon@google.comf7fa8062012-02-14 14:09:57 +0000921 ctxInfo.hasExtension("GL_ARB_framebuffer_object")) {
bsalomon@google.com347c3822013-05-01 20:10:01 +0000922 fMSFBOType = GrGLCaps::kDesktop_ARB_MSFBOType;
bsalomon083617b2016-02-12 12:10:14 -0800923 fBlitFramebufferSupport = kFull_BlitFramebufferSupport;
bsalomon@google.comf7fa8062012-02-14 14:09:57 +0000924 } else if (ctxInfo.hasExtension("GL_EXT_framebuffer_multisample") &&
925 ctxInfo.hasExtension("GL_EXT_framebuffer_blit")) {
bsalomon@google.com347c3822013-05-01 20:10:01 +0000926 fMSFBOType = GrGLCaps::kDesktop_EXT_MSFBOType;
bsalomon083617b2016-02-12 12:10:14 -0800927 fBlitFramebufferSupport = kFull_BlitFramebufferSupport;
bsalomon@google.comf7fa8062012-02-14 14:09:57 +0000928 }
bsalomon@google.comf7fa8062012-02-14 14:09:57 +0000929 }
930}
931
cdalton1dd05422015-06-12 09:01:18 -0700932void GrGLCaps::initBlendEqationSupport(const GrGLContextInfo& ctxInfo) {
933 GrGLSLCaps* glslCaps = static_cast<GrGLSLCaps*>(fShaderCaps.get());
934
935 // Disabling advanced blend on various platforms with major known issues. We also block Chrome
936 // for now until its own blacklists can be updated.
937 if (kAdreno4xx_GrGLRenderer == ctxInfo.renderer() ||
938 kIntel_GrGLDriver == ctxInfo.driver() ||
joel.liang9764c402015-07-09 19:46:18 -0700939 kChromium_GrGLDriver == ctxInfo.driver()) {
cdalton1dd05422015-06-12 09:01:18 -0700940 return;
941 }
942
943 if (ctxInfo.hasExtension("GL_NV_blend_equation_advanced_coherent")) {
944 fBlendEquationSupport = kAdvancedCoherent_BlendEquationSupport;
945 glslCaps->fAdvBlendEqInteraction = GrGLSLCaps::kAutomatic_AdvBlendEqInteraction;
946 } else if (ctxInfo.hasExtension("GL_KHR_blend_equation_advanced_coherent")) {
947 fBlendEquationSupport = kAdvancedCoherent_BlendEquationSupport;
948 glslCaps->fAdvBlendEqInteraction = GrGLSLCaps::kGeneralEnable_AdvBlendEqInteraction;
949 } else if (kNVIDIA_GrGLDriver == ctxInfo.driver() &&
950 ctxInfo.driverVersion() < GR_GL_DRIVER_VER(337,00)) {
951 // Non-coherent advanced blend has an issue on NVIDIA pre 337.00.
952 return;
953 } else if (ctxInfo.hasExtension("GL_NV_blend_equation_advanced")) {
954 fBlendEquationSupport = kAdvanced_BlendEquationSupport;
955 glslCaps->fAdvBlendEqInteraction = GrGLSLCaps::kAutomatic_AdvBlendEqInteraction;
956 } else if (ctxInfo.hasExtension("GL_KHR_blend_equation_advanced")) {
957 fBlendEquationSupport = kAdvanced_BlendEquationSupport;
958 glslCaps->fAdvBlendEqInteraction = GrGLSLCaps::kGeneralEnable_AdvBlendEqInteraction;
959 // TODO: Use kSpecificEnables_AdvBlendEqInteraction if "blend_support_all_equations" is
960 // slow on a particular platform.
961 } else {
962 return; // No advanced blend support.
963 }
964
965 SkASSERT(this->advancedBlendEquationSupport());
966
967 if (kNVIDIA_GrGLDriver == ctxInfo.driver()) {
968 // Blacklist color-dodge and color-burn on NVIDIA until the fix is released.
969 fAdvBlendEqBlacklist |= (1 << kColorDodge_GrBlendEquation) |
970 (1 << kColorBurn_GrBlendEquation);
971 }
joel.liang9764c402015-07-09 19:46:18 -0700972 if (kARM_GrGLVendor == ctxInfo.vendor()) {
973 // Blacklist color-burn on ARM until the fix is released.
974 fAdvBlendEqBlacklist |= (1 << kColorBurn_GrBlendEquation);
975 }
cdalton1dd05422015-06-12 09:01:18 -0700976}
977
bsalomon@google.comf7fa8062012-02-14 14:09:57 +0000978namespace {
egdaniel8dc7c3a2015-04-16 11:22:42 -0700979const GrGLuint kUnknownBitCount = GrGLStencilAttachment::kUnknownBitCount;
bsalomon@google.comf7fa8062012-02-14 14:09:57 +0000980}
981
982void GrGLCaps::initStencilFormats(const GrGLContextInfo& ctxInfo) {
983
984 // Build up list of legal stencil formats (though perhaps not supported on
985 // the particular gpu/driver) from most preferred to least.
986
987 // these consts are in order of most preferred to least preferred
988 // we don't bother with GL_STENCIL_INDEX1 or GL_DEPTH32F_STENCIL8
989
990 static const StencilFormat
991 // internal Format stencil bits total bits packed?
992 gS8 = {GR_GL_STENCIL_INDEX8, 8, 8, false},
993 gS16 = {GR_GL_STENCIL_INDEX16, 16, 16, false},
994 gD24S8 = {GR_GL_DEPTH24_STENCIL8, 8, 32, true },
995 gS4 = {GR_GL_STENCIL_INDEX4, 4, 4, false},
caryclark@google.comcf6285b2012-06-06 12:09:01 +0000996 // gS = {GR_GL_STENCIL_INDEX, kUnknownBitCount, kUnknownBitCount, false},
bsalomon@google.comf7fa8062012-02-14 14:09:57 +0000997 gDS = {GR_GL_DEPTH_STENCIL, kUnknownBitCount, kUnknownBitCount, true };
998
commit-bot@chromium.org9e90aed2014-01-16 16:35:09 +0000999 if (kGL_GrGLStandard == ctxInfo.standard()) {
bsalomon@google.comf7fa8062012-02-14 14:09:57 +00001000 bool supportsPackedDS =
rmistry@google.comfbfcd562012-08-23 18:09:54 +00001001 ctxInfo.version() >= GR_GL_VER(3,0) ||
bsalomon@google.comf7fa8062012-02-14 14:09:57 +00001002 ctxInfo.hasExtension("GL_EXT_packed_depth_stencil") ||
1003 ctxInfo.hasExtension("GL_ARB_framebuffer_object");
1004
1005 // S1 thru S16 formats are in GL 3.0+, EXT_FBO, and ARB_FBO since we
1006 // require FBO support we can expect these are legal formats and don't
1007 // check. These also all support the unsized GL_STENCIL_INDEX.
1008 fStencilFormats.push_back() = gS8;
1009 fStencilFormats.push_back() = gS16;
1010 if (supportsPackedDS) {
1011 fStencilFormats.push_back() = gD24S8;
1012 }
1013 fStencilFormats.push_back() = gS4;
1014 if (supportsPackedDS) {
1015 fStencilFormats.push_back() = gDS;
1016 }
1017 } else {
1018 // ES2 has STENCIL_INDEX8 without extensions but requires extensions
1019 // for other formats.
1020 // ES doesn't support using the unsized format.
1021
1022 fStencilFormats.push_back() = gS8;
1023 //fStencilFormats.push_back() = gS16;
commit-bot@chromium.org04c500f2013-09-06 15:28:01 +00001024 if (ctxInfo.version() >= GR_GL_VER(3,0) ||
1025 ctxInfo.hasExtension("GL_OES_packed_depth_stencil")) {
bsalomon@google.comf7fa8062012-02-14 14:09:57 +00001026 fStencilFormats.push_back() = gD24S8;
1027 }
1028 if (ctxInfo.hasExtension("GL_OES_stencil4")) {
1029 fStencilFormats.push_back() = gS4;
1030 }
1031 }
bsalomon@google.comf7fa8062012-02-14 14:09:57 +00001032}
1033
commit-bot@chromium.org8b656c62013-11-21 15:23:15 +00001034SkString GrGLCaps::dump() const {
bsalomon@google.combcce8922013-03-25 15:38:39 +00001035
commit-bot@chromium.org8b656c62013-11-21 15:23:15 +00001036 SkString r = INHERITED::dump();
bsalomon@google.combcce8922013-03-25 15:38:39 +00001037
commit-bot@chromium.org8b656c62013-11-21 15:23:15 +00001038 r.appendf("--- GL-Specific ---\n");
bsalomon@google.comf7fa8062012-02-14 14:09:57 +00001039 for (int i = 0; i < fStencilFormats.count(); ++i) {
commit-bot@chromium.org8b656c62013-11-21 15:23:15 +00001040 r.appendf("Stencil Format %d, stencil bits: %02d, total bits: %02d\n",
bsalomon@google.comf7fa8062012-02-14 14:09:57 +00001041 i,
1042 fStencilFormats[i].fStencilBits,
1043 fStencilFormats[i].fTotalBits);
1044 }
1045
bsalomon@google.com6b0cf022013-05-03 13:35:14 +00001046 static const char* kMSFBOExtStr[] = {
bsalomon@google.comf7fa8062012-02-14 14:09:57 +00001047 "None",
1048 "ARB",
1049 "EXT",
commit-bot@chromium.orga8e5a062013-09-05 23:44:09 +00001050 "ES 3.0",
bsalomon@google.comf7fa8062012-02-14 14:09:57 +00001051 "Apple",
bsalomon@google.com347c3822013-05-01 20:10:01 +00001052 "IMG MS To Texture",
1053 "EXT MS To Texture",
vbuzinovdded6962015-06-12 08:59:45 -07001054 "MixedSamples",
bsalomon@google.comf7fa8062012-02-14 14:09:57 +00001055 };
bsalomon@google.com6b0cf022013-05-03 13:35:14 +00001056 GR_STATIC_ASSERT(0 == kNone_MSFBOType);
1057 GR_STATIC_ASSERT(1 == kDesktop_ARB_MSFBOType);
1058 GR_STATIC_ASSERT(2 == kDesktop_EXT_MSFBOType);
commit-bot@chromium.orga8e5a062013-09-05 23:44:09 +00001059 GR_STATIC_ASSERT(3 == kES_3_0_MSFBOType);
1060 GR_STATIC_ASSERT(4 == kES_Apple_MSFBOType);
1061 GR_STATIC_ASSERT(5 == kES_IMG_MsToTexture_MSFBOType);
1062 GR_STATIC_ASSERT(6 == kES_EXT_MsToTexture_MSFBOType);
vbuzinovdded6962015-06-12 08:59:45 -07001063 GR_STATIC_ASSERT(7 == kMixedSamples_MSFBOType);
commit-bot@chromium.org972f9cd2014-03-28 17:58:28 +00001064 GR_STATIC_ASSERT(SK_ARRAY_COUNT(kMSFBOExtStr) == kLast_MSFBOType + 1);
bsalomon@google.com6b0cf022013-05-03 13:35:14 +00001065
commit-bot@chromium.org52ffbf62014-04-02 16:19:33 +00001066 static const char* kInvalidateFBTypeStr[] = {
1067 "None",
1068 "Discard",
1069 "Invalidate",
1070 };
1071 GR_STATIC_ASSERT(0 == kNone_InvalidateFBType);
1072 GR_STATIC_ASSERT(1 == kDiscard_InvalidateFBType);
1073 GR_STATIC_ASSERT(2 == kInvalidate_InvalidateFBType);
1074 GR_STATIC_ASSERT(SK_ARRAY_COUNT(kInvalidateFBTypeStr) == kLast_InvalidateFBType + 1);
bsalomon@google.com6b0cf022013-05-03 13:35:14 +00001075
commit-bot@chromium.org160b4782014-05-05 12:32:37 +00001076 static const char* kMapBufferTypeStr[] = {
1077 "None",
1078 "MapBuffer",
1079 "MapBufferRange",
1080 "Chromium",
1081 };
1082 GR_STATIC_ASSERT(0 == kNone_MapBufferType);
1083 GR_STATIC_ASSERT(1 == kMapBuffer_MapBufferType);
1084 GR_STATIC_ASSERT(2 == kMapBufferRange_MapBufferType);
1085 GR_STATIC_ASSERT(3 == kChromium_MapBufferType);
1086 GR_STATIC_ASSERT(SK_ARRAY_COUNT(kMapBufferTypeStr) == kLast_MapBufferType + 1);
1087
commit-bot@chromium.org8b656c62013-11-21 15:23:15 +00001088 r.appendf("Core Profile: %s\n", (fIsCoreProfile ? "YES" : "NO"));
commit-bot@chromium.org8b656c62013-11-21 15:23:15 +00001089 r.appendf("MSAA Type: %s\n", kMSFBOExtStr[fMSFBOType]);
commit-bot@chromium.org52ffbf62014-04-02 16:19:33 +00001090 r.appendf("Invalidate FB Type: %s\n", kInvalidateFBTypeStr[fInvalidateFBType]);
commit-bot@chromium.org160b4782014-05-05 12:32:37 +00001091 r.appendf("Map Buffer Type: %s\n", kMapBufferTypeStr[fMapBufferType]);
commit-bot@chromium.org8b656c62013-11-21 15:23:15 +00001092 r.appendf("Max FS Uniform Vectors: %d\n", fMaxFragmentUniformVectors);
commit-bot@chromium.org8b656c62013-11-21 15:23:15 +00001093 r.appendf("Unpack Row length support: %s\n", (fUnpackRowLengthSupport ? "YES": "NO"));
1094 r.appendf("Unpack Flip Y support: %s\n", (fUnpackFlipYSupport ? "YES": "NO"));
1095 r.appendf("Pack Row length support: %s\n", (fPackRowLengthSupport ? "YES": "NO"));
1096 r.appendf("Pack Flip Y support: %s\n", (fPackFlipYSupport ? "YES": "NO"));
bsalomon@google.combcce8922013-03-25 15:38:39 +00001097
commit-bot@chromium.org8b656c62013-11-21 15:23:15 +00001098 r.appendf("Texture Usage support: %s\n", (fTextureUsageSupport ? "YES": "NO"));
commit-bot@chromium.org8b656c62013-11-21 15:23:15 +00001099 r.appendf("GL_R support: %s\n", (fTextureRedSupport ? "YES": "NO"));
1100 r.appendf("GL_ARB_imaging support: %s\n", (fImagingSupport ? "YES": "NO"));
commit-bot@chromium.org8b656c62013-11-21 15:23:15 +00001101 r.appendf("Vertex array object support: %s\n", (fVertexArrayObjectSupport ? "YES": "NO"));
cdalton626e1ff2015-06-12 13:56:46 -07001102 r.appendf("Direct state access support: %s\n", (fDirectStateAccessSupport ? "YES": "NO"));
1103 r.appendf("Debug support: %s\n", (fDebugSupport ? "YES": "NO"));
cdaltond4727922015-11-10 12:49:06 -08001104 r.appendf("Multisample disable support: %s\n", (fMultisampleDisableSupport ? "YES" : "NO"));
cdalton06604b92016-02-05 10:09:51 -08001105 r.appendf("Draw indirect support: %s\n", (fDrawIndirectSupport ? "YES" : "NO"));
1106 r.appendf("Multi draw indirect support: %s\n", (fMultiDrawIndirectSupport ? "YES" : "NO"));
1107 r.appendf("Base instance support: %s\n", (fBaseInstanceSupport ? "YES" : "NO"));
commit-bot@chromium.org8b656c62013-11-21 15:23:15 +00001108 r.appendf("Use non-VBO for dynamic data: %s\n",
bsalomon@google.combcce8922013-03-25 15:38:39 +00001109 (fUseNonVBOVertexAndIndexDynamicData ? "YES" : "NO"));
robertphillips63926682015-08-20 09:39:02 -07001110 r.appendf("RGBA 8888 pixel ops are slow: %s\n", (fRGBA8888PixelsOpsAreSlow ? "YES" : "NO"));
1111 r.appendf("Partial FBO read is slow: %s\n", (fPartialFBOReadIsSlow ? "YES" : "NO"));
joshualitt7bdd70a2015-10-01 06:28:11 -07001112 r.appendf("Bind uniform location support: %s\n", (fBindUniformLocationSupport ? "YES" : "NO"));
bsalomone5286e02016-01-14 09:24:09 -08001113 r.appendf("Rectangle texture support: %s\n", (fRectangleTextureSupport? "YES" : "NO"));
bsalomoncdee0092016-01-08 13:20:12 -08001114 r.appendf("Texture swizzle support: %s\n", (fTextureSwizzleSupport ? "YES" : "NO"));
halcanary9d524f22016-03-29 09:03:52 -07001115 r.appendf("BGRA to RGBA readback conversions are slow: %s\n",
ericrkb4ecabd2016-03-11 15:18:20 -08001116 (fRGBAToBGRAReadbackConversionsAreSlow ? "YES" : "NO"));
bsalomon41e4384e2016-01-08 09:12:44 -08001117
1118 r.append("Configs\n-------\n");
1119 for (int i = 0; i < kGrPixelConfigCnt; ++i) {
1120 r.appendf(" cfg: %d flags: 0x%04x, b_internal: 0x%08x s_internal: 0x%08x, e_format: "
bsalomon76148af2016-01-12 11:13:47 -08001121 "0x%08x, e_format_teximage: 0x%08x, e_type: 0x%08x, i_for_teximage: 0x%08x, "
1122 "i_for_renderbuffer: 0x%08x\n",
bsalomon41e4384e2016-01-08 09:12:44 -08001123 i,
1124 fConfigTable[i].fFlags,
1125 fConfigTable[i].fFormats.fBaseInternalFormat,
1126 fConfigTable[i].fFormats.fSizedInternalFormat,
bsalomon76148af2016-01-12 11:13:47 -08001127 fConfigTable[i].fFormats.fExternalFormat[kOther_ExternalFormatUsage],
1128 fConfigTable[i].fFormats.fExternalFormat[kTexImage_ExternalFormatUsage],
bsalomon41e4384e2016-01-08 09:12:44 -08001129 fConfigTable[i].fFormats.fExternalType,
1130 fConfigTable[i].fFormats.fInternalFormatTexImage,
bsalomon76148af2016-01-12 11:13:47 -08001131 fConfigTable[i].fFormats.fInternalFormatRenderbuffer);
bsalomon41e4384e2016-01-08 09:12:44 -08001132 }
1133
jvanverthe9c0fc62015-04-29 11:18:05 -07001134 return r;
1135}
1136
jvanverthe9c0fc62015-04-29 11:18:05 -07001137static GrGLenum precision_to_gl_float_type(GrSLPrecision p) {
1138 switch (p) {
1139 case kLow_GrSLPrecision:
1140 return GR_GL_LOW_FLOAT;
1141 case kMedium_GrSLPrecision:
1142 return GR_GL_MEDIUM_FLOAT;
1143 case kHigh_GrSLPrecision:
1144 return GR_GL_HIGH_FLOAT;
1145 }
1146 SkFAIL("Unknown precision.");
1147 return -1;
1148}
1149
1150static GrGLenum shader_type_to_gl_shader(GrShaderType type) {
1151 switch (type) {
1152 case kVertex_GrShaderType:
1153 return GR_GL_VERTEX_SHADER;
1154 case kGeometry_GrShaderType:
1155 return GR_GL_GEOMETRY_SHADER;
1156 case kFragment_GrShaderType:
1157 return GR_GL_FRAGMENT_SHADER;
1158 }
1159 SkFAIL("Unknown shader type.");
1160 return -1;
1161}
1162
jvanverthcba99b82015-06-24 06:59:57 -07001163void GrGLCaps::initShaderPrecisionTable(const GrGLContextInfo& ctxInfo,
halcanary9d524f22016-03-29 09:03:52 -07001164 const GrGLInterface* intf,
jvanverthcba99b82015-06-24 06:59:57 -07001165 GrGLSLCaps* glslCaps) {
jvanverthe9c0fc62015-04-29 11:18:05 -07001166 if (kGLES_GrGLStandard == ctxInfo.standard() || ctxInfo.version() >= GR_GL_VER(4, 1) ||
1167 ctxInfo.hasExtension("GL_ARB_ES2_compatibility")) {
1168 for (int s = 0; s < kGrShaderTypeCount; ++s) {
1169 if (kGeometry_GrShaderType != s) {
1170 GrShaderType shaderType = static_cast<GrShaderType>(s);
1171 GrGLenum glShader = shader_type_to_gl_shader(shaderType);
halcanary96fcdcc2015-08-27 07:41:13 -07001172 GrShaderCaps::PrecisionInfo* first = nullptr;
jvanverthcba99b82015-06-24 06:59:57 -07001173 glslCaps->fShaderPrecisionVaries = false;
jvanverthe9c0fc62015-04-29 11:18:05 -07001174 for (int p = 0; p < kGrSLPrecisionCount; ++p) {
1175 GrSLPrecision precision = static_cast<GrSLPrecision>(p);
1176 GrGLenum glPrecision = precision_to_gl_float_type(precision);
1177 GrGLint range[2];
1178 GrGLint bits;
1179 GR_GL_GetShaderPrecisionFormat(intf, glShader, glPrecision, range, &bits);
1180 if (bits) {
jvanverthcba99b82015-06-24 06:59:57 -07001181 glslCaps->fFloatPrecisions[s][p].fLogRangeLow = range[0];
1182 glslCaps->fFloatPrecisions[s][p].fLogRangeHigh = range[1];
1183 glslCaps->fFloatPrecisions[s][p].fBits = bits;
jvanverthe9c0fc62015-04-29 11:18:05 -07001184 if (!first) {
jvanverthcba99b82015-06-24 06:59:57 -07001185 first = &glslCaps->fFloatPrecisions[s][p];
jvanverthe9c0fc62015-04-29 11:18:05 -07001186 }
jvanverthcba99b82015-06-24 06:59:57 -07001187 else if (!glslCaps->fShaderPrecisionVaries) {
halcanary9d524f22016-03-29 09:03:52 -07001188 glslCaps->fShaderPrecisionVaries =
jvanverthcba99b82015-06-24 06:59:57 -07001189 (*first != glslCaps->fFloatPrecisions[s][p]);
jvanverthe9c0fc62015-04-29 11:18:05 -07001190 }
1191 }
1192 }
1193 }
1194 }
1195 }
1196 else {
1197 // We're on a desktop GL that doesn't have precision info. Assume they're all 32bit float.
jvanverthcba99b82015-06-24 06:59:57 -07001198 glslCaps->fShaderPrecisionVaries = false;
jvanverthe9c0fc62015-04-29 11:18:05 -07001199 for (int s = 0; s < kGrShaderTypeCount; ++s) {
1200 if (kGeometry_GrShaderType != s) {
1201 for (int p = 0; p < kGrSLPrecisionCount; ++p) {
jvanverthcba99b82015-06-24 06:59:57 -07001202 glslCaps->fFloatPrecisions[s][p].fLogRangeLow = 127;
1203 glslCaps->fFloatPrecisions[s][p].fLogRangeHigh = 127;
1204 glslCaps->fFloatPrecisions[s][p].fBits = 23;
jvanverthe9c0fc62015-04-29 11:18:05 -07001205 }
1206 }
1207 }
1208 }
1209 // GetShaderPrecisionFormat doesn't accept GL_GEOMETRY_SHADER as a shader type. Assume they're
1210 // the same as the vertex shader. Only fragment shaders were ever allowed to omit support for
1211 // highp. GS was added after GetShaderPrecisionFormat was added to the list of features that
1212 // are recommended against.
jvanverthcba99b82015-06-24 06:59:57 -07001213 if (glslCaps->fGeometryShaderSupport) {
jvanverthe9c0fc62015-04-29 11:18:05 -07001214 for (int p = 0; p < kGrSLPrecisionCount; ++p) {
halcanary9d524f22016-03-29 09:03:52 -07001215 glslCaps->fFloatPrecisions[kGeometry_GrShaderType][p] =
jvanverthcba99b82015-06-24 06:59:57 -07001216 glslCaps->fFloatPrecisions[kVertex_GrShaderType][p];
jvanverthe9c0fc62015-04-29 11:18:05 -07001217 }
1218 }
cdaltona6b92ad2016-04-11 12:03:08 -07001219 glslCaps->initSamplerPrecisionTable();
jvanverthe9c0fc62015-04-29 11:18:05 -07001220}
1221
bsalomon41e4384e2016-01-08 09:12:44 -08001222bool GrGLCaps::bgraIsInternalFormat() const {
1223 return fConfigTable[kBGRA_8888_GrPixelConfig].fFormats.fBaseInternalFormat == GR_GL_BGRA;
1224}
1225
bsalomon76148af2016-01-12 11:13:47 -08001226bool GrGLCaps::getTexImageFormats(GrPixelConfig surfaceConfig, GrPixelConfig externalConfig,
1227 GrGLenum* internalFormat, GrGLenum* externalFormat,
1228 GrGLenum* externalType) const {
1229 if (!this->getExternalFormat(surfaceConfig, externalConfig, kTexImage_ExternalFormatUsage,
1230 externalFormat, externalType)) {
1231 return false;
1232 }
1233 *internalFormat = fConfigTable[surfaceConfig].fFormats.fInternalFormatTexImage;
1234 return true;
1235}
1236
1237bool GrGLCaps::getCompressedTexImageFormats(GrPixelConfig surfaceConfig,
1238 GrGLenum* internalFormat) const {
1239 if (!GrPixelConfigIsCompressed(surfaceConfig)) {
1240 return false;
1241 }
1242 *internalFormat = fConfigTable[surfaceConfig].fFormats.fInternalFormatTexImage;
1243 return true;
1244}
1245
1246bool GrGLCaps::getReadPixelsFormat(GrPixelConfig surfaceConfig, GrPixelConfig externalConfig,
1247 GrGLenum* externalFormat, GrGLenum* externalType) const {
1248 if (!this->getExternalFormat(surfaceConfig, externalConfig, kOther_ExternalFormatUsage,
1249 externalFormat, externalType)) {
1250 return false;
1251 }
1252 return true;
1253}
1254
1255bool GrGLCaps::getRenderbufferFormat(GrPixelConfig config, GrGLenum* internalFormat) const {
1256 if (GrPixelConfigIsCompressed(config)) {
1257 return false;
1258 }
1259 *internalFormat = fConfigTable[config].fFormats.fInternalFormatRenderbuffer;
1260 return true;
1261}
1262
1263bool GrGLCaps::getExternalFormat(GrPixelConfig surfaceConfig, GrPixelConfig memoryConfig,
1264 ExternalFormatUsage usage, GrGLenum* externalFormat,
1265 GrGLenum* externalType) const {
1266 SkASSERT(externalFormat && externalType);
1267 if (GrPixelConfigIsCompressed(memoryConfig) || GrPixelConfigIsCompressed(memoryConfig)) {
1268 return false;
1269 }
1270
1271 bool surfaceIsAlphaOnly = GrPixelConfigIsAlphaOnly(surfaceConfig);
1272 bool memoryIsAlphaOnly = GrPixelConfigIsAlphaOnly(memoryConfig);
1273
1274 // We don't currently support moving RGBA data into and out of ALPHA surfaces. It could be
1275 // made to work in many cases using glPixelStore and what not but is not needed currently.
1276 if (surfaceIsAlphaOnly && !memoryIsAlphaOnly) {
1277 return false;
1278 }
1279
1280 *externalFormat = fConfigTable[memoryConfig].fFormats.fExternalFormat[usage];
1281 *externalType = fConfigTable[memoryConfig].fFormats.fExternalType;
1282
bsalomone9573312016-01-25 14:33:25 -08001283 // When GL_RED is supported as a texture format, our alpha-only textures are stored using
1284 // GL_RED and we swizzle in order to map all components to 'r'. However, in this case the
1285 // surface is not alpha-only and we want alpha to really mean the alpha component of the
1286 // texture, not the red component.
1287 if (memoryIsAlphaOnly && !surfaceIsAlphaOnly) {
1288 if (this->textureRedSupport()) {
1289 SkASSERT(GR_GL_RED == *externalFormat);
1290 *externalFormat = GR_GL_ALPHA;
1291 }
1292 }
1293
bsalomon76148af2016-01-12 11:13:47 -08001294 return true;
1295}
1296
bsalomoncdee0092016-01-08 13:20:12 -08001297void GrGLCaps::initConfigTable(const GrGLContextInfo& ctxInfo, const GrGLInterface* gli,
1298 GrGLSLCaps* glslCaps) {
bsalomon41e4384e2016-01-08 09:12:44 -08001299 /*
1300 Comments on renderability of configs on various GL versions.
1301 OpenGL < 3.0:
1302 no built in support for render targets.
1303 GL_EXT_framebuffer_object adds possible support for any sized format with base internal
1304 format RGB, RGBA and NV float formats we don't use.
1305 This is the following:
1306 R3_G3_B2, RGB4, RGB5, RGB8, RGB10, RGB12, RGB16, RGBA2, RGBA4, RGB5_A1, RGBA8
1307 RGB10_A2, RGBA12,RGBA16
1308 Though, it is hard to believe the more obscure formats such as RGBA12 would work
1309 since they aren't required by later standards and the driver can simply return
1310 FRAMEBUFFER_UNSUPPORTED for anything it doesn't allow.
1311 GL_ARB_framebuffer_object adds everything added by the EXT extension and additionally
1312 any sized internal format with a base internal format of ALPHA, LUMINANCE,
1313 LUMINANCE_ALPHA, INTENSITY, RED, and RG.
1314 This adds a lot of additional renderable sized formats, including ALPHA8.
1315 The GL_ARB_texture_rg brings in the RED and RG formats (8, 8I, 8UI, 16, 16I, 16UI,
1316 16F, 32I, 32UI, and 32F variants).
1317 Again, the driver has an escape hatch via FRAMEBUFFER_UNSUPPORTED.
1318
1319 For both the above extensions we limit ourselves to those that are also required by
1320 OpenGL 3.0.
1321
1322 OpenGL 3.0:
1323 Any format with base internal format ALPHA, RED, RG, RGB or RGBA is "color-renderable"
1324 but are not required to be supported as renderable textures/renderbuffer.
1325 Required renderable color formats:
1326 - RGBA32F, RGBA32I, RGBA32UI, RGBA16, RGBA16F, RGBA16I,
1327 RGBA16UI, RGBA8, RGBA8I, RGBA8UI, SRGB8_ALPHA8, and
1328 RGB10_A2.
1329 - R11F_G11F_B10F.
1330 - RG32F, RG32I, RG32UI, RG16, RG16F, RG16I, RG16UI, RG8, RG8I,
1331 and RG8UI.
1332 - R32F, R32I, R32UI, R16F, R16I, R16UI, R16, R8, R8I, and R8UI.
1333 - ALPHA8
1334
1335 OpenGL 3.1, 3.2, 3.3
1336 Same as 3.0 except ALPHA8 requires GL_ARB_compatibility/compatibility profile.
1337 OpengGL 3.3, 4.0, 4.1
1338 Adds RGB10_A2UI.
1339 OpengGL 4.2
1340 Adds
1341 - RGB5_A1, RGBA4
1342 - RGB565
1343 OpenGL 4.4
1344 Does away with the separate list and adds a column to the sized internal color format
1345 table. However, no new formats become required color renderable.
1346
1347 ES 2.0
1348 color renderable: RGBA4, RGB5_A1, RGB565
1349 GL_EXT_texture_rg adds support for R8, RG5 as a color render target
1350 GL_OES_rgb8_rgba8 adds support for RGB8 and RGBA8
1351 GL_ARM_rgba8 adds support for RGBA8 (but not RGB8)
1352 GL_EXT_texture_format_BGRA8888 does not add renderbuffer support
1353 GL_CHROMIUM_renderbuffer_format_BGRA8888 adds BGRA8 as color-renderable
1354 GL_APPLE_texture_format_BGRA8888 does not add renderbuffer support
1355
1356 ES 3.0
1357 - RGBA32I, RGBA32UI, RGBA16I, RGBA16UI, RGBA8, RGBA8I,
1358 RGBA8UI, SRGB8_ALPHA8, RGB10_A2, RGB10_A2UI, RGBA4, and
1359 RGB5_A1.
1360 - RGB8 and RGB565.
1361 - RG32I, RG32UI, RG16I, RG16UI, RG8, RG8I, and RG8UI.
1362 - R32I, R32UI, R16I, R16UI, R8, R8I, and R8UI
1363 ES 3.1
1364 Adds RGB10_A2, RGB10_A2UI,
1365 ES 3.2
1366 Adds R16F, RG16F, RGBA16F, R32F, RG32F, RGBA32F, R11F_G11F_B10F.
1367 */
1368 uint32_t allRenderFlags = ConfigInfo::kRenderable_Flag;
1369 if (kNone_MSFBOType != fMSFBOType) {
1370 allRenderFlags |= ConfigInfo::kRenderableWithMSAA_Flag;
1371 }
1372
1373 GrGLStandard standard = ctxInfo.standard();
1374 GrGLVersion version = ctxInfo.version();
1375
cblume790d5132016-02-29 11:13:29 -08001376 bool texStorageSupported = false;
1377 if (kGL_GrGLStandard == standard) {
1378 // The EXT version can apply to either GL or GLES.
1379 texStorageSupported = version >= GR_GL_VER(4,2) ||
1380 ctxInfo.hasExtension("GL_ARB_texture_storage") ||
1381 ctxInfo.hasExtension("GL_EXT_texture_storage");
1382 } else {
1383 // Qualcomm Adreno drivers appear to have issues with texture storage.
1384 texStorageSupported = (version >= GR_GL_VER(3,0) &&
1385 kQualcomm_GrGLVendor != ctxInfo.vendor()) &&
1386 ctxInfo.hasExtension("GL_EXT_texture_storage");
1387 }
1388
1389 // TODO: remove after command buffer supports full ES 3.0
1390 if (kGLES_GrGLStandard == standard && version >= GR_GL_VER(3,0) &&
1391 kChromium_GrGLDriver == ctxInfo.driver()) {
1392 texStorageSupported = false;
1393 }
1394
cdalton74b8d322016-04-11 14:47:28 -07001395 bool texelBufferSupport = this->shaderCaps()->texelBufferSupport();
1396
bsalomon30447372015-12-21 09:03:05 -08001397 fConfigTable[kUnknown_GrPixelConfig].fFormats.fBaseInternalFormat = 0;
1398 fConfigTable[kUnknown_GrPixelConfig].fFormats.fSizedInternalFormat = 0;
bsalomon76148af2016-01-12 11:13:47 -08001399 fConfigTable[kUnknown_GrPixelConfig].fFormats.fExternalFormat[kOther_ExternalFormatUsage] = 0;
bsalomon30447372015-12-21 09:03:05 -08001400 fConfigTable[kUnknown_GrPixelConfig].fFormats.fExternalType = 0;
bsalomon7928ef62016-01-05 10:26:39 -08001401 fConfigTable[kUnknown_GrPixelConfig].fFormatType = kNormalizedFixedPoint_FormatType;
bsalomoncdee0092016-01-08 13:20:12 -08001402 fConfigTable[kUnknown_GrPixelConfig].fSwizzle = GrSwizzle::RGBA();
bsalomon30447372015-12-21 09:03:05 -08001403
1404 fConfigTable[kRGBA_8888_GrPixelConfig].fFormats.fBaseInternalFormat = GR_GL_RGBA;
1405 fConfigTable[kRGBA_8888_GrPixelConfig].fFormats.fSizedInternalFormat = GR_GL_RGBA8;
bsalomon76148af2016-01-12 11:13:47 -08001406 fConfigTable[kRGBA_8888_GrPixelConfig].fFormats.fExternalFormat[kOther_ExternalFormatUsage] =
1407 GR_GL_RGBA;
bsalomon30447372015-12-21 09:03:05 -08001408 fConfigTable[kRGBA_8888_GrPixelConfig].fFormats.fExternalType = GR_GL_UNSIGNED_BYTE;
bsalomon7928ef62016-01-05 10:26:39 -08001409 fConfigTable[kRGBA_8888_GrPixelConfig].fFormatType = kNormalizedFixedPoint_FormatType;
bsalomon41e4384e2016-01-08 09:12:44 -08001410 fConfigTable[kRGBA_8888_GrPixelConfig].fFlags = ConfigInfo::kTextureable_Flag;
1411 if (kGL_GrGLStandard == standard) {
1412 // We require some form of FBO support and all GLs with FBO support can render to RGBA8
1413 fConfigTable[kRGBA_8888_GrPixelConfig].fFlags |= allRenderFlags;
egdaniel4999df82016-01-07 17:06:04 -08001414 } else {
bsalomon41e4384e2016-01-08 09:12:44 -08001415 if (version >= GR_GL_VER(3,0) || ctxInfo.hasExtension("GL_OES_rgb8_rgba8") ||
1416 ctxInfo.hasExtension("GL_ARM_rgba8")) {
1417 fConfigTable[kRGBA_8888_GrPixelConfig].fFlags |= allRenderFlags;
1418 }
egdaniel4999df82016-01-07 17:06:04 -08001419 }
cblume790d5132016-02-29 11:13:29 -08001420 if (texStorageSupported) {
1421 fConfigTable[kRGBA_8888_GrPixelConfig].fFlags |= ConfigInfo::kCanUseTexStorage_Flag;
1422 }
cdalton74b8d322016-04-11 14:47:28 -07001423 if (texelBufferSupport) {
1424 fConfigTable[kRGBA_8888_GrPixelConfig].fFlags |= ConfigInfo::kCanUseWithTexelBuffer_Flag;
1425 }
bsalomoncdee0092016-01-08 13:20:12 -08001426 fConfigTable[kRGBA_8888_GrPixelConfig].fSwizzle = GrSwizzle::RGBA();
bsalomon41e4384e2016-01-08 09:12:44 -08001427
bsalomon76148af2016-01-12 11:13:47 -08001428 fConfigTable[kBGRA_8888_GrPixelConfig].fFormats.fExternalFormat[kOther_ExternalFormatUsage] =
1429 GR_GL_BGRA;
bsalomon30447372015-12-21 09:03:05 -08001430 fConfigTable[kBGRA_8888_GrPixelConfig].fFormats.fExternalType = GR_GL_UNSIGNED_BYTE;
bsalomon7928ef62016-01-05 10:26:39 -08001431 fConfigTable[kBGRA_8888_GrPixelConfig].fFormatType = kNormalizedFixedPoint_FormatType;
bsalomon41e4384e2016-01-08 09:12:44 -08001432 if (kGL_GrGLStandard == standard) {
1433 fConfigTable[kBGRA_8888_GrPixelConfig].fFormats.fBaseInternalFormat = GR_GL_RGBA;
1434 fConfigTable[kBGRA_8888_GrPixelConfig].fFormats.fSizedInternalFormat = GR_GL_RGBA8;
1435 if (version >= GR_GL_VER(1, 2) || ctxInfo.hasExtension("GL_EXT_bgra")) {
1436 // Since the internal format is RGBA8, it is also renderable.
1437 fConfigTable[kBGRA_8888_GrPixelConfig].fFlags = ConfigInfo::kTextureable_Flag |
1438 allRenderFlags;
1439 }
1440 } else {
1441 fConfigTable[kBGRA_8888_GrPixelConfig].fFormats.fBaseInternalFormat = GR_GL_BGRA;
1442 fConfigTable[kBGRA_8888_GrPixelConfig].fFormats.fSizedInternalFormat = GR_GL_BGRA8;
1443 if (ctxInfo.hasExtension("GL_APPLE_texture_format_BGRA8888")) {
1444 // The APPLE extension doesn't make this renderable.
1445 fConfigTable[kBGRA_8888_GrPixelConfig].fFlags = ConfigInfo::kTextureable_Flag;
1446 if (version < GR_GL_VER(3,0) && !ctxInfo.hasExtension("GL_EXT_texture_storage")) {
1447 // On ES2 the internal format of a BGRA texture is RGBA with the APPLE extension.
1448 // Though, that seems to not be the case if the texture storage extension is
1449 // present. The specs don't exactly make that clear.
1450 fConfigTable[kBGRA_8888_GrPixelConfig].fFormats.fBaseInternalFormat = GR_GL_RGBA;
1451 fConfigTable[kBGRA_8888_GrPixelConfig].fFormats.fSizedInternalFormat = GR_GL_RGBA8;
1452 }
1453 } else if (ctxInfo.hasExtension("GL_EXT_texture_format_BGRA8888")) {
1454 fConfigTable[kBGRA_8888_GrPixelConfig].fFlags = ConfigInfo::kTextureable_Flag |
1455 ConfigInfo::kRenderable_Flag;
1456 if (ctxInfo.hasExtension("GL_CHROMIUM_renderbuffer_format_BGRA8888") &&
kkinnunen9f63b442016-01-25 00:31:49 -08001457 (this->usesMSAARenderBuffers() || this->fMSFBOType == kMixedSamples_MSFBOType)) {
bsalomon41e4384e2016-01-08 09:12:44 -08001458 fConfigTable[kBGRA_8888_GrPixelConfig].fFlags |=
1459 ConfigInfo::kRenderableWithMSAA_Flag;
1460 }
1461 }
1462 }
cblume790d5132016-02-29 11:13:29 -08001463 if (texStorageSupported) {
1464 fConfigTable[kBGRA_8888_GrPixelConfig].fFlags |= ConfigInfo::kCanUseTexStorage_Flag;
1465 }
bsalomoncdee0092016-01-08 13:20:12 -08001466 fConfigTable[kBGRA_8888_GrPixelConfig].fSwizzle = GrSwizzle::RGBA();
bsalomon30447372015-12-21 09:03:05 -08001467
brianosmana6359362016-03-21 06:55:37 -07001468 // We only enable srgb support if both textures and FBOs support srgb,
brianosman35b784d2016-05-05 11:52:53 -07001469 // *and* we can disable sRGB decode-on-read, to support "legacy" mode.
bsalomon41e4384e2016-01-08 09:12:44 -08001470 if (kGL_GrGLStandard == standard) {
1471 if (ctxInfo.version() >= GR_GL_VER(3,0)) {
brianosmana6359362016-03-21 06:55:37 -07001472 fSRGBSupport = true;
bsalomon41e4384e2016-01-08 09:12:44 -08001473 } else if (ctxInfo.hasExtension("GL_EXT_texture_sRGB")) {
1474 if (ctxInfo.hasExtension("GL_ARB_framebuffer_sRGB") ||
1475 ctxInfo.hasExtension("GL_EXT_framebuffer_sRGB")) {
brianosmana6359362016-03-21 06:55:37 -07001476 fSRGBSupport = true;
bsalomon41e4384e2016-01-08 09:12:44 -08001477 }
1478 }
1479 // All the above srgb extensions support toggling srgb writes
bsalomon44d427e2016-05-10 09:05:06 -07001480 if (fSRGBSupport) {
1481 fSRGBWriteControl = true;
1482 }
bsalomon41e4384e2016-01-08 09:12:44 -08001483 } else {
1484 // See https://bug.skia.org/4148 for PowerVR issue.
brianosmana6359362016-03-21 06:55:37 -07001485 fSRGBSupport = kPowerVRRogue_GrGLRenderer != ctxInfo.renderer() &&
bsalomon41e4384e2016-01-08 09:12:44 -08001486 (ctxInfo.version() >= GR_GL_VER(3,0) || ctxInfo.hasExtension("GL_EXT_sRGB"));
1487 // ES through 3.1 requires EXT_srgb_write_control to support toggling
1488 // sRGB writing for destinations.
brianosmanc9986b62016-05-23 06:23:27 -07001489 // See https://bug.skia.org/5329 for Adreno4xx issue.
1490 fSRGBWriteControl = kAdreno4xx_GrGLRenderer != ctxInfo.renderer() &&
1491 ctxInfo.hasExtension("GL_EXT_sRGB_write_control");
bsalomon41e4384e2016-01-08 09:12:44 -08001492 }
brianosmana6359362016-03-21 06:55:37 -07001493 if (!ctxInfo.hasExtension("GL_EXT_texture_sRGB_decode")) {
1494 // To support "legacy" L32 mode, we require the ability to turn off sRGB decode:
1495 fSRGBSupport = false;
1496 }
bsalomon30447372015-12-21 09:03:05 -08001497 fConfigTable[kSRGBA_8888_GrPixelConfig].fFormats.fBaseInternalFormat = GR_GL_SRGB_ALPHA;
1498 fConfigTable[kSRGBA_8888_GrPixelConfig].fFormats.fSizedInternalFormat = GR_GL_SRGB8_ALPHA8;
1499 // GL does not do srgb<->rgb conversions when transferring between cpu and gpu. Thus, the
1500 // external format is GL_RGBA. See below for note about ES2.0 and glTex[Sub]Image.
bsalomon76148af2016-01-12 11:13:47 -08001501 fConfigTable[kSRGBA_8888_GrPixelConfig].fFormats.fExternalFormat[kOther_ExternalFormatUsage] =
1502 GR_GL_RGBA;
bsalomon30447372015-12-21 09:03:05 -08001503 fConfigTable[kSRGBA_8888_GrPixelConfig].fFormats.fExternalType = GR_GL_UNSIGNED_BYTE;
bsalomon7928ef62016-01-05 10:26:39 -08001504 fConfigTable[kSRGBA_8888_GrPixelConfig].fFormatType = kNormalizedFixedPoint_FormatType;
brianosmana6359362016-03-21 06:55:37 -07001505 if (fSRGBSupport) {
bsalomon41e4384e2016-01-08 09:12:44 -08001506 fConfigTable[kSRGBA_8888_GrPixelConfig].fFlags = ConfigInfo::kTextureable_Flag |
1507 allRenderFlags;
1508 }
cblume790d5132016-02-29 11:13:29 -08001509 if (texStorageSupported) {
1510 fConfigTable[kSRGBA_8888_GrPixelConfig].fFlags |= ConfigInfo::kCanUseTexStorage_Flag;
1511 }
bsalomoncdee0092016-01-08 13:20:12 -08001512 fConfigTable[kSRGBA_8888_GrPixelConfig].fSwizzle = GrSwizzle::RGBA();
bsalomon30447372015-12-21 09:03:05 -08001513
brianosmana6359362016-03-21 06:55:37 -07001514 // sBGRA is not a "real" thing in OpenGL, but GPUs support it, and on platforms where
1515 // kN32 == BGRA, we need some way to work with it. (The default framebuffer on Windows
1516 // is in this format, for example).
1517 fConfigTable[kSBGRA_8888_GrPixelConfig].fFormats.fBaseInternalFormat = GR_GL_SRGB_ALPHA;
1518 fConfigTable[kSBGRA_8888_GrPixelConfig].fFormats.fSizedInternalFormat = GR_GL_SRGB8_ALPHA8;
1519 // GL does not do srgb<->rgb conversions when transferring between cpu and gpu. Thus, the
1520 // external format is GL_BGRA.
1521 fConfigTable[kSBGRA_8888_GrPixelConfig].fFormats.fExternalFormat[kOther_ExternalFormatUsage] =
1522 GR_GL_BGRA;
1523 fConfigTable[kSBGRA_8888_GrPixelConfig].fFormats.fExternalType = GR_GL_UNSIGNED_BYTE;
1524 fConfigTable[kSBGRA_8888_GrPixelConfig].fFormatType = kNormalizedFixedPoint_FormatType;
1525 if (fSRGBSupport) {
1526 fConfigTable[kSBGRA_8888_GrPixelConfig].fFlags = ConfigInfo::kTextureable_Flag |
1527 allRenderFlags;
1528 }
1529 if (texStorageSupported) {
1530 fConfigTable[kSBGRA_8888_GrPixelConfig].fFlags |= ConfigInfo::kCanUseTexStorage_Flag;
1531 }
1532 fConfigTable[kSBGRA_8888_GrPixelConfig].fSwizzle = GrSwizzle::RGBA();
1533
bsalomon30447372015-12-21 09:03:05 -08001534 fConfigTable[kRGB_565_GrPixelConfig].fFormats.fBaseInternalFormat = GR_GL_RGB;
1535 if (this->ES2CompatibilitySupport()) {
1536 fConfigTable[kRGB_565_GrPixelConfig].fFormats.fSizedInternalFormat = GR_GL_RGB565;
1537 } else {
1538 fConfigTable[kRGB_565_GrPixelConfig].fFormats.fSizedInternalFormat = GR_GL_RGB5;
1539 }
bsalomon76148af2016-01-12 11:13:47 -08001540 fConfigTable[kRGB_565_GrPixelConfig].fFormats.fExternalFormat[kOther_ExternalFormatUsage] =
1541 GR_GL_RGB;
bsalomon30447372015-12-21 09:03:05 -08001542 fConfigTable[kRGB_565_GrPixelConfig].fFormats.fExternalType = GR_GL_UNSIGNED_SHORT_5_6_5;
bsalomon7928ef62016-01-05 10:26:39 -08001543 fConfigTable[kRGB_565_GrPixelConfig].fFormatType = kNormalizedFixedPoint_FormatType;
bsalomon41e4384e2016-01-08 09:12:44 -08001544 fConfigTable[kRGB_565_GrPixelConfig].fFlags = ConfigInfo::kTextureable_Flag;
1545 if (kGL_GrGLStandard == standard) {
1546 if (version >= GR_GL_VER(4, 2) || ctxInfo.hasExtension("GL_ES2_compatibility")) {
1547 fConfigTable[kRGB_565_GrPixelConfig].fFlags |= allRenderFlags;
1548 }
1549 } else {
1550 fConfigTable[kRGB_565_GrPixelConfig].fFlags |= allRenderFlags;
1551 }
cblume790d5132016-02-29 11:13:29 -08001552 // 565 is not a sized internal format on desktop GL. So on desktop with
1553 // 565 we always use an unsized internal format to let the system pick
1554 // the best sized format to convert the 565 data to. Since TexStorage
1555 // only allows sized internal formats we disallow it.
1556 //
1557 // TODO: As of 4.2, regular GL supports 565. This logic is due for an
1558 // update.
1559 if (texStorageSupported && kGL_GrGLStandard != standard) {
1560 fConfigTable[kRGB_565_GrPixelConfig].fFlags |= ConfigInfo::kCanUseTexStorage_Flag;
1561 }
bsalomoncdee0092016-01-08 13:20:12 -08001562 fConfigTable[kRGB_565_GrPixelConfig].fSwizzle = GrSwizzle::RGBA();
bsalomon30447372015-12-21 09:03:05 -08001563
1564 fConfigTable[kRGBA_4444_GrPixelConfig].fFormats.fBaseInternalFormat = GR_GL_RGBA;
1565 fConfigTable[kRGBA_4444_GrPixelConfig].fFormats.fSizedInternalFormat = GR_GL_RGBA4;
bsalomon76148af2016-01-12 11:13:47 -08001566 fConfigTable[kRGBA_4444_GrPixelConfig].fFormats.fExternalFormat[kOther_ExternalFormatUsage] =
1567 GR_GL_RGBA;
bsalomon30447372015-12-21 09:03:05 -08001568 fConfigTable[kRGBA_4444_GrPixelConfig].fFormats.fExternalType = GR_GL_UNSIGNED_SHORT_4_4_4_4;
bsalomon7928ef62016-01-05 10:26:39 -08001569 fConfigTable[kRGBA_4444_GrPixelConfig].fFormatType = kNormalizedFixedPoint_FormatType;
bsalomon41e4384e2016-01-08 09:12:44 -08001570 fConfigTable[kRGBA_4444_GrPixelConfig].fFlags = ConfigInfo::kTextureable_Flag;
1571 if (kGL_GrGLStandard == standard) {
1572 if (version >= GR_GL_VER(4, 2)) {
1573 fConfigTable[kRGBA_4444_GrPixelConfig].fFlags |= allRenderFlags;
1574 }
1575 } else {
1576 fConfigTable[kRGBA_4444_GrPixelConfig].fFlags |= allRenderFlags;
1577 }
cblume790d5132016-02-29 11:13:29 -08001578 if (texStorageSupported) {
1579 fConfigTable[kRGBA_4444_GrPixelConfig].fFlags |= ConfigInfo::kCanUseTexStorage_Flag;
1580 }
bsalomoncdee0092016-01-08 13:20:12 -08001581 fConfigTable[kRGBA_4444_GrPixelConfig].fSwizzle = GrSwizzle::RGBA();
bsalomon30447372015-12-21 09:03:05 -08001582
1583 if (this->textureRedSupport()) {
1584 fConfigTable[kAlpha_8_GrPixelConfig].fFormats.fBaseInternalFormat = GR_GL_RED;
1585 fConfigTable[kAlpha_8_GrPixelConfig].fFormats.fSizedInternalFormat = GR_GL_R8;
bsalomon76148af2016-01-12 11:13:47 -08001586 fConfigTable[kAlpha_8_GrPixelConfig].fFormats.fExternalFormat[kOther_ExternalFormatUsage] =
1587 GR_GL_RED;
bsalomoncdee0092016-01-08 13:20:12 -08001588 fConfigTable[kAlpha_8_GrPixelConfig].fSwizzle = GrSwizzle::RRRR();
cdalton74b8d322016-04-11 14:47:28 -07001589 if (texelBufferSupport) {
1590 fConfigTable[kAlpha_8_GrPixelConfig].fFlags |= ConfigInfo::kCanUseWithTexelBuffer_Flag;
1591 }
bsalomon30447372015-12-21 09:03:05 -08001592 } else {
1593 fConfigTable[kAlpha_8_GrPixelConfig].fFormats.fBaseInternalFormat = GR_GL_ALPHA;
1594 fConfigTable[kAlpha_8_GrPixelConfig].fFormats.fSizedInternalFormat = GR_GL_ALPHA8;
bsalomon76148af2016-01-12 11:13:47 -08001595 fConfigTable[kAlpha_8_GrPixelConfig].fFormats.fExternalFormat[kOther_ExternalFormatUsage] =
1596 GR_GL_ALPHA;
bsalomoncdee0092016-01-08 13:20:12 -08001597 fConfigTable[kAlpha_8_GrPixelConfig].fSwizzle = GrSwizzle::AAAA();
bsalomon30447372015-12-21 09:03:05 -08001598 }
1599 fConfigTable[kAlpha_8_GrPixelConfig].fFormats.fExternalType = GR_GL_UNSIGNED_BYTE;
bsalomon7928ef62016-01-05 10:26:39 -08001600 fConfigTable[kAlpha_8_GrPixelConfig].fFormatType = kNormalizedFixedPoint_FormatType;
bsalomon41e4384e2016-01-08 09:12:44 -08001601 fConfigTable[kAlpha_8_GrPixelConfig].fFlags = ConfigInfo::kTextureable_Flag;
bsalomon40170072016-05-05 14:40:03 -07001602 if (this->textureRedSupport() ||
1603 (kDesktop_ARB_MSFBOType == this->msFBOType() &&
1604 ctxInfo.renderer() != kOSMesa_GrGLRenderer)) {
bsalomon41e4384e2016-01-08 09:12:44 -08001605 // desktop ARB extension/3.0+ supports ALPHA8 as renderable.
bsalomon40170072016-05-05 14:40:03 -07001606 // However, osmesa fails if it used even when GL_ARB_framebuffer_object is present.
bsalomon41e4384e2016-01-08 09:12:44 -08001607 // Core profile removes ALPHA8 support, but we should have chosen R8 in that case.
1608 fConfigTable[kAlpha_8_GrPixelConfig].fFlags |= allRenderFlags;
1609 }
cblume790d5132016-02-29 11:13:29 -08001610 if (texStorageSupported) {
1611 fConfigTable[kAlpha_8_GrPixelConfig].fFlags |= ConfigInfo::kCanUseTexStorage_Flag;
1612 }
bsalomon41e4384e2016-01-08 09:12:44 -08001613
1614 // Check for [half] floating point texture support
1615 // NOTE: We disallow floating point textures on ES devices if linear filtering modes are not
1616 // supported. This is for simplicity, but a more granular approach is possible. Coincidentally,
1617 // [half] floating point textures became part of the standard in ES3.1 / OGL 3.0.
1618 bool hasFPTextures = false;
1619 bool hasHalfFPTextures = false;
1620 // for now we don't support floating point MSAA on ES
1621 uint32_t fpRenderFlags = (kGL_GrGLStandard == standard) ?
1622 allRenderFlags : (uint32_t)ConfigInfo::kRenderable_Flag;
1623
1624 if (kGL_GrGLStandard == standard) {
1625 if (version >= GR_GL_VER(3, 0) || ctxInfo.hasExtension("GL_ARB_texture_float")) {
1626 hasFPTextures = true;
1627 hasHalfFPTextures = true;
1628 }
1629 } else {
1630 if (version >= GR_GL_VER(3, 1)) {
1631 hasFPTextures = true;
1632 hasHalfFPTextures = true;
1633 } else {
1634 if (ctxInfo.hasExtension("GL_OES_texture_float_linear") &&
1635 ctxInfo.hasExtension("GL_OES_texture_float")) {
1636 hasFPTextures = true;
1637 }
1638 if (ctxInfo.hasExtension("GL_OES_texture_half_float_linear") &&
1639 ctxInfo.hasExtension("GL_OES_texture_half_float")) {
1640 hasHalfFPTextures = true;
1641 }
1642 }
1643 }
bsalomon30447372015-12-21 09:03:05 -08001644
1645 fConfigTable[kRGBA_float_GrPixelConfig].fFormats.fBaseInternalFormat = GR_GL_RGBA;
1646 fConfigTable[kRGBA_float_GrPixelConfig].fFormats.fSizedInternalFormat = GR_GL_RGBA32F;
bsalomon76148af2016-01-12 11:13:47 -08001647 fConfigTable[kRGBA_float_GrPixelConfig].fFormats.fExternalFormat[kOther_ExternalFormatUsage] =
1648 GR_GL_RGBA;
bsalomon30447372015-12-21 09:03:05 -08001649 fConfigTable[kRGBA_float_GrPixelConfig].fFormats.fExternalType = GR_GL_FLOAT;
bsalomon7928ef62016-01-05 10:26:39 -08001650 fConfigTable[kRGBA_float_GrPixelConfig].fFormatType = kFloat_FormatType;
bsalomon41e4384e2016-01-08 09:12:44 -08001651 if (hasFPTextures) {
1652 fConfigTable[kRGBA_float_GrPixelConfig].fFlags = ConfigInfo::kTextureable_Flag;
1653 // For now we only enable rendering to float on desktop, because on ES we'd have to solve
1654 // many precision issues and no clients actually want this yet.
1655 if (kGL_GrGLStandard == standard /* || version >= GR_GL_VER(3,2) ||
1656 ctxInfo.hasExtension("GL_EXT_color_buffer_float")*/) {
1657 fConfigTable[kRGBA_float_GrPixelConfig].fFlags |= fpRenderFlags;
1658 }
1659 }
cblume790d5132016-02-29 11:13:29 -08001660 if (texStorageSupported) {
1661 fConfigTable[kRGBA_float_GrPixelConfig].fFlags |= ConfigInfo::kCanUseTexStorage_Flag;
1662 }
cdalton74b8d322016-04-11 14:47:28 -07001663 if (texelBufferSupport) {
1664 fConfigTable[kRGBA_float_GrPixelConfig].fFlags |= ConfigInfo::kCanUseWithTexelBuffer_Flag;
1665 }
bsalomoncdee0092016-01-08 13:20:12 -08001666 fConfigTable[kRGBA_float_GrPixelConfig].fSwizzle = GrSwizzle::RGBA();
bsalomon30447372015-12-21 09:03:05 -08001667
1668 if (this->textureRedSupport()) {
1669 fConfigTable[kAlpha_half_GrPixelConfig].fFormats.fBaseInternalFormat = GR_GL_RED;
1670 fConfigTable[kAlpha_half_GrPixelConfig].fFormats.fSizedInternalFormat = GR_GL_R16F;
bsalomon76148af2016-01-12 11:13:47 -08001671 fConfigTable[kAlpha_half_GrPixelConfig].fFormats.fExternalFormat[kOther_ExternalFormatUsage]
1672 = GR_GL_RED;
bsalomoncdee0092016-01-08 13:20:12 -08001673 fConfigTable[kAlpha_half_GrPixelConfig].fSwizzle = GrSwizzle::RRRR();
cdalton74b8d322016-04-11 14:47:28 -07001674 if (texelBufferSupport) {
1675 fConfigTable[kAlpha_half_GrPixelConfig].fFlags |=
1676 ConfigInfo::kCanUseWithTexelBuffer_Flag;
1677 }
bsalomon30447372015-12-21 09:03:05 -08001678 } else {
1679 fConfigTable[kAlpha_half_GrPixelConfig].fFormats.fBaseInternalFormat = GR_GL_ALPHA;
1680 fConfigTable[kAlpha_half_GrPixelConfig].fFormats.fSizedInternalFormat = GR_GL_ALPHA16F;
bsalomon76148af2016-01-12 11:13:47 -08001681 fConfigTable[kAlpha_half_GrPixelConfig].fFormats.fExternalFormat[kOther_ExternalFormatUsage]
1682 = GR_GL_ALPHA;
bsalomoncdee0092016-01-08 13:20:12 -08001683 fConfigTable[kAlpha_half_GrPixelConfig].fSwizzle = GrSwizzle::AAAA();
bsalomon30447372015-12-21 09:03:05 -08001684 }
1685 if (kGL_GrGLStandard == ctxInfo.standard() || ctxInfo.version() >= GR_GL_VER(3, 0)) {
1686 fConfigTable[kAlpha_half_GrPixelConfig].fFormats.fExternalType = GR_GL_HALF_FLOAT;
1687 } else {
1688 fConfigTable[kAlpha_half_GrPixelConfig].fFormats.fExternalType = GR_GL_HALF_FLOAT_OES;
1689 }
bsalomon7928ef62016-01-05 10:26:39 -08001690 fConfigTable[kAlpha_half_GrPixelConfig].fFormatType = kFloat_FormatType;
bsalomon41e4384e2016-01-08 09:12:44 -08001691 if (hasHalfFPTextures) {
1692 fConfigTable[kAlpha_half_GrPixelConfig].fFlags = ConfigInfo::kTextureable_Flag;
1693 // ES requires either 3.2 or the combination of EXT_color_buffer_half_float and support for
1694 // GL_RED internal format.
1695 if (kGL_GrGLStandard == standard || version >= GR_GL_VER(3,2) ||
1696 (this->textureRedSupport() &&
1697 ctxInfo.hasExtension("GL_EXT_color_buffer_half_float"))) {
1698 fConfigTable[kAlpha_half_GrPixelConfig].fFlags |= fpRenderFlags;
1699 }
1700 }
cblume790d5132016-02-29 11:13:29 -08001701 if (texStorageSupported) {
1702 fConfigTable[kAlpha_half_GrPixelConfig].fFlags |= ConfigInfo::kCanUseTexStorage_Flag;
1703 }
bsalomon30447372015-12-21 09:03:05 -08001704
1705 fConfigTable[kRGBA_half_GrPixelConfig].fFormats.fBaseInternalFormat = GR_GL_RGBA;
1706 fConfigTable[kRGBA_half_GrPixelConfig].fFormats.fSizedInternalFormat = GR_GL_RGBA16F;
bsalomon76148af2016-01-12 11:13:47 -08001707 fConfigTable[kRGBA_half_GrPixelConfig].fFormats.fExternalFormat[kOther_ExternalFormatUsage] =
1708 GR_GL_RGBA;
bsalomon30447372015-12-21 09:03:05 -08001709 if (kGL_GrGLStandard == ctxInfo.standard() || ctxInfo.version() >= GR_GL_VER(3, 0)) {
1710 fConfigTable[kRGBA_half_GrPixelConfig].fFormats.fExternalType = GR_GL_HALF_FLOAT;
1711 } else {
1712 fConfigTable[kRGBA_half_GrPixelConfig].fFormats.fExternalType = GR_GL_HALF_FLOAT_OES;
1713 }
bsalomon7928ef62016-01-05 10:26:39 -08001714 fConfigTable[kRGBA_half_GrPixelConfig].fFormatType = kFloat_FormatType;
bsalomon41e4384e2016-01-08 09:12:44 -08001715 if (hasHalfFPTextures) {
1716 fConfigTable[kRGBA_half_GrPixelConfig].fFlags = ConfigInfo::kTextureable_Flag;
1717 // ES requires 3.2 or EXT_color_buffer_half_float.
1718 if (kGL_GrGLStandard == standard || version >= GR_GL_VER(3,2) ||
1719 ctxInfo.hasExtension("GL_EXT_color_buffer_half_float")) {
1720 fConfigTable[kRGBA_half_GrPixelConfig].fFlags |= fpRenderFlags;
1721 }
1722 }
cblume790d5132016-02-29 11:13:29 -08001723 if (texStorageSupported) {
1724 fConfigTable[kRGBA_half_GrPixelConfig].fFlags |= ConfigInfo::kCanUseTexStorage_Flag;
1725 }
cdalton74b8d322016-04-11 14:47:28 -07001726 if (texelBufferSupport) {
1727 fConfigTable[kRGBA_half_GrPixelConfig].fFlags |= ConfigInfo::kCanUseWithTexelBuffer_Flag;
1728 }
bsalomoncdee0092016-01-08 13:20:12 -08001729 fConfigTable[kRGBA_half_GrPixelConfig].fSwizzle = GrSwizzle::RGBA();
bsalomon41e4384e2016-01-08 09:12:44 -08001730
1731 // Compressed texture support
1732
1733 // glCompressedTexImage2D is available on all OpenGL ES devices. It is available on standard
1734 // OpenGL after version 1.3. We'll assume at least that level of OpenGL support.
1735
1736 // TODO: Fix command buffer bindings and remove this.
1737 fCompressedTexSubImageSupport = SkToBool(gli->fFunctions.fCompressedTexSubImage2D);
bsalomon30447372015-12-21 09:03:05 -08001738
1739 // No sized/unsized internal format distinction for compressed formats, no external format.
bsalomon41e4384e2016-01-08 09:12:44 -08001740 // Below we set the external formats and types to 0.
bsalomon30447372015-12-21 09:03:05 -08001741
1742 fConfigTable[kIndex_8_GrPixelConfig].fFormats.fBaseInternalFormat = GR_GL_PALETTE8_RGBA8;
1743 fConfigTable[kIndex_8_GrPixelConfig].fFormats.fSizedInternalFormat = GR_GL_PALETTE8_RGBA8;
bsalomon76148af2016-01-12 11:13:47 -08001744 fConfigTable[kIndex_8_GrPixelConfig].fFormats.fExternalFormat[kOther_ExternalFormatUsage] = 0;
bsalomon30447372015-12-21 09:03:05 -08001745 fConfigTable[kIndex_8_GrPixelConfig].fFormats.fExternalType = 0;
bsalomon7928ef62016-01-05 10:26:39 -08001746 fConfigTable[kIndex_8_GrPixelConfig].fFormatType = kNormalizedFixedPoint_FormatType;
bsalomon41e4384e2016-01-08 09:12:44 -08001747 // Disable this for now, while we investigate https://bug.skia.org/4333
1748 if (false) {
1749 // Check for 8-bit palette..
1750 GrGLint numFormats;
1751 GR_GL_GetIntegerv(gli, GR_GL_NUM_COMPRESSED_TEXTURE_FORMATS, &numFormats);
1752 if (numFormats) {
1753 SkAutoSTMalloc<10, GrGLint> formats(numFormats);
1754 GR_GL_GetIntegerv(gli, GR_GL_COMPRESSED_TEXTURE_FORMATS, formats);
1755 for (int i = 0; i < numFormats; ++i) {
1756 if (GR_GL_PALETTE8_RGBA8 == formats[i]) {
1757 fConfigTable[kIndex_8_GrPixelConfig].fFlags = ConfigInfo::kTextureable_Flag;
1758 break;
1759 }
1760 }
1761 }
1762 }
bsalomoncdee0092016-01-08 13:20:12 -08001763 fConfigTable[kIndex_8_GrPixelConfig].fSwizzle = GrSwizzle::RGBA();
bsalomon30447372015-12-21 09:03:05 -08001764
bsalomon41e4384e2016-01-08 09:12:44 -08001765 // May change the internal format based on extensions.
1766 fConfigTable[kLATC_GrPixelConfig].fFormats.fBaseInternalFormat =
1767 GR_GL_COMPRESSED_LUMINANCE_LATC1;
1768 fConfigTable[kLATC_GrPixelConfig].fFormats.fSizedInternalFormat =
1769 GR_GL_COMPRESSED_LUMINANCE_LATC1;
1770 if (ctxInfo.hasExtension("GL_EXT_texture_compression_latc") ||
1771 ctxInfo.hasExtension("GL_NV_texture_compression_latc")) {
1772 fConfigTable[kLATC_GrPixelConfig].fFlags = ConfigInfo::kTextureable_Flag;
1773 } else if ((kGL_GrGLStandard == standard && version >= GR_GL_VER(3, 0)) ||
1774 ctxInfo.hasExtension("GL_EXT_texture_compression_rgtc") ||
1775 ctxInfo.hasExtension("GL_ARB_texture_compression_rgtc")) {
1776 // RGTC is identical and available on OpenGL 3.0+ as well as with extensions
1777 fConfigTable[kLATC_GrPixelConfig].fFlags = ConfigInfo::kTextureable_Flag;
1778 fConfigTable[kLATC_GrPixelConfig].fFormats.fBaseInternalFormat =
1779 GR_GL_COMPRESSED_RED_RGTC1;
1780 fConfigTable[kLATC_GrPixelConfig].fFormats.fSizedInternalFormat =
1781 GR_GL_COMPRESSED_RED_RGTC1;
1782 } else if (ctxInfo.hasExtension("GL_AMD_compressed_3DC_texture")) {
1783 fConfigTable[kLATC_GrPixelConfig].fFlags = ConfigInfo::kTextureable_Flag;
1784 fConfigTable[kLATC_GrPixelConfig].fFormats.fBaseInternalFormat = GR_GL_COMPRESSED_3DC_X;
1785 fConfigTable[kLATC_GrPixelConfig].fFormats.fSizedInternalFormat =
1786 GR_GL_COMPRESSED_3DC_X;
1787
bsalomon30447372015-12-21 09:03:05 -08001788 }
bsalomon76148af2016-01-12 11:13:47 -08001789 fConfigTable[kLATC_GrPixelConfig].fFormats.fExternalFormat[kOther_ExternalFormatUsage] = 0;
bsalomon30447372015-12-21 09:03:05 -08001790 fConfigTable[kLATC_GrPixelConfig].fFormats.fExternalType = 0;
bsalomon7928ef62016-01-05 10:26:39 -08001791 fConfigTable[kLATC_GrPixelConfig].fFormatType = kNormalizedFixedPoint_FormatType;
bsalomoncdee0092016-01-08 13:20:12 -08001792 fConfigTable[kLATC_GrPixelConfig].fSwizzle = GrSwizzle::RRRR();
bsalomon30447372015-12-21 09:03:05 -08001793
1794 fConfigTable[kETC1_GrPixelConfig].fFormats.fBaseInternalFormat = GR_GL_COMPRESSED_ETC1_RGB8;
1795 fConfigTable[kETC1_GrPixelConfig].fFormats.fSizedInternalFormat = GR_GL_COMPRESSED_ETC1_RGB8;
bsalomon76148af2016-01-12 11:13:47 -08001796 fConfigTable[kETC1_GrPixelConfig].fFormats.fExternalFormat[kOther_ExternalFormatUsage] = 0;
bsalomon30447372015-12-21 09:03:05 -08001797 fConfigTable[kETC1_GrPixelConfig].fFormats.fExternalType = 0;
bsalomon7928ef62016-01-05 10:26:39 -08001798 fConfigTable[kETC1_GrPixelConfig].fFormatType = kNormalizedFixedPoint_FormatType;
bsalomon41e4384e2016-01-08 09:12:44 -08001799 if (kGL_GrGLStandard == standard) {
1800 if (version >= GR_GL_VER(4, 3) || ctxInfo.hasExtension("GL_ARB_ES3_compatibility")) {
1801 fConfigTable[kETC1_GrPixelConfig].fFlags = ConfigInfo::kTextureable_Flag;
1802 }
1803 } else {
1804 if (version >= GR_GL_VER(3, 0) ||
1805 ctxInfo.hasExtension("GL_OES_compressed_ETC1_RGB8_texture") ||
1806 // ETC2 is a superset of ETC1, so we can just check for that, too.
1807 (ctxInfo.hasExtension("GL_OES_compressed_ETC2_RGB8_texture") &&
1808 ctxInfo.hasExtension("GL_OES_compressed_ETC2_RGBA8_texture"))) {
1809 fConfigTable[kETC1_GrPixelConfig].fFlags = ConfigInfo::kTextureable_Flag;
1810 }
1811 }
bsalomoncdee0092016-01-08 13:20:12 -08001812 fConfigTable[kETC1_GrPixelConfig].fSwizzle = GrSwizzle::RGBA();
bsalomon30447372015-12-21 09:03:05 -08001813
1814 fConfigTable[kR11_EAC_GrPixelConfig].fFormats.fBaseInternalFormat = GR_GL_COMPRESSED_R11_EAC;
1815 fConfigTable[kR11_EAC_GrPixelConfig].fFormats.fSizedInternalFormat = GR_GL_COMPRESSED_R11_EAC;
bsalomon76148af2016-01-12 11:13:47 -08001816 fConfigTable[kR11_EAC_GrPixelConfig].fFormats.fExternalFormat[kOther_ExternalFormatUsage] = 0;
bsalomon30447372015-12-21 09:03:05 -08001817 fConfigTable[kR11_EAC_GrPixelConfig].fFormats.fExternalType = 0;
bsalomon7928ef62016-01-05 10:26:39 -08001818 fConfigTable[kR11_EAC_GrPixelConfig].fFormatType = kNormalizedFixedPoint_FormatType;
bsalomon41e4384e2016-01-08 09:12:44 -08001819 // Check for R11_EAC. We don't support R11_EAC on desktop, as most cards default to
1820 // decompressing the textures in the driver, and is generally slower.
1821 if (kGLES_GrGLStandard == standard && version >= GR_GL_VER(3,0)) {
1822 fConfigTable[kR11_EAC_GrPixelConfig].fFlags = ConfigInfo::kTextureable_Flag;
1823 }
bsalomoncdee0092016-01-08 13:20:12 -08001824 fConfigTable[kR11_EAC_GrPixelConfig].fSwizzle = GrSwizzle::RRRR();
bsalomon30447372015-12-21 09:03:05 -08001825
1826 fConfigTable[kASTC_12x12_GrPixelConfig].fFormats.fBaseInternalFormat =
1827 GR_GL_COMPRESSED_RGBA_ASTC_12x12;
1828 fConfigTable[kASTC_12x12_GrPixelConfig].fFormats.fSizedInternalFormat =
1829 GR_GL_COMPRESSED_RGBA_ASTC_12x12;
bsalomon76148af2016-01-12 11:13:47 -08001830 fConfigTable[kASTC_12x12_GrPixelConfig].fFormats.fExternalFormat[kOther_ExternalFormatUsage] =
1831 0;
bsalomon30447372015-12-21 09:03:05 -08001832 fConfigTable[kASTC_12x12_GrPixelConfig].fFormats.fExternalType = 0;
bsalomon7928ef62016-01-05 10:26:39 -08001833 fConfigTable[kASTC_12x12_GrPixelConfig].fFormatType = kNormalizedFixedPoint_FormatType;
bsalomon41e4384e2016-01-08 09:12:44 -08001834 if (ctxInfo.hasExtension("GL_KHR_texture_compression_astc_hdr") ||
1835 ctxInfo.hasExtension("GL_KHR_texture_compression_astc_ldr") ||
1836 ctxInfo.hasExtension("GL_OES_texture_compression_astc")) {
1837 fConfigTable[kASTC_12x12_GrPixelConfig].fFlags = ConfigInfo::kTextureable_Flag;
1838 }
bsalomoncdee0092016-01-08 13:20:12 -08001839 fConfigTable[kASTC_12x12_GrPixelConfig].fSwizzle = GrSwizzle::RGBA();
bsalomon30447372015-12-21 09:03:05 -08001840
1841 // Bulk populate the texture internal/external formats here and then deal with exceptions below.
1842
1843 // ES 2.0 requires that the internal/external formats match.
bsalomon76148af2016-01-12 11:13:47 -08001844 bool useSizedTexFormats = (kGL_GrGLStandard == ctxInfo.standard() ||
1845 ctxInfo.version() >= GR_GL_VER(3,0));
1846 // All ES versions (thus far) require sized internal formats for render buffers.
1847 // TODO: Always use sized internal format?
1848 bool useSizedRbFormats = kGLES_GrGLStandard == ctxInfo.standard();
1849
bsalomon30447372015-12-21 09:03:05 -08001850 for (int i = 0; i < kGrPixelConfigCnt; ++i) {
bsalomon76148af2016-01-12 11:13:47 -08001851 // Almost always we want to pass fExternalFormat[kOther_ExternalFormatUsage] as the <format>
1852 // param to glTex[Sub]Image.
1853 fConfigTable[i].fFormats.fExternalFormat[kTexImage_ExternalFormatUsage] =
1854 fConfigTable[i].fFormats.fExternalFormat[kOther_ExternalFormatUsage];
1855 fConfigTable[i].fFormats.fInternalFormatTexImage = useSizedTexFormats ?
1856 fConfigTable[i].fFormats.fSizedInternalFormat :
1857 fConfigTable[i].fFormats.fBaseInternalFormat;
1858 fConfigTable[i].fFormats.fInternalFormatRenderbuffer = useSizedRbFormats ?
bsalomon30447372015-12-21 09:03:05 -08001859 fConfigTable[i].fFormats.fSizedInternalFormat :
1860 fConfigTable[i].fFormats.fBaseInternalFormat;
1861 }
1862 // OpenGL ES 2.0 + GL_EXT_sRGB allows GL_SRGB_ALPHA to be specified as the <format>
1863 // param to Tex(Sub)Image. ES 2.0 requires the <internalFormat> and <format> params to match.
1864 // Thus, on ES 2.0 we will use GL_SRGB_ALPHA as the <format> param.
1865 // On OpenGL and ES 3.0+ GL_SRGB_ALPHA does not work for the <format> param to glTexImage.
1866 if (ctxInfo.standard() == kGLES_GrGLStandard && ctxInfo.version() == GR_GL_VER(2,0)) {
bsalomon76148af2016-01-12 11:13:47 -08001867 fConfigTable[kSRGBA_8888_GrPixelConfig].fFormats.fExternalFormat[kTexImage_ExternalFormatUsage] =
bsalomon30447372015-12-21 09:03:05 -08001868 GR_GL_SRGB_ALPHA;
brianosmana6359362016-03-21 06:55:37 -07001869
1870 // Additionally, because we had to "invent" sBGRA, there is no way to make it work
1871 // in ES 2.0, because there is no <internalFormat> we can use. So just make that format
1872 // unsupported. (If we have no sRGB support at all, this will get overwritten below).
1873 fConfigTable[kSBGRA_8888_GrPixelConfig].fFlags = 0;
bsalomon30447372015-12-21 09:03:05 -08001874 }
1875
1876 // If BGRA is supported as an internal format it must always be specified to glTex[Sub]Image
1877 // as a base format.
1878 // GL_EXT_texture_format_BGRA8888:
1879 // This extension GL_BGRA as an unsized internal format. However, it is written against ES
1880 // 2.0 and therefore doesn't define a value for GL_BGRA8 as ES 2.0 uses unsized internal
1881 // formats.
halcanary9d524f22016-03-29 09:03:52 -07001882 // GL_APPLE_texture_format_BGRA8888:
bsalomon30447372015-12-21 09:03:05 -08001883 // ES 2.0: the extension makes BGRA an external format but not an internal format.
1884 // ES 3.0: the extension explicitly states GL_BGRA8 is not a valid internal format for
1885 // glTexImage (just for glTexStorage).
bsalomon76148af2016-01-12 11:13:47 -08001886 if (useSizedTexFormats && this->bgraIsInternalFormat()) {
bsalomon30447372015-12-21 09:03:05 -08001887 fConfigTable[kBGRA_8888_GrPixelConfig].fFormats.fInternalFormatTexImage = GR_GL_BGRA;
1888 }
1889
bsalomoncdee0092016-01-08 13:20:12 -08001890 // If we don't have texture swizzle support then the shader generator must insert the
1891 // swizzle into shader code.
1892 if (!this->textureSwizzleSupport()) {
1893 for (int i = 0; i < kGrPixelConfigCnt; ++i) {
1894 glslCaps->fConfigTextureSwizzle[i] = fConfigTable[i].fSwizzle;
1895 }
1896 }
1897
bsalomon7f9b2e42016-01-12 13:29:26 -08001898 // Shader output swizzles will default to RGBA. When we've use GL_RED instead of GL_ALPHA to
1899 // implement kAlpha_8_GrPixelConfig we need to swizzle the shader outputs so the alpha channel
1900 // gets written to the single component.
1901 if (this->textureRedSupport()) {
1902 for (int i = 0; i < kGrPixelConfigCnt; ++i) {
1903 GrPixelConfig config = static_cast<GrPixelConfig>(i);
1904 if (GrPixelConfigIsAlphaOnly(config) &&
1905 fConfigTable[i].fFormats.fBaseInternalFormat == GR_GL_RED) {
1906 glslCaps->fConfigOutputSwizzle[i] = GrSwizzle::AAAA();
1907 }
1908 }
1909 }
1910
bsalomon30447372015-12-21 09:03:05 -08001911#ifdef SK_DEBUG
1912 // Make sure we initialized everything.
bsalomon76148af2016-01-12 11:13:47 -08001913 ConfigInfo defaultEntry;
bsalomon30447372015-12-21 09:03:05 -08001914 for (int i = 0; i < kGrPixelConfigCnt; ++i) {
bsalomon76148af2016-01-12 11:13:47 -08001915 SkASSERT(defaultEntry.fFormats.fBaseInternalFormat !=
1916 fConfigTable[i].fFormats.fBaseInternalFormat);
1917 SkASSERT(defaultEntry.fFormats.fSizedInternalFormat !=
bsalomon30447372015-12-21 09:03:05 -08001918 fConfigTable[i].fFormats.fSizedInternalFormat);
bsalomon76148af2016-01-12 11:13:47 -08001919 for (int j = 0; j < kExternalFormatUsageCnt; ++j) {
1920 SkASSERT(defaultEntry.fFormats.fExternalFormat[j] !=
1921 fConfigTable[i].fFormats.fExternalFormat[j]);
1922 }
1923 SkASSERT(defaultEntry.fFormats.fExternalType != fConfigTable[i].fFormats.fExternalType);
bsalomon30447372015-12-21 09:03:05 -08001924 }
1925#endif
1926}
1927
egdanielb7e7d572015-11-04 04:23:53 -08001928void GrGLCaps::onApplyOptionsOverrides(const GrContextOptions& options) {}