| Index: src/gpu/gl/GrGLCaps.h | 
| diff --git a/src/gpu/gl/GrGLCaps.h b/src/gpu/gl/GrGLCaps.h | 
| index 954b158809a5ccff495dec7ba0c3b75cf0955931..13ba3863b1228efc806a0da20e7c0f0fee30604b 100644 | 
| --- a/src/gpu/gl/GrGLCaps.h | 
| +++ b/src/gpu/gl/GrGLCaps.h | 
| @@ -16,6 +16,7 @@ | 
| #include "SkTArray.h" | 
|  | 
| class GrGLContextInfo; | 
| +class GrGLSLCaps; | 
|  | 
| /** | 
| * Stores some capabilities of a GL context. Most are determined by the GL | 
| @@ -165,19 +166,6 @@ public: | 
| kES_EXT_MsToTexture_MSFBOType == fMSFBOType; | 
| } | 
|  | 
| -    /** | 
| -     * Some helper functions for encapsulating various extensions to read FB Buffer on openglES | 
| -     * | 
| -     * TODO(joshualitt) On desktop opengl 4.2+ we can achieve something similar to this effect | 
| -     */ | 
| -    bool fbFetchSupport() const { return fFBFetchSupport; } | 
| - | 
| -    bool fbFetchNeedsCustomOutput() const { return fFBFetchNeedsCustomOutput; } | 
| - | 
| -    const char* fbFetchColorName() const { return fFBFetchColorName; } | 
| - | 
| -    const char* fbFetchExtensionString() const { return fFBFetchExtensionString; } | 
| - | 
| bool fbMixedSamplesSupport() const { return fFBMixedSamplesSupport; } | 
|  | 
| InvalidateFBType invalidateFBType() const { return fInvalidateFBType; } | 
| @@ -265,8 +253,6 @@ public: | 
|  | 
| bool fullClearIsFree() const { return fFullClearIsFree; } | 
|  | 
| -    bool dropsTileOnZeroDivide() const { return fDropsTileOnZeroDivide; } | 
| - | 
| /** | 
| * Returns a string containing the caps info. | 
| */ | 
| @@ -285,6 +271,8 @@ public: | 
|  | 
| LATCAlias latcAlias() const { return fLATCAlias; } | 
|  | 
| +    GrGLSLCaps* glslCaps() const { return reinterpret_cast<GrGLSLCaps*>(fShaderCaps.get()); } | 
| + | 
| private: | 
| /** | 
| * Maintains a bit per GrPixelConfig. It is used to avoid redundantly | 
| @@ -329,9 +317,6 @@ private: | 
| void initConfigRenderableTable(const GrGLContextInfo&); | 
| void initConfigTexturableTable(const GrGLContextInfo&, const GrGLInterface*); | 
|  | 
| -    // Must be called after fGeometryShaderSupport is initialized. | 
| -    void initShaderPrecisionTable(const GrGLContextInfo&, const GrGLInterface*); | 
| - | 
| bool doReadPixelsSupported(const GrGLInterface* intf, GrGLenum format, GrGLenum type) const; | 
|  | 
| // tracks configs that have been verified to pass the FBO completeness when | 
| @@ -371,14 +356,8 @@ private: | 
| bool fUseNonVBOVertexAndIndexDynamicData : 1; | 
| bool fIsCoreProfile : 1; | 
| bool fFullClearIsFree : 1; | 
| -    bool fDropsTileOnZeroDivide : 1; | 
| -    bool fFBFetchSupport : 1; | 
| -    bool fFBFetchNeedsCustomOutput : 1; | 
| bool fFBMixedSamplesSupport : 1; | 
|  | 
| -    const char* fFBFetchColorName; | 
| -    const char* fFBFetchExtensionString; | 
| - | 
| struct ReadPixelsSupportedFormat { | 
| GrGLenum fFormat; | 
| GrGLenum fType; | 
| @@ -395,6 +374,66 @@ private: | 
| typedef GrDrawTargetCaps INHERITED; | 
| }; | 
|  | 
| -typedef GrGLCaps GrGLSLCaps; | 
| + | 
| +class GrGLSLCaps : public GrShaderCaps { | 
| +public: | 
| +    SK_DECLARE_INST_COUNT(GrGLSLCaps) | 
| + | 
| +    /** | 
| +     * Creates a GrGLSLCaps that advertises no support for any extensions, | 
| +     * formats, etc. Call init to initialize from a GrGLContextInfo. | 
| +     */ | 
| +    GrGLSLCaps(); | 
| +    ~GrGLSLCaps() override {} | 
| + | 
| +    GrGLSLCaps(const GrGLSLCaps& caps); | 
| + | 
| +    GrGLSLCaps& operator = (const GrGLSLCaps& caps); | 
| + | 
| +    /** | 
| +     * Resets the caps such that nothing is supported. | 
| +     */ | 
| +    void reset() override; | 
| + | 
| +    /** | 
| +     * Initializes the GrGLSLCaps to the set of features supported in the current | 
| +     * OpenGL context accessible via ctxInfo. | 
| +     */ | 
| +    bool init(const GrGLContextInfo& ctxInfo, const GrGLInterface* glInterface); | 
| + | 
| +    /** | 
| +     * Some helper functions for encapsulating various extensions to read FB Buffer on openglES | 
| +     * | 
| +     * TODO(joshualitt) On desktop opengl 4.2+ we can achieve something similar to this effect | 
| +     */ | 
| +    bool fbFetchSupport() const { return fFBFetchSupport; } | 
| + | 
| +    bool fbFetchNeedsCustomOutput() const { return fFBFetchNeedsCustomOutput; } | 
| + | 
| +    const char* fbFetchColorName() const { return fFBFetchColorName; } | 
| + | 
| +    const char* fbFetchExtensionString() const { return fFBFetchExtensionString; } | 
| + | 
| +    bool dropsTileOnZeroDivide() const { return fDropsTileOnZeroDivide; } | 
| + | 
| +    /** | 
| +    * Returns a string containing the caps info. | 
| +    */ | 
| +    SkString dump() const override; | 
| + | 
| +private: | 
| +    // Must be called after fGeometryShaderSupport is initialized. | 
| +    void initShaderPrecisionTable(const GrGLContextInfo&, const GrGLInterface*); | 
| + | 
| +    bool fDropsTileOnZeroDivide : 1; | 
| +    bool fFBFetchSupport : 1; | 
| +    bool fFBFetchNeedsCustomOutput : 1; | 
| + | 
| +    const char* fFBFetchColorName; | 
| +    const char* fFBFetchExtensionString; | 
| + | 
| +    typedef GrShaderCaps INHERITED; | 
| +}; | 
| + | 
|  | 
| #endif | 
|  |