Index: src/gpu/gl/GrGLCaps.cpp |
diff --git a/src/gpu/gl/GrGLCaps.cpp b/src/gpu/gl/GrGLCaps.cpp |
index e1f3e1b0330215adf60948c7eb854f9aa172ef88..106a07b6d75ae01161545cadd3ef9ab82bcfeb4a 100644 |
--- a/src/gpu/gl/GrGLCaps.cpp |
+++ b/src/gpu/gl/GrGLCaps.cpp |
@@ -64,6 +64,9 @@ void GrGLCaps::init(const GrContextOptions& contextOptions, |
GrGLStandard standard = ctxInfo.standard(); |
GrGLVersion version = ctxInfo.version(); |
+ this->initGLSL(ctxInfo); |
+ GrGLSLCaps* glslCaps = static_cast<GrGLSLCaps*>(fShaderCaps.get()); |
+ |
/************************************************************************** |
* Caps specific to GrGLCaps |
**************************************************************************/ |
@@ -283,9 +286,56 @@ void GrGLCaps::init(const GrContextOptions& contextOptions, |
#endif |
/************************************************************************** |
+ * GrShaderCaps fields |
+ **************************************************************************/ |
+ |
+ glslCaps->fPathRenderingSupport = this->hasPathRenderingSupport(ctxInfo, gli); |
+ |
+ // For now these two are equivalent but we could have dst read in shader via some other method. |
+ // Before setting this, initGLSL() must have been called. |
+ glslCaps->fDstReadInShaderSupport = glslCaps->fFBFetchSupport; |
+ |
+ // Enable supported shader-related caps |
+ if (kGL_GrGLStandard == standard) { |
+ glslCaps->fDualSourceBlendingSupport = (ctxInfo.version() >= GR_GL_VER(3, 3) || |
+ ctxInfo.hasExtension("GL_ARB_blend_func_extended")) && |
+ GrGLSLSupportsNamedFragmentShaderOutputs(ctxInfo.glslGeneration()); |
+ glslCaps->fShaderDerivativeSupport = true; |
+ // we don't support GL_ARB_geometry_shader4, just GL 3.2+ GS |
+ glslCaps->fGeometryShaderSupport = ctxInfo.version() >= GR_GL_VER(3, 2) && |
+ ctxInfo.glslGeneration() >= k150_GrGLSLGeneration; |
+ } |
+ else { |
+ glslCaps->fDualSourceBlendingSupport = ctxInfo.hasExtension("GL_EXT_blend_func_extended"); |
+ |
+ glslCaps->fShaderDerivativeSupport = ctxInfo.version() >= GR_GL_VER(3, 0) || |
+ ctxInfo.hasExtension("GL_OES_standard_derivatives"); |
+ } |
+ |
+ // We need dual source blending and the ability to disable multisample in order to support mixed |
+ // samples in every corner case. |
+ if (fMultisampleDisableSupport && glslCaps->fDualSourceBlendingSupport) { |
+ // We understand "mixed samples" to mean the collective capability of 3 different extensions |
+ glslCaps->fMixedSamplesSupport = |
+ ctxInfo.hasExtension("GL_NV_framebuffer_mixed_samples") && |
+ ctxInfo.hasExtension("GL_NV_sample_mask_override_coverage") && |
+ ctxInfo.hasExtension("GL_EXT_raster_multisample"); |
+ } |
+ // Workaround NVIDIA bug related to glInvalidateFramebuffer and mixed samples. |
+ if (kNVIDIA_GrGLDriver == ctxInfo.driver() && fShaderCaps->mixedSamplesSupport()) { |
+ fDiscardRenderTargetSupport = false; |
+ fInvalidateFBType = kNone_InvalidateFBType; |
+ } |
+ glslCaps->fProgrammableSampleLocationsSupport = |
+ ctxInfo.hasExtension("GL_NV_sample_locations") || |
+ ctxInfo.hasExtension("GL_ARB_sample_locations"); |
+ |
+ /************************************************************************** |
* GrCaps fields |
**************************************************************************/ |
+ // fPathRenderingSupport and fMixedSampleSupport must be set before calling initFSAASupport. |
+ // Both of these are set in the GrShaderCaps. |
this->initFSAASupport(ctxInfo, gli); |
this->initBlendEqationSupport(ctxInfo); |
this->initStencilFormats(ctxInfo); |
@@ -380,6 +430,7 @@ void GrGLCaps::init(const GrContextOptions& contextOptions, |
kQualcomm_GrGLVendor != ctxInfo.vendor(); |
#endif |
+ // initFSAASupport() must have been called before this point |
if (GrGLCaps::kES_IMG_MsToTexture_MSFBOType == fMSFBOType) { |
GR_GL_GetIntegerv(gli, GR_GL_MAX_SAMPLES_IMG, &fMaxSampleCount); |
} else if (GrGLCaps::kNone_MSFBOType != fMSFBOType) { |
@@ -432,10 +483,6 @@ void GrGLCaps::init(const GrContextOptions& contextOptions, |
ctxInfo.hasExtension("GL_EXT_instanced_arrays")); |
} |
- // Must init GLSLCaps after setting GLCaps |
- this->initGLSL(contextOptions, ctxInfo, gli); |
- GrGLSLCaps* glslCaps = static_cast<GrGLSLCaps*>(fShaderCaps.get()); |
- |
this->initConfigTexturableTable(ctxInfo, gli, srgbSupport); |
this->initConfigRenderableTable(ctxInfo, srgbSupport); |
this->initShaderPrecisionTable(ctxInfo, gli, glslCaps); |
@@ -487,9 +534,7 @@ const char* get_glsl_version_decl_string(GrGLStandard standard, GrGLSLGeneration |
return "<no version>"; |
} |
-void GrGLCaps::initGLSL(const GrContextOptions& contextOptions, |
- const GrGLContextInfo& ctxInfo, |
- const GrGLInterface* gli) { |
+void GrGLCaps::initGLSL(const GrGLContextInfo& ctxInfo) { |
GrGLStandard standard = ctxInfo.standard(); |
GrGLVersion version = ctxInfo.version(); |
@@ -541,50 +586,6 @@ void GrGLCaps::initGLSL(const GrContextOptions& contextOptions, |
glslCaps->fVersionDeclString = get_glsl_version_decl_string(standard, glslCaps->fGLSLGeneration, |
fIsCoreProfile); |
- |
- /************************************************************************** |
- * GrShaderCaps fields |
- **************************************************************************/ |
- |
- glslCaps->fPathRenderingSupport = this->hasPathRenderingSupport(ctxInfo, gli); |
- |
- // For now these two are equivalent but we could have dst read in shader via some other method |
- glslCaps->fDstReadInShaderSupport = glslCaps->fFBFetchSupport; |
- |
- // Enable supported shader-related caps |
- if (kGL_GrGLStandard == standard) { |
- glslCaps->fDualSourceBlendingSupport = (ctxInfo.version() >= GR_GL_VER(3, 3) || |
- ctxInfo.hasExtension("GL_ARB_blend_func_extended")) && |
- GrGLSLSupportsNamedFragmentShaderOutputs(ctxInfo.glslGeneration()); |
- glslCaps->fShaderDerivativeSupport = true; |
- // we don't support GL_ARB_geometry_shader4, just GL 3.2+ GS |
- glslCaps->fGeometryShaderSupport = ctxInfo.version() >= GR_GL_VER(3, 2) && |
- ctxInfo.glslGeneration() >= k150_GrGLSLGeneration; |
- } |
- else { |
- glslCaps->fDualSourceBlendingSupport = ctxInfo.hasExtension("GL_EXT_blend_func_extended"); |
- |
- glslCaps->fShaderDerivativeSupport = ctxInfo.version() >= GR_GL_VER(3, 0) || |
- ctxInfo.hasExtension("GL_OES_standard_derivatives"); |
- } |
- |
- // We need dual source blending and the ability to disable multisample in order to support mixed |
- // samples in every corner case. |
- if (fMultisampleDisableSupport && glslCaps->fDualSourceBlendingSupport) { |
- // We understand "mixed samples" to mean the collective capability of 3 different extensions |
- glslCaps->fMixedSamplesSupport = |
- ctxInfo.hasExtension("GL_NV_framebuffer_mixed_samples") && |
- ctxInfo.hasExtension("GL_NV_sample_mask_override_coverage") && |
- ctxInfo.hasExtension("GL_EXT_raster_multisample"); |
- } |
- // Workaround NVIDIA bug related to glInvalidateFramebuffer and mixed samples. |
- if (kNVIDIA_GrGLDriver == ctxInfo.driver() && fShaderCaps->mixedSamplesSupport()) { |
- fDiscardRenderTargetSupport = false; |
- fInvalidateFBType = kNone_InvalidateFBType; |
- } |
- glslCaps->fProgrammableSampleLocationsSupport = |
- ctxInfo.hasExtension("GL_NV_sample_locations") || |
- ctxInfo.hasExtension("GL_ARB_sample_locations"); |
} |
bool GrGLCaps::hasPathRenderingSupport(const GrGLContextInfo& ctxInfo, const GrGLInterface* gli) { |