| Index: src/effects/SkBlurMaskFilter.cpp | 
| diff --git a/src/effects/SkBlurMaskFilter.cpp b/src/effects/SkBlurMaskFilter.cpp | 
| index d55c669e74da8c858a78ca663be50c0989a05828..5a7fc50b24027c45822c34264c71c2478d892f46 100644 | 
| --- a/src/effects/SkBlurMaskFilter.cpp | 
| +++ b/src/effects/SkBlurMaskFilter.cpp | 
| @@ -646,6 +646,7 @@ public: | 
|  | 
| const SkRect& getRect() const { return fRect; } | 
| float getSigma() const { return fSigma; } | 
| +    GrSLPrecision precision() const { return fPrecision; } | 
|  | 
| private: | 
| GrRectBlurEffect(const SkRect& rect, float sigma, GrTexture *blurProfile, | 
| @@ -673,12 +674,9 @@ private: | 
|  | 
| class GrGLRectBlurEffect : public GrGLSLFragmentProcessor { | 
| public: | 
| -    GrGLRectBlurEffect(const GrProcessor&, GrSLPrecision precision) | 
| -    : fPrecision(precision) { | 
| -    } | 
| void emitCode(EmitArgs&) override; | 
|  | 
| -    static void GenKey(GrSLPrecision precision, GrProcessorKeyBuilder* b); | 
| +    static void GenKey(const GrProcessor&, const GrGLSLCaps&, GrProcessorKeyBuilder* b); | 
|  | 
| protected: | 
| void onSetData(const GrGLSLProgramDataManager&, const GrProcessor&) override; | 
| @@ -688,7 +686,6 @@ private: | 
|  | 
| UniformHandle       fProxyRectUniform; | 
| UniformHandle       fProfileSizeUniform; | 
| -    GrSLPrecision       fPrecision; | 
|  | 
| typedef GrGLSLFragmentProcessor INHERITED; | 
| }; | 
| @@ -710,21 +707,26 @@ void OutputRectBlurProfileLookup(GrGLSLFragmentBuilder* fragBuilder, | 
| } | 
|  | 
|  | 
| -void GrGLRectBlurEffect::GenKey(GrSLPrecision precision, GrProcessorKeyBuilder* b) { | 
| -    b->add32(precision); | 
| +void GrGLRectBlurEffect::GenKey(const GrProcessor& proc, const GrGLSLCaps&, | 
| +                                GrProcessorKeyBuilder* b) { | 
| +    const GrRectBlurEffect& rbe = proc.cast<GrRectBlurEffect>(); | 
| + | 
| +    b->add32(rbe.precision()); | 
| } | 
|  | 
|  | 
| void GrGLRectBlurEffect::emitCode(EmitArgs& args) { | 
| +    const GrRectBlurEffect& rbe = args.fFp.cast<GrRectBlurEffect>(); | 
| + | 
| GrGLSLUniformHandler* uniformHandler = args.fUniformHandler; | 
|  | 
| const char *rectName; | 
| const char *profileSizeName; | 
|  | 
| -    const char* precisionString = GrGLSLShaderVar::PrecisionString(args.fGLSLCaps, fPrecision); | 
| +    const char* precisionString = GrGLSLShaderVar::PrecisionString(args.fGLSLCaps, rbe.precision()); | 
| fProxyRectUniform = uniformHandler->addUniform(GrGLSLUniformHandler::kFragment_Visibility, | 
| kVec4f_GrSLType, | 
| -                                                   fPrecision, | 
| +                                                   rbe.precision(), | 
| "proxyRect", | 
| &rectName); | 
| fProfileSizeUniform = uniformHandler->addUniform(GrGLSLUniformHandler::kFragment_Visibility, | 
| @@ -814,11 +816,11 @@ GrRectBlurEffect::GrRectBlurEffect(const SkRect& rect, float sigma, GrTexture *b | 
|  | 
| void GrRectBlurEffect::onGetGLSLProcessorKey(const GrGLSLCaps& caps, | 
| GrProcessorKeyBuilder* b) const { | 
| -    GrGLRectBlurEffect::GenKey(fPrecision, b); | 
| +    GrGLRectBlurEffect::GenKey(*this, caps, b); | 
| } | 
|  | 
| GrGLSLFragmentProcessor* GrRectBlurEffect::onCreateGLSLInstance() const { | 
| -    return new GrGLRectBlurEffect(*this, fPrecision); | 
| +    return new GrGLRectBlurEffect; | 
| } | 
|  | 
| bool GrRectBlurEffect::onIsEqual(const GrFragmentProcessor& sBase) const { | 
|  |