| Index: src/gpu/gl/GrGLCaps.cpp | 
| diff --git a/src/gpu/gl/GrGLCaps.cpp b/src/gpu/gl/GrGLCaps.cpp | 
| index 5baed59f14de1cb501d766144c8343e2f14beef0..96a75b24d8f3d7af22dac46503e5199febb94ccb 100644 | 
| --- a/src/gpu/gl/GrGLCaps.cpp | 
| +++ b/src/gpu/gl/GrGLCaps.cpp | 
| @@ -27,7 +27,6 @@ GrGLCaps::GrGLCaps(const GrContextOptions& contextOptions, | 
| fTransferBufferType = kNone_TransferBufferType; | 
| fMaxFragmentUniformVectors = 0; | 
| fMaxVertexAttributes = 0; | 
| -    fMaxFragmentTextureUnits = 0; | 
| fUnpackRowLengthSupport = false; | 
| fUnpackFlipYSupport = false; | 
| fPackRowLengthSupport = false; | 
| @@ -46,7 +45,6 @@ GrGLCaps::GrGLCaps(const GrContextOptions& contextOptions, | 
| fUseNonVBOVertexAndIndexDynamicData = false; | 
| fIsCoreProfile = false; | 
| fBindFragDataLocationSupport = false; | 
| -    fExternalTextureSupport = false; | 
| fRectangleTextureSupport = false; | 
| fTextureSwizzleSupport = false; | 
| fSRGBWriteControl = false; | 
| @@ -86,7 +84,6 @@ void GrGLCaps::init(const GrContextOptions& contextOptions, | 
| } | 
| } | 
| GR_GL_GetIntegerv(gli, GR_GL_MAX_VERTEX_ATTRIBS, &fMaxVertexAttributes); | 
| -    GR_GL_GetIntegerv(gli, GR_GL_MAX_TEXTURE_IMAGE_UNITS, &fMaxFragmentTextureUnits); | 
|  | 
| if (kGL_GrGLStandard == standard) { | 
| fUnpackRowLengthSupport = true; | 
| @@ -213,16 +210,6 @@ void GrGLCaps::init(const GrContextOptions& contextOptions, | 
| fBindUniformLocationSupport = false; | 
| #endif | 
|  | 
| -    if (ctxInfo.hasExtension("GL_OES_EGL_image_external")) { | 
| -        if (ctxInfo.glslGeneration() == k110_GrGLSLGeneration) { | 
| -            fExternalTextureSupport = true; | 
| -        } else if (ctxInfo.hasExtension("GL_OES_EGL_image_external_essl3") || | 
| -                   ctxInfo.hasExtension("OES_EGL_image_external_essl3")) { | 
| -            // At least one driver has been found that has this extension without the "GL_" prefix. | 
| -            fExternalTextureSupport = true; | 
| -        } | 
| -    } | 
| - | 
| if (kGL_GrGLStandard == standard) { | 
| if (version >= GR_GL_VER(3, 1) || ctxInfo.hasExtension("GL_ARB_texture_rectangle")) { | 
| // We also require textureSize() support for rectangle 2D samplers which was added in | 
| @@ -313,6 +300,20 @@ void GrGLCaps::init(const GrContextOptions& contextOptions, | 
| glslCaps->fPLSPathRenderingSupport = false; | 
| } | 
|  | 
| +    // Protect ourselves against tracking huge amounts of texture state. | 
| +    static const uint8_t kMaxSaneSamplers = 32; | 
| +    GrGLint maxSamplers; | 
| +    GR_GL_GetIntegerv(gli, GR_GL_MAX_VERTEX_TEXTURE_IMAGE_UNITS, &maxSamplers); | 
| +    glslCaps->fMaxVertexSamplers = SkTMin<GrGLint>(kMaxSaneSamplers, maxSamplers); | 
| +    if (glslCaps->fGeometryShaderSupport) { | 
| +        GR_GL_GetIntegerv(gli, GR_GL_MAX_GEOMETRY_TEXTURE_IMAGE_UNITS, &maxSamplers); | 
| +        glslCaps->fMaxGeometrySamplers = SkTMin<GrGLint>(kMaxSaneSamplers, maxSamplers); | 
| +    } | 
| +    GR_GL_GetIntegerv(gli, GR_GL_MAX_TEXTURE_IMAGE_UNITS, &maxSamplers); | 
| +    glslCaps->fMaxFragmentSamplers = SkTMin<GrGLint>(kMaxSaneSamplers, maxSamplers); | 
| +    GR_GL_GetIntegerv(gli, GR_GL_MAX_COMBINED_TEXTURE_IMAGE_UNITS, &maxSamplers); | 
| +    glslCaps->fMaxCombinedSamplers = SkTMin<GrGLint>(kMaxSaneSamplers, maxSamplers); | 
| + | 
| /************************************************************************** | 
| * GrCaps fields | 
| **************************************************************************/ | 
| @@ -698,7 +699,17 @@ void GrGLCaps::initGLSL(const GrGLContextInfo& ctxInfo) { | 
| glslCaps->fSecondaryOutputExtensionString = "GL_EXT_blend_func_extended"; | 
| } | 
|  | 
| -    if (fExternalTextureSupport) { | 
| +    if (ctxInfo.hasExtension("GL_OES_EGL_image_external")) { | 
| +        if (ctxInfo.glslGeneration() == k110_GrGLSLGeneration) { | 
| +            glslCaps->fExternalTextureSupport = true; | 
| +        } else if (ctxInfo.hasExtension("GL_OES_EGL_image_external_essl3") || | 
| +                   ctxInfo.hasExtension("OES_EGL_image_external_essl3")) { | 
| +            // At least one driver has been found that has this extension without the "GL_" prefix. | 
| +            glslCaps->fExternalTextureSupport = true; | 
| +        } | 
| +    } | 
| + | 
| +    if (glslCaps->fExternalTextureSupport) { | 
| if (ctxInfo.glslGeneration() == k110_GrGLSLGeneration) { | 
| glslCaps->fExternalTextureExtensionString = "GL_OES_EGL_image_external"; | 
| } else { | 
| @@ -1026,7 +1037,6 @@ SkString GrGLCaps::dump() const { | 
| r.appendf("Invalidate FB Type: %s\n", kInvalidateFBTypeStr[fInvalidateFBType]); | 
| r.appendf("Map Buffer Type: %s\n", kMapBufferTypeStr[fMapBufferType]); | 
| r.appendf("Max FS Uniform Vectors: %d\n", fMaxFragmentUniformVectors); | 
| -    r.appendf("Max FS Texture Units: %d\n", fMaxFragmentTextureUnits); | 
| r.appendf("Max Vertex Attributes: %d\n", fMaxVertexAttributes); | 
| r.appendf("Unpack Row length support: %s\n", (fUnpackRowLengthSupport ? "YES": "NO")); | 
| r.appendf("Unpack Flip Y support: %s\n", (fUnpackFlipYSupport ? "YES": "NO")); | 
| @@ -1049,7 +1059,6 @@ SkString GrGLCaps::dump() const { | 
| r.appendf("RGBA 8888 pixel ops are slow: %s\n", (fRGBA8888PixelsOpsAreSlow ? "YES" : "NO")); | 
| r.appendf("Partial FBO read is slow: %s\n", (fPartialFBOReadIsSlow ? "YES" : "NO")); | 
| r.appendf("Bind uniform location support: %s\n", (fBindUniformLocationSupport ? "YES" : "NO")); | 
| -    r.appendf("External texture support: %s\n", (fExternalTextureSupport ? "YES" : "NO")); | 
| r.appendf("Rectangle texture support: %s\n", (fRectangleTextureSupport? "YES" : "NO")); | 
| r.appendf("Texture swizzle support: %s\n", (fTextureSwizzleSupport ? "YES" : "NO")); | 
|  | 
|  |