| Index: src/gpu/gl/GrGLCaps.cpp | 
| diff --git a/src/gpu/gl/GrGLCaps.cpp b/src/gpu/gl/GrGLCaps.cpp | 
| index 0c53006bd214e369efc471779b0f5ffcc8db878c..22fd053c1d46ab92c9db192302c2a9a87a864443 100644 | 
| --- a/src/gpu/gl/GrGLCaps.cpp | 
| +++ b/src/gpu/gl/GrGLCaps.cpp | 
| @@ -9,6 +9,7 @@ | 
| #include "GrGLCaps.h" | 
|  | 
| #include "GrGLContext.h" | 
| +#include "glsl/GrGLSLCaps.h" | 
| #include "SkTSearch.h" | 
| #include "SkTSort.h" | 
|  | 
| @@ -51,8 +52,7 @@ GrGLCaps::GrGLCaps(const GrContextOptions& contextOptions, | 
|  | 
| fReadPixelsSupportedCache.reset(); | 
|  | 
| -    fShaderCaps.reset(SkNEW_ARGS(GrGLSLCaps, (contextOptions, | 
| -        ctxInfo, glInterface, *this))); | 
| +    fShaderCaps.reset(SkNEW_ARGS(GrGLSLCaps, (contextOptions))); | 
|  | 
| this->init(contextOptions, ctxInfo, glInterface); | 
| } | 
| @@ -450,7 +450,7 @@ void GrGLCaps::init(const GrContextOptions& contextOptions, | 
|  | 
| this->initConfigTexturableTable(ctxInfo, gli); | 
| this->initConfigRenderableTable(ctxInfo); | 
| -    glslCaps->initShaderPrecisionTable(ctxInfo, gli); | 
| +    this->initShaderPrecisionTable(ctxInfo, gli, glslCaps); | 
|  | 
| this->applyOptionsOverrides(contextOptions); | 
| glslCaps->applyOptionsOverrides(contextOptions); | 
| @@ -1078,46 +1078,6 @@ SkString GrGLCaps::dump() const { | 
| return r; | 
| } | 
|  | 
| -//////////////////////////////////////////////////////////////////////////////////////////// | 
| - | 
| -GrGLSLCaps::GrGLSLCaps(const GrContextOptions& options, | 
| -                       const GrGLContextInfo& ctxInfo, | 
| -                       const GrGLInterface* gli, | 
| -                       const GrGLCaps& glCaps) { | 
| -    fDropsTileOnZeroDivide = false; | 
| -    fFBFetchSupport = false; | 
| -    fFBFetchNeedsCustomOutput = false; | 
| -    fBindlessTextureSupport = false; | 
| -    fAdvBlendEqInteraction = kNotSupported_AdvBlendEqInteraction; | 
| -    fFBFetchColorName = NULL; | 
| -    fFBFetchExtensionString = NULL; | 
| -} | 
| - | 
| -SkString GrGLSLCaps::dump() const { | 
| -    SkString r = INHERITED::dump(); | 
| - | 
| -    static const char* kAdvBlendEqInteractionStr[] = { | 
| -        "Not Supported", | 
| -        "Automatic", | 
| -        "General Enable", | 
| -        "Specific Enables", | 
| -    }; | 
| -    GR_STATIC_ASSERT(0 == kNotSupported_AdvBlendEqInteraction); | 
| -    GR_STATIC_ASSERT(1 == kAutomatic_AdvBlendEqInteraction); | 
| -    GR_STATIC_ASSERT(2 == kGeneralEnable_AdvBlendEqInteraction); | 
| -    GR_STATIC_ASSERT(3 == kSpecificEnables_AdvBlendEqInteraction); | 
| -    GR_STATIC_ASSERT(SK_ARRAY_COUNT(kAdvBlendEqInteractionStr) == kLast_AdvBlendEqInteraction + 1); | 
| - | 
| -    r.appendf("--- GLSL-Specific ---\n"); | 
| - | 
| -    r.appendf("FB Fetch Support: %s\n", (fFBFetchSupport ? "YES" : "NO")); | 
| -    r.appendf("Drops tile on zero divide: %s\n", (fDropsTileOnZeroDivide ? "YES" : "NO")); | 
| -    r.appendf("Bindless texture support: %s\n", (fBindlessTextureSupport ? "YES" : "NO")); | 
| -    r.appendf("Advanced blend equation interaction: %s\n", | 
| -              kAdvBlendEqInteractionStr[fAdvBlendEqInteraction]); | 
| -    return r; | 
| -} | 
| - | 
| static GrGLenum precision_to_gl_float_type(GrSLPrecision p) { | 
| switch (p) { | 
| case kLow_GrSLPrecision: | 
| @@ -1144,16 +1104,17 @@ static GrGLenum shader_type_to_gl_shader(GrShaderType type) { | 
| return -1; | 
| } | 
|  | 
| -void GrGLSLCaps::initShaderPrecisionTable(const GrGLContextInfo& ctxInfo, | 
| -                                          const GrGLInterface* intf) { | 
| +void GrGLCaps::initShaderPrecisionTable(const GrGLContextInfo& ctxInfo, | 
| +                                        const GrGLInterface* intf, | 
| +                                        GrGLSLCaps* glslCaps) { | 
| if (kGLES_GrGLStandard == ctxInfo.standard() || ctxInfo.version() >= GR_GL_VER(4, 1) || | 
| ctxInfo.hasExtension("GL_ARB_ES2_compatibility")) { | 
| for (int s = 0; s < kGrShaderTypeCount; ++s) { | 
| if (kGeometry_GrShaderType != s) { | 
| GrShaderType shaderType = static_cast<GrShaderType>(s); | 
| GrGLenum glShader = shader_type_to_gl_shader(shaderType); | 
| -                PrecisionInfo* first = NULL; | 
| -                fShaderPrecisionVaries = false; | 
| +                GrShaderCaps::PrecisionInfo* first = NULL; | 
| +                glslCaps->fShaderPrecisionVaries = false; | 
| for (int p = 0; p < kGrSLPrecisionCount; ++p) { | 
| GrSLPrecision precision = static_cast<GrSLPrecision>(p); | 
| GrGLenum glPrecision = precision_to_gl_float_type(precision); | 
| @@ -1161,14 +1122,15 @@ void GrGLSLCaps::initShaderPrecisionTable(const GrGLContextInfo& ctxInfo, | 
| GrGLint bits; | 
| GR_GL_GetShaderPrecisionFormat(intf, glShader, glPrecision, range, &bits); | 
| if (bits) { | 
| -                        fFloatPrecisions[s][p].fLogRangeLow = range[0]; | 
| -                        fFloatPrecisions[s][p].fLogRangeHigh = range[1]; | 
| -                        fFloatPrecisions[s][p].fBits = bits; | 
| +                        glslCaps->fFloatPrecisions[s][p].fLogRangeLow = range[0]; | 
| +                        glslCaps->fFloatPrecisions[s][p].fLogRangeHigh = range[1]; | 
| +                        glslCaps->fFloatPrecisions[s][p].fBits = bits; | 
| if (!first) { | 
| -                            first = &fFloatPrecisions[s][p]; | 
| +                            first = &glslCaps->fFloatPrecisions[s][p]; | 
| } | 
| -                        else if (!fShaderPrecisionVaries) { | 
| -                            fShaderPrecisionVaries = (*first != fFloatPrecisions[s][p]); | 
| +                        else if (!glslCaps->fShaderPrecisionVaries) { | 
| +                            glslCaps->fShaderPrecisionVaries = | 
| +                                                     (*first != glslCaps->fFloatPrecisions[s][p]); | 
| } | 
| } | 
| } | 
| @@ -1177,13 +1139,13 @@ void GrGLSLCaps::initShaderPrecisionTable(const GrGLContextInfo& ctxInfo, | 
| } | 
| else { | 
| // We're on a desktop GL that doesn't have precision info. Assume they're all 32bit float. | 
| -        fShaderPrecisionVaries = false; | 
| +        glslCaps->fShaderPrecisionVaries = false; | 
| for (int s = 0; s < kGrShaderTypeCount; ++s) { | 
| if (kGeometry_GrShaderType != s) { | 
| for (int p = 0; p < kGrSLPrecisionCount; ++p) { | 
| -                    fFloatPrecisions[s][p].fLogRangeLow = 127; | 
| -                    fFloatPrecisions[s][p].fLogRangeHigh = 127; | 
| -                    fFloatPrecisions[s][p].fBits = 23; | 
| +                    glslCaps->fFloatPrecisions[s][p].fLogRangeLow = 127; | 
| +                    glslCaps->fFloatPrecisions[s][p].fLogRangeHigh = 127; | 
| +                    glslCaps->fFloatPrecisions[s][p].fBits = 23; | 
| } | 
| } | 
| } | 
| @@ -1192,9 +1154,10 @@ void GrGLSLCaps::initShaderPrecisionTable(const GrGLContextInfo& ctxInfo, | 
| // the same as the vertex shader. Only fragment shaders were ever allowed to omit support for | 
| // highp. GS was added after GetShaderPrecisionFormat was added to the list of features that | 
| // are recommended against. | 
| -    if (fGeometryShaderSupport) { | 
| +    if (glslCaps->fGeometryShaderSupport) { | 
| for (int p = 0; p < kGrSLPrecisionCount; ++p) { | 
| -            fFloatPrecisions[kGeometry_GrShaderType][p] = fFloatPrecisions[kVertex_GrShaderType][p]; | 
| +            glslCaps->fFloatPrecisions[kGeometry_GrShaderType][p] = | 
| +                                               glslCaps->fFloatPrecisions[kVertex_GrShaderType][p]; | 
| } | 
| } | 
| } | 
|  |