| 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 |