OLD | NEW |
1 /* | 1 /* |
2 * Copyright 2012 Google Inc. | 2 * Copyright 2012 Google Inc. |
3 * | 3 * |
4 * Use of this source code is governed by a BSD-style license that can be | 4 * Use of this source code is governed by a BSD-style license that can be |
5 * found in the LICENSE file. | 5 * found in the LICENSE file. |
6 */ | 6 */ |
7 | 7 |
8 | 8 |
9 #include "GrGLCaps.h" | 9 #include "GrGLCaps.h" |
10 | 10 |
(...skipping 29 matching lines...) Expand all Loading... |
40 fFragCoordsConventionSupport = false; | 40 fFragCoordsConventionSupport = false; |
41 fVertexArrayObjectSupport = false; | 41 fVertexArrayObjectSupport = false; |
42 fES2CompatibilitySupport = false; | 42 fES2CompatibilitySupport = false; |
43 fMultisampleDisableSupport = false; | 43 fMultisampleDisableSupport = false; |
44 fUseNonVBOVertexAndIndexDynamicData = false; | 44 fUseNonVBOVertexAndIndexDynamicData = false; |
45 fIsCoreProfile = false; | 45 fIsCoreProfile = false; |
46 fFullClearIsFree = false; | 46 fFullClearIsFree = false; |
47 | 47 |
48 fReadPixelsSupportedCache.reset(); | 48 fReadPixelsSupportedCache.reset(); |
49 | 49 |
50 this->init(ctxInfo, glInterface); | |
51 | |
52 fShaderCaps.reset(SkNEW_ARGS(GrGLSLCaps, (contextOptions, | 50 fShaderCaps.reset(SkNEW_ARGS(GrGLSLCaps, (contextOptions, |
53 ctxInfo, glInterface, *this))); | 51 ctxInfo, glInterface, *this))); |
54 | 52 |
55 this->applyOptionsOverrides(contextOptions); | 53 this->init(contextOptions, ctxInfo, glInterface); |
56 } | 54 } |
57 | 55 |
58 void GrGLCaps::init(const GrGLContextInfo& ctxInfo, const GrGLInterface* gli) { | 56 void GrGLCaps::init(const GrContextOptions& contextOptions, |
| 57 const GrGLContextInfo& ctxInfo, |
| 58 const GrGLInterface* gli) { |
59 GrGLStandard standard = ctxInfo.standard(); | 59 GrGLStandard standard = ctxInfo.standard(); |
60 GrGLVersion version = ctxInfo.version(); | 60 GrGLVersion version = ctxInfo.version(); |
61 | 61 |
62 /************************************************************************** | 62 /************************************************************************** |
| 63 * Caps specific to GrGLSLCaps |
| 64 **************************************************************************/ |
| 65 |
| 66 GrGLSLCaps* glslCaps = static_cast<GrGLSLCaps*>(fShaderCaps.get()); |
| 67 glslCaps->fGLSLGeneration = ctxInfo.glslGeneration(); |
| 68 |
| 69 if (kGLES_GrGLStandard == standard) { |
| 70 if (ctxInfo.hasExtension("GL_EXT_shader_framebuffer_fetch")) { |
| 71 glslCaps->fFBFetchNeedsCustomOutput = (version >= GR_GL_VER(3, 0)); |
| 72 glslCaps->fFBFetchSupport = true; |
| 73 glslCaps->fFBFetchColorName = "gl_LastFragData[0]"; |
| 74 glslCaps->fFBFetchExtensionString = "GL_EXT_shader_framebuffer_fetch
"; |
| 75 } |
| 76 else if (ctxInfo.hasExtension("GL_NV_shader_framebuffer_fetch")) { |
| 77 // Actually, we haven't seen an ES3.0 device with this extension yet
, so we don't know |
| 78 glslCaps->fFBFetchNeedsCustomOutput = false; |
| 79 glslCaps->fFBFetchSupport = true; |
| 80 glslCaps->fFBFetchColorName = "gl_LastFragData[0]"; |
| 81 glslCaps->fFBFetchExtensionString = "GL_NV_shader_framebuffer_fetch"
; |
| 82 } |
| 83 else if (ctxInfo.hasExtension("GL_ARM_shader_framebuffer_fetch")) { |
| 84 // The arm extension also requires an additional flag which we will
set onResetContext |
| 85 glslCaps->fFBFetchNeedsCustomOutput = false; |
| 86 glslCaps->fFBFetchSupport = true; |
| 87 glslCaps->fFBFetchColorName = "gl_LastFragColorARM"; |
| 88 glslCaps->fFBFetchExtensionString = "GL_ARM_shader_framebuffer_fetch
"; |
| 89 } |
| 90 } |
| 91 |
| 92 // Adreno GPUs have a tendency to drop tiles when there is a divide-by-zero
in a shader |
| 93 glslCaps->fDropsTileOnZeroDivide = kQualcomm_GrGLVendor == ctxInfo.vendor(); |
| 94 |
| 95 /************************************************************************** |
63 * Caps specific to GrGLCaps | 96 * Caps specific to GrGLCaps |
64 **************************************************************************/ | 97 **************************************************************************/ |
65 | 98 |
66 if (kGLES_GrGLStandard == standard) { | 99 if (kGLES_GrGLStandard == standard) { |
67 GR_GL_GetIntegerv(gli, GR_GL_MAX_FRAGMENT_UNIFORM_VECTORS, | 100 GR_GL_GetIntegerv(gli, GR_GL_MAX_FRAGMENT_UNIFORM_VECTORS, |
68 &fMaxFragmentUniformVectors); | 101 &fMaxFragmentUniformVectors); |
69 } else { | 102 } else { |
70 SkASSERT(kGL_GrGLStandard == standard); | 103 SkASSERT(kGL_GrGLStandard == standard); |
71 GrGLint max; | 104 GrGLint max; |
72 GR_GL_GetIntegerv(gli, GR_GL_MAX_FRAGMENT_UNIFORM_COMPONENTS, &max); | 105 GR_GL_GetIntegerv(gli, GR_GL_MAX_FRAGMENT_UNIFORM_COMPONENTS, &max); |
(...skipping 130 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
203 else { | 236 else { |
204 fES2CompatibilitySupport = true; | 237 fES2CompatibilitySupport = true; |
205 } | 238 } |
206 | 239 |
207 if (kGL_GrGLStandard == standard) { | 240 if (kGL_GrGLStandard == standard) { |
208 fMultisampleDisableSupport = true; | 241 fMultisampleDisableSupport = true; |
209 } else { | 242 } else { |
210 fMultisampleDisableSupport = false; | 243 fMultisampleDisableSupport = false; |
211 } | 244 } |
212 | 245 |
| 246 /************************************************************************** |
| 247 * GrShaderCaps fields |
| 248 **************************************************************************/ |
| 249 |
| 250 glslCaps->fPathRenderingSupport = ctxInfo.hasExtension("GL_NV_path_rendering
"); |
| 251 |
| 252 if (glslCaps->fPathRenderingSupport) { |
| 253 if (kGL_GrGLStandard == standard) { |
| 254 // We only support v1.3+ of GL_NV_path_rendering which allows us to |
| 255 // set individual fragment inputs with ProgramPathFragmentInputGen.
The API |
| 256 // additions are detected by checking the existence of the function. |
| 257 glslCaps->fPathRenderingSupport = |
| 258 ctxInfo.hasExtension("GL_EXT_direct_state_access") && |
| 259 ((ctxInfo.version() >= GR_GL_VER(4, 3) || |
| 260 ctxInfo.hasExtension("GL_ARB_program_interface_query")) && |
| 261 gli->fFunctions.fProgramPathFragmentInputGen); |
| 262 } |
| 263 else { |
| 264 glslCaps->fPathRenderingSupport = ctxInfo.version() >= GR_GL_VER(3,
1); |
| 265 } |
| 266 } |
| 267 |
| 268 // For now these two are equivalent but we could have dst read in shader via
some other method |
| 269 glslCaps->fDstReadInShaderSupport = glslCaps->fFBFetchSupport; |
| 270 |
| 271 // Enable supported shader-related caps |
| 272 if (kGL_GrGLStandard == standard) { |
| 273 glslCaps->fDualSourceBlendingSupport = (ctxInfo.version() >= GR_GL_VER(3
, 3) || |
| 274 ctxInfo.hasExtension("GL_ARB_blend_func_extended")) && |
| 275 GrGLSLSupportsNamedFragmentShaderOutputs(ctxInfo.glslGeneration()); |
| 276 glslCaps->fShaderDerivativeSupport = true; |
| 277 // we don't support GL_ARB_geometry_shader4, just GL 3.2+ GS |
| 278 glslCaps->fGeometryShaderSupport = ctxInfo.version() >= GR_GL_VER(3, 2)
&& |
| 279 ctxInfo.glslGeneration() >= k150_GrGLSLGeneration; |
| 280 } |
| 281 else { |
| 282 glslCaps->fShaderDerivativeSupport = ctxInfo.version() >= GR_GL_VER(3, 0
) || |
| 283 ctxInfo.hasExtension("GL_OES_standard_derivatives"); |
| 284 } |
| 285 |
| 286 // We need dual source blending and the ability to disable multisample in or
der to support mixed |
| 287 // samples in every corner case. |
| 288 if (fMultisampleDisableSupport && glslCaps->fDualSourceBlendingSupport) { |
| 289 // We understand "mixed samples" to mean the collective capability of 3
different extensions |
| 290 glslCaps->fMixedSamplesSupport = |
| 291 ctxInfo.hasExtension("GL_NV_framebuffer_mixed_samples") && |
| 292 ctxInfo.hasExtension("GL_NV_sample_mask_override_coverage") && |
| 293 ctxInfo.hasExtension("GL_EXT_raster_multisample"); |
| 294 } |
| 295 |
| 296 /************************************************************************** |
| 297 * GrCaps fields |
| 298 **************************************************************************/ |
| 299 |
213 this->initFSAASupport(ctxInfo, gli); | 300 this->initFSAASupport(ctxInfo, gli); |
214 this->initStencilFormats(ctxInfo); | 301 this->initStencilFormats(ctxInfo); |
215 | 302 |
216 /************************************************************************** | |
217 * GrCaps fields | |
218 **************************************************************************/ | |
219 if (kGL_GrGLStandard == standard) { | 303 if (kGL_GrGLStandard == standard) { |
220 // we could also look for GL_ATI_separate_stencil extension or | 304 // we could also look for GL_ATI_separate_stencil extension or |
221 // GL_EXT_stencil_two_side but they use different function signatures | 305 // GL_EXT_stencil_two_side but they use different function signatures |
222 // than GL2.0+ (and than each other). | 306 // than GL2.0+ (and than each other). |
223 fTwoSidedStencilSupport = (ctxInfo.version() >= GR_GL_VER(2,0)); | 307 fTwoSidedStencilSupport = (ctxInfo.version() >= GR_GL_VER(2,0)); |
224 // supported on GL 1.4 and higher or by extension | 308 // supported on GL 1.4 and higher or by extension |
225 fStencilWrapOpsSupport = (ctxInfo.version() >= GR_GL_VER(1,4)) || | 309 fStencilWrapOpsSupport = (ctxInfo.version() >= GR_GL_VER(1,4)) || |
226 ctxInfo.hasExtension("GL_EXT_stencil_wrap"); | 310 ctxInfo.hasExtension("GL_EXT_stencil_wrap"); |
227 } else { | 311 } else { |
228 // ES 2 has two sided stencil and stencil wrap | 312 // ES 2 has two sided stencil and stencil wrap |
229 fTwoSidedStencilSupport = true; | 313 fTwoSidedStencilSupport = true; |
230 fStencilWrapOpsSupport = true; | 314 fStencilWrapOpsSupport = true; |
231 } | 315 } |
232 | 316 |
233 // Disabling advanced blend until we can resolve various bugs | 317 // Disabling advanced blend until we can resolve various bugs |
234 #if 0 | 318 #if 0 |
235 if (kIntel_GrGLVendor != ctxInfo.vendor()) { | 319 if (kIntel_GrGLVendor != ctxInfo.vendor()) { |
236 if (ctxInfo.hasExtension("GL_KHR_blend_equation_advanced_coherent") || | 320 if (ctxInfo.hasExtension("GL_NV_blend_equation_advanced_coherent")) { |
237 ctxInfo.hasExtension("GL_NV_blend_equation_advanced_coherent")) { | |
238 fBlendEquationSupport = kAdvancedCoherent_BlendEquationSupport; | 321 fBlendEquationSupport = kAdvancedCoherent_BlendEquationSupport; |
239 } else if (ctxInfo.hasExtension("GL_KHR_blend_equation_advanced") || | 322 glslCaps->fAdvBlendEqInteraction = GrGLSLCaps::kAutomatic_AdvBlendEq
Interaction; |
240 ctxInfo.hasExtension("GL_NV_blend_equation_advanced")) { | 323 } else if (ctxInfo.hasExtension("GL_KHR_blend_equation_advanced_coherent
")) { |
| 324 fBlendEquationSupport = kAdvancedCoherent_BlendEquationSupport; |
| 325 glslCaps->fAdvBlendEqInteraction = GrGLSLCaps::kGeneralEnable_AdvBle
ndEqInteraction; |
| 326 } else if (ctxInfo.hasExtension("GL_NV_blend_equation_advanced")) { |
241 fBlendEquationSupport = kAdvanced_BlendEquationSupport; | 327 fBlendEquationSupport = kAdvanced_BlendEquationSupport; |
242 } else { | 328 glslCaps->fAdvBlendEqInteraction = GrGLSLCaps::kAutomatic_AdvBlendEq
Interaction; |
243 fBlendEquationSupport = kBasic_BlendEquationSupport; | 329 } else if (ctxInfo.hasExtension("GL_KHR_blend_equation_advanced")) { |
| 330 fBlendEquationSupport = kAdvanced_BlendEquationSupport; |
| 331 glslCaps->fAdvBlendEqInteraction = GrGLSLCaps::kGeneralEnable_AdvBle
ndEqInteraction; |
244 } | 332 } |
245 } else { | |
246 // On Intel platforms, KHR_blend_equation_advanced is not conformant. | |
247 fBlendEquationSupport = kBasic_BlendEquationSupport; | |
248 } | 333 } |
249 #endif | 334 #endif |
250 if (kGL_GrGLStandard == standard) { | 335 if (kGL_GrGLStandard == standard) { |
251 fMapBufferFlags = kCanMap_MapFlag; // we require VBO support and the des
ktop VBO | 336 fMapBufferFlags = kCanMap_MapFlag; // we require VBO support and the des
ktop VBO |
252 // extension includes glMapBuffer. | 337 // extension includes glMapBuffer. |
253 if (version >= GR_GL_VER(3, 0) || ctxInfo.hasExtension("GL_ARB_map_buffe
r_range")) { | 338 if (version >= GR_GL_VER(3, 0) || ctxInfo.hasExtension("GL_ARB_map_buffe
r_range")) { |
254 fMapBufferFlags |= kSubset_MapFlag; | 339 fMapBufferFlags |= kSubset_MapFlag; |
255 fMapBufferType = kMapBufferRange_MapBufferType; | 340 fMapBufferType = kMapBufferRange_MapBufferType; |
256 } else { | 341 } else { |
257 fMapBufferType = kMapBuffer_MapBufferType; | 342 fMapBufferType = kMapBuffer_MapBufferType; |
(...skipping 73 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
331 } else { | 416 } else { |
332 SkASSERT(ctxInfo.hasExtension("GL_EXT_framebuffer_object")); | 417 SkASSERT(ctxInfo.hasExtension("GL_EXT_framebuffer_object")); |
333 } | 418 } |
334 } else { | 419 } else { |
335 // ES 3.0 supports mixed size FBO attachments, 2.0 does not. | 420 // ES 3.0 supports mixed size FBO attachments, 2.0 does not. |
336 fOversizedStencilSupport = ctxInfo.version() >= GR_GL_VER(3, 0); | 421 fOversizedStencilSupport = ctxInfo.version() >= GR_GL_VER(3, 0); |
337 } | 422 } |
338 | 423 |
339 this->initConfigTexturableTable(ctxInfo, gli); | 424 this->initConfigTexturableTable(ctxInfo, gli); |
340 this->initConfigRenderableTable(ctxInfo); | 425 this->initConfigRenderableTable(ctxInfo); |
| 426 glslCaps->initShaderPrecisionTable(ctxInfo, gli); |
| 427 |
| 428 this->applyOptionsOverrides(contextOptions); |
| 429 glslCaps->applyOptionsOverrides(contextOptions); |
341 } | 430 } |
342 | 431 |
343 void GrGLCaps::initConfigRenderableTable(const GrGLContextInfo& ctxInfo) { | 432 void GrGLCaps::initConfigRenderableTable(const GrGLContextInfo& ctxInfo) { |
344 // OpenGL < 3.0 | 433 // OpenGL < 3.0 |
345 // no support for render targets unless the GL_ARB_framebuffer_object | 434 // no support for render targets unless the GL_ARB_framebuffer_object |
346 // extension is supported (in which case we get ALPHA, RED, RG, RGB, | 435 // extension is supported (in which case we get ALPHA, RED, RG, RGB, |
347 // RGBA (ALPHA8, RGBA4, RGBA8) for OpenGL > 1.1). Note that we | 436 // RGBA (ALPHA8, RGBA4, RGBA8) for OpenGL > 1.1). Note that we |
348 // probably don't get R8 in this case. | 437 // probably don't get R8 in this case. |
349 | 438 |
350 // OpenGL 3.0 | 439 // OpenGL 3.0 |
(...skipping 559 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
910 GrGLSLCaps::GrGLSLCaps(const GrContextOptions& options, | 999 GrGLSLCaps::GrGLSLCaps(const GrContextOptions& options, |
911 const GrGLContextInfo& ctxInfo, | 1000 const GrGLContextInfo& ctxInfo, |
912 const GrGLInterface* gli, | 1001 const GrGLInterface* gli, |
913 const GrGLCaps& glCaps) { | 1002 const GrGLCaps& glCaps) { |
914 fDropsTileOnZeroDivide = false; | 1003 fDropsTileOnZeroDivide = false; |
915 fFBFetchSupport = false; | 1004 fFBFetchSupport = false; |
916 fFBFetchNeedsCustomOutput = false; | 1005 fFBFetchNeedsCustomOutput = false; |
917 fAdvBlendEqInteraction = kNotSupported_AdvBlendEqInteraction; | 1006 fAdvBlendEqInteraction = kNotSupported_AdvBlendEqInteraction; |
918 fFBFetchColorName = NULL; | 1007 fFBFetchColorName = NULL; |
919 fFBFetchExtensionString = NULL; | 1008 fFBFetchExtensionString = NULL; |
920 this->init(ctxInfo, gli, glCaps); | |
921 this->applyOptionsOverrides(options); | |
922 } | |
923 | |
924 void GrGLSLCaps::init(const GrGLContextInfo& ctxInfo, | |
925 const GrGLInterface* gli, | |
926 const GrGLCaps& glCaps) { | |
927 fGLSLGeneration = ctxInfo.glslGeneration(); | |
928 GrGLStandard standard = ctxInfo.standard(); | |
929 GrGLVersion version = ctxInfo.version(); | |
930 | |
931 /************************************************************************** | |
932 * Caps specific to GrGLSLCaps | |
933 **************************************************************************/ | |
934 | |
935 if (kGLES_GrGLStandard == standard) { | |
936 if (ctxInfo.hasExtension("GL_EXT_shader_framebuffer_fetch")) { | |
937 fFBFetchNeedsCustomOutput = (version >= GR_GL_VER(3, 0)); | |
938 fFBFetchSupport = true; | |
939 fFBFetchColorName = "gl_LastFragData[0]"; | |
940 fFBFetchExtensionString = "GL_EXT_shader_framebuffer_fetch"; | |
941 } | |
942 else if (ctxInfo.hasExtension("GL_NV_shader_framebuffer_fetch")) { | |
943 // Actually, we haven't seen an ES3.0 device with this extension yet
, so we don't know | |
944 fFBFetchNeedsCustomOutput = false; | |
945 fFBFetchSupport = true; | |
946 fFBFetchColorName = "gl_LastFragData[0]"; | |
947 fFBFetchExtensionString = "GL_NV_shader_framebuffer_fetch"; | |
948 } | |
949 else if (ctxInfo.hasExtension("GL_ARM_shader_framebuffer_fetch")) { | |
950 // The arm extension also requires an additional flag which we will
set onResetContext | |
951 fFBFetchNeedsCustomOutput = false; | |
952 fFBFetchSupport = true; | |
953 fFBFetchColorName = "gl_LastFragColorARM"; | |
954 fFBFetchExtensionString = "GL_ARM_shader_framebuffer_fetch"; | |
955 } | |
956 } | |
957 | |
958 // Adreno GPUs have a tendency to drop tiles when there is a divide-by-zero
in a shader | |
959 fDropsTileOnZeroDivide = kQualcomm_GrGLVendor == ctxInfo.vendor(); | |
960 | |
961 /************************************************************************** | |
962 * GrShaderCaps fields | |
963 **************************************************************************/ | |
964 | |
965 fPathRenderingSupport = ctxInfo.hasExtension("GL_NV_path_rendering"); | |
966 | |
967 if (fPathRenderingSupport) { | |
968 if (kGL_GrGLStandard == standard) { | |
969 // We only support v1.3+ of GL_NV_path_rendering which allows us to | |
970 // set individual fragment inputs with ProgramPathFragmentInputGen.
The API | |
971 // additions are detected by checking the existence of the function. | |
972 fPathRenderingSupport = ctxInfo.hasExtension("GL_EXT_direct_state_ac
cess") && | |
973 ((ctxInfo.version() >= GR_GL_VER(4, 3) || | |
974 ctxInfo.hasExtension("GL_ARB_program_interface_query")) && | |
975 gli->fFunctions.fProgramPathFragmentInputGen); | |
976 } | |
977 else { | |
978 fPathRenderingSupport = ctxInfo.version() >= GR_GL_VER(3, 1); | |
979 } | |
980 } | |
981 | |
982 // For now these two are equivalent but we could have dst read in shader via
some other method | |
983 fDstReadInShaderSupport = fFBFetchSupport; | |
984 | |
985 // Enable supported shader-related caps | |
986 if (kGL_GrGLStandard == standard) { | |
987 fDualSourceBlendingSupport = (ctxInfo.version() >= GR_GL_VER(3, 3) || | |
988 ctxInfo.hasExtension("GL_ARB_blend_func_extended")) && | |
989 GrGLSLSupportsNamedFragmentShaderOutputs(ctxInfo.glslGeneration()); | |
990 fShaderDerivativeSupport = true; | |
991 // we don't support GL_ARB_geometry_shader4, just GL 3.2+ GS | |
992 fGeometryShaderSupport = ctxInfo.version() >= GR_GL_VER(3, 2) && | |
993 ctxInfo.glslGeneration() >= k150_GrGLSLGeneration; | |
994 } | |
995 else { | |
996 fShaderDerivativeSupport = ctxInfo.version() >= GR_GL_VER(3, 0) || | |
997 ctxInfo.hasExtension("GL_OES_standard_derivatives"); | |
998 } | |
999 | |
1000 // We need dual source blending and the ability to disable multisample in or
der to support mixed | |
1001 // samples in every corner case. | |
1002 if (fDualSourceBlendingSupport && glCaps.multisampleDisableSupport()) { | |
1003 // We understand "mixed samples" to mean the collective capability of 3
different extensions | |
1004 fMixedSamplesSupport = ctxInfo.hasExtension("GL_NV_framebuffer_mixed_sam
ples") && | |
1005 ctxInfo.hasExtension("GL_NV_sample_mask_override_
coverage") && | |
1006 ctxInfo.hasExtension("GL_EXT_raster_multisample")
; | |
1007 } | |
1008 | |
1009 if (glCaps.advancedBlendEquationSupport()) { | |
1010 bool coherent = glCaps.advancedCoherentBlendEquationSupport(); | |
1011 if (ctxInfo.hasExtension(coherent ? "GL_NV_blend_equation_advanced_coher
ent" | |
1012 : "GL_NV_blend_equation_advanced")) { | |
1013 fAdvBlendEqInteraction = kAutomatic_AdvBlendEqInteraction; | |
1014 } else { | |
1015 fAdvBlendEqInteraction = kGeneralEnable_AdvBlendEqInteraction; | |
1016 // TODO: Use the following on any platform where "blend_support_all_
equations" is slow. | |
1017 //fAdvBlendEqInteraction = kSpecificEnables_AdvBlendEqInteraction; | |
1018 } | |
1019 } | |
1020 | |
1021 this->initShaderPrecisionTable(ctxInfo, gli); | |
1022 } | 1009 } |
1023 | 1010 |
1024 SkString GrGLSLCaps::dump() const { | 1011 SkString GrGLSLCaps::dump() const { |
1025 SkString r = INHERITED::dump(); | 1012 SkString r = INHERITED::dump(); |
1026 | 1013 |
1027 static const char* kAdvBlendEqInteractionStr[] = { | 1014 static const char* kAdvBlendEqInteractionStr[] = { |
1028 "Not Supported", | 1015 "Not Supported", |
1029 "Automatic", | 1016 "Automatic", |
1030 "General Enable", | 1017 "General Enable", |
1031 "Specific Enables", | 1018 "Specific Enables", |
(...skipping 90 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1122 if (fGeometryShaderSupport) { | 1109 if (fGeometryShaderSupport) { |
1123 for (int p = 0; p < kGrSLPrecisionCount; ++p) { | 1110 for (int p = 0; p < kGrSLPrecisionCount; ++p) { |
1124 fFloatPrecisions[kGeometry_GrShaderType][p] = fFloatPrecisions[kVert
ex_GrShaderType][p]; | 1111 fFloatPrecisions[kGeometry_GrShaderType][p] = fFloatPrecisions[kVert
ex_GrShaderType][p]; |
1125 } | 1112 } |
1126 } | 1113 } |
1127 } | 1114 } |
1128 | 1115 |
1129 | 1116 |
1130 | 1117 |
1131 | 1118 |
OLD | NEW |