When getGLInstance is called on a frag proc, the resulting GrGLFragmentProcessor will be the root of a tree of GrGLFragmentProcessors that mirrors the GrFragmentProcessor's tree. This allows setData() to be called recursively (removing the responsibility from compose shader) and allows gl instances direct access to their children gl instances so they can emit their code.

BUG=skia:4182

Review URL: https://codereview.chromium.org/1287023009
diff --git a/src/gpu/effects/GrBicubicEffect.cpp b/src/gpu/effects/GrBicubicEffect.cpp
index d5cf039..e3b959d 100644
--- a/src/gpu/effects/GrBicubicEffect.cpp
+++ b/src/gpu/effects/GrBicubicEffect.cpp
@@ -25,14 +25,15 @@
 
     virtual void emitCode(EmitArgs&) override;
 
-    void setData(const GrGLProgramDataManager&, const GrProcessor&) override;
-
     static inline void GenKey(const GrProcessor& effect, const GrGLSLCaps&,
                               GrProcessorKeyBuilder* b) {
         const GrTextureDomain& domain = effect.cast<GrBicubicEffect>().domain();
         b->add32(GrTextureDomain::GLDomain::DomainKey(domain));
     }
 
+protected:
+    void onSetData(const GrGLProgramDataManager&, const GrProcessor&) override;
+
 private:
     typedef GrGLProgramDataManager::UniformHandle UniformHandle;
 
@@ -104,7 +105,7 @@
                            GrGLSLExpr4(args.fInputColor)).c_str());
 }
 
-void GrGLBicubicEffect::setData(const GrGLProgramDataManager& pdman,
+void GrGLBicubicEffect::onSetData(const GrGLProgramDataManager& pdman,
                                 const GrProcessor& processor) {
     const GrBicubicEffect& bicubicEffect = processor.cast<GrBicubicEffect>();
     const GrTexture& texture = *processor.texture(0);
@@ -157,7 +158,7 @@
     GrGLBicubicEffect::GenKey(*this, caps, b);
 }
 
-GrGLFragmentProcessor* GrBicubicEffect::createGLInstance() const  {
+GrGLFragmentProcessor* GrBicubicEffect::onCreateGLInstance() const  {
     return SkNEW_ARGS(GrGLBicubicEffect, (*this));
 }
 
diff --git a/src/gpu/effects/GrBicubicEffect.h b/src/gpu/effects/GrBicubicEffect.h
index 810e443..f95b3f9 100644
--- a/src/gpu/effects/GrBicubicEffect.h
+++ b/src/gpu/effects/GrBicubicEffect.h
@@ -27,8 +27,6 @@
 
     const char* name() const override { return "Bicubic"; }
 
-    GrGLFragmentProcessor* createGLInstance() const override;
-
     const GrTextureDomain& domain() const { return fDomain; }
 
     /**
@@ -93,6 +91,8 @@
     GrBicubicEffect(GrProcessorDataManager*, GrTexture*, const SkScalar coefficients[16],
                     const SkMatrix &matrix, const SkRect& domain);
 
+    GrGLFragmentProcessor* onCreateGLInstance() const override;
+
     void onGetGLProcessorKey(const GrGLSLCaps&, GrProcessorKeyBuilder*) const override;
 
     bool onIsEqual(const GrFragmentProcessor&) const override;
diff --git a/src/gpu/effects/GrConfigConversionEffect.cpp b/src/gpu/effects/GrConfigConversionEffect.cpp
index c99351d..4c8813d 100644
--- a/src/gpu/effects/GrConfigConversionEffect.cpp
+++ b/src/gpu/effects/GrConfigConversionEffect.cpp
@@ -151,7 +151,7 @@
     GrGLConfigConversionEffect::GenKey(*this, caps, b);
 }
 
-GrGLFragmentProcessor* GrConfigConversionEffect::createGLInstance() const {
+GrGLFragmentProcessor* GrConfigConversionEffect::onCreateGLInstance() const {
     return SkNEW_ARGS(GrGLConfigConversionEffect, (*this));
 }
 
diff --git a/src/gpu/effects/GrConfigConversionEffect.h b/src/gpu/effects/GrConfigConversionEffect.h
index ba21c16..fc92a04 100644
--- a/src/gpu/effects/GrConfigConversionEffect.h
+++ b/src/gpu/effects/GrConfigConversionEffect.h
@@ -38,8 +38,6 @@
 
     const char* name() const override { return "Config Conversion"; }
 
-    GrGLFragmentProcessor* createGLInstance() const override;
-
     bool swapsRedAndBlue() const { return fSwapRedAndBlue; }
     PMConversion  pmConversion() const { return fPMConversion; }
 
@@ -59,6 +57,8 @@
                              PMConversion pmConversion,
                              const SkMatrix& matrix);
 
+    GrGLFragmentProcessor* onCreateGLInstance() const override;
+
     void onGetGLProcessorKey(const GrGLSLCaps&, GrProcessorKeyBuilder*) const override;
 
     bool onIsEqual(const GrFragmentProcessor&) const override;
diff --git a/src/gpu/effects/GrConstColorProcessor.cpp b/src/gpu/effects/GrConstColorProcessor.cpp
index a909104..88bd82b 100644
--- a/src/gpu/effects/GrConstColorProcessor.cpp
+++ b/src/gpu/effects/GrConstColorProcessor.cpp
@@ -34,7 +34,8 @@
         }
     }
 
-    void setData(const GrGLProgramDataManager& pdm, const GrProcessor& processor) override {
+protected:
+    void onSetData(const GrGLProgramDataManager& pdm, const GrProcessor& processor) override {
         GrColor color = processor.cast<GrConstColorProcessor>().color();
         // We use the "illegal" color value as an uninit sentinel. However, ut isn't inherently
         // illegal to use this processor with unpremul colors. So we correctly handle the case
@@ -89,7 +90,7 @@
     b->add32(fMode);
 }
 
-GrGLFragmentProcessor* GrConstColorProcessor::createGLInstance() const  {
+GrGLFragmentProcessor* GrConstColorProcessor::onCreateGLInstance() const  {
     return SkNEW(GLConstColorProcessor);
 }
 
diff --git a/src/gpu/effects/GrConvexPolyEffect.cpp b/src/gpu/effects/GrConvexPolyEffect.cpp
index 9c73e47..6c47768 100644
--- a/src/gpu/effects/GrConvexPolyEffect.cpp
+++ b/src/gpu/effects/GrConvexPolyEffect.cpp
@@ -26,8 +26,6 @@
 
     void onGetGLProcessorKey(const GrGLSLCaps&, GrProcessorKeyBuilder*) const override;
 
-    GrGLFragmentProcessor* createGLInstance() const override;
-
 private:
     AARectEffect(GrPrimitiveEdgeType edgeType, const SkRect& rect)
         : fRect(rect), fEdgeType(edgeType) {
@@ -35,6 +33,8 @@
         this->setWillReadFragmentPosition();
     }
 
+    GrGLFragmentProcessor* onCreateGLInstance() const override;
+
     bool onIsEqual(const GrFragmentProcessor& other) const override {
         const AARectEffect& aare = other.cast<AARectEffect>();
         return fRect == aare.fRect;
@@ -85,7 +85,8 @@
 
     static inline void GenKey(const GrProcessor&, const GrGLSLCaps&, GrProcessorKeyBuilder*);
 
-    void setData(const GrGLProgramDataManager&, const GrProcessor&) override;
+protected:
+    void onSetData(const GrGLProgramDataManager&, const GrProcessor&) override;
 
 private:
     GrGLProgramDataManager::UniformHandle fRectUniform;
@@ -136,7 +137,7 @@
                            (GrGLSLExpr4(args.fInputColor) * GrGLSLExpr1("alpha")).c_str());
 }
 
-void GLAARectEffect::setData(const GrGLProgramDataManager& pdman, const GrProcessor& processor) {
+void GLAARectEffect::onSetData(const GrGLProgramDataManager& pdman, const GrProcessor& processor) {
     const AARectEffect& aare = processor.cast<AARectEffect>();
     const SkRect& rect = aare.getRect();
     if (rect != fPrevRect) {
@@ -156,7 +157,7 @@
     GLAARectEffect::GenKey(*this, caps, b);
 }
 
-GrGLFragmentProcessor* AARectEffect::createGLInstance() const  {
+GrGLFragmentProcessor* AARectEffect::onCreateGLInstance() const  {
     return SkNEW_ARGS(GLAARectEffect, (*this));
 }
 
@@ -170,7 +171,8 @@
 
     static inline void GenKey(const GrProcessor&, const GrGLSLCaps&, GrProcessorKeyBuilder*);
 
-    void setData(const GrGLProgramDataManager&, const GrProcessor&) override;
+protected:
+    void onSetData(const GrGLProgramDataManager&, const GrProcessor&) override;
 
 private:
     GrGLProgramDataManager::UniformHandle fEdgeUniform;
@@ -219,7 +221,7 @@
                            (GrGLSLExpr4(args.fInputColor) * GrGLSLExpr1("alpha")).c_str());
 }
 
-void GrGLConvexPolyEffect::setData(const GrGLProgramDataManager& pdman, const GrProcessor& effect) {
+void GrGLConvexPolyEffect::onSetData(const GrGLProgramDataManager& pdman, const GrProcessor& effect) {
     const GrConvexPolyEffect& cpe = effect.cast<GrConvexPolyEffect>();
     size_t byteSize = 3 * cpe.getEdgeCount() * sizeof(SkScalar);
     if (0 != memcmp(fPrevEdges, cpe.getEdges(), byteSize)) {
@@ -307,7 +309,7 @@
     GrGLConvexPolyEffect::GenKey(*this, caps, b);
 }
 
-GrGLFragmentProcessor* GrConvexPolyEffect::createGLInstance() const  {
+GrGLFragmentProcessor* GrConvexPolyEffect::onCreateGLInstance() const  {
     return SkNEW_ARGS(GrGLConvexPolyEffect, (*this));
 }
 
diff --git a/src/gpu/effects/GrConvexPolyEffect.h b/src/gpu/effects/GrConvexPolyEffect.h
index d18ed51..ead7fe4 100644
--- a/src/gpu/effects/GrConvexPolyEffect.h
+++ b/src/gpu/effects/GrConvexPolyEffect.h
@@ -69,11 +69,11 @@
 
     const SkScalar* getEdges() const { return fEdges; }
 
-    GrGLFragmentProcessor* createGLInstance() const override;
-
 private:
     GrConvexPolyEffect(GrPrimitiveEdgeType edgeType, int n, const SkScalar edges[]);
 
+    GrGLFragmentProcessor* onCreateGLInstance() const override;
+
     void onGetGLProcessorKey(const GrGLSLCaps&, GrProcessorKeyBuilder*) const override;
 
     bool onIsEqual(const GrFragmentProcessor& other) const override;
diff --git a/src/gpu/effects/GrConvolutionEffect.cpp b/src/gpu/effects/GrConvolutionEffect.cpp
index f99afc8..3ab9efb 100644
--- a/src/gpu/effects/GrConvolutionEffect.cpp
+++ b/src/gpu/effects/GrConvolutionEffect.cpp
@@ -19,10 +19,11 @@
 
     virtual void emitCode(EmitArgs&) override;
 
-    void setData(const GrGLProgramDataManager& pdman, const GrProcessor&) override;
-
     static inline void GenKey(const GrProcessor&, const GrGLSLCaps&, GrProcessorKeyBuilder*);
 
+protected:
+    void onSetData(const GrGLProgramDataManager& pdman, const GrProcessor&) override;
+
 private:
     int width() const { return Gr1DKernelEffect::WidthFromRadius(fRadius); }
     bool useBounds() const { return fUseBounds; }
@@ -99,7 +100,7 @@
     fsBuilder->codeAppend(modulate.c_str());
 }
 
-void GrGLConvolutionEffect::setData(const GrGLProgramDataManager& pdman,
+void GrGLConvolutionEffect::onSetData(const GrGLProgramDataManager& pdman,
                                     const GrProcessor& processor) {
     const GrConvolutionEffect& conv = processor.cast<GrConvolutionEffect>();
     GrTexture& texture = *conv.texture(0);
@@ -199,7 +200,7 @@
     GrGLConvolutionEffect::GenKey(*this, caps, b);
 }
 
-GrGLFragmentProcessor* GrConvolutionEffect::createGLInstance() const  {
+GrGLFragmentProcessor* GrConvolutionEffect::onCreateGLInstance() const  {
     return SkNEW_ARGS(GrGLConvolutionEffect, (*this));
 }
 
diff --git a/src/gpu/effects/GrConvolutionEffect.h b/src/gpu/effects/GrConvolutionEffect.h
index e65c4c4..37faa08 100644
--- a/src/gpu/effects/GrConvolutionEffect.h
+++ b/src/gpu/effects/GrConvolutionEffect.h
@@ -63,8 +63,6 @@
 
     const char* name() const override { return "Convolution"; }
 
-    GrGLFragmentProcessor* createGLInstance() const override;
-
     enum {
         // This was decided based on the min allowed value for the max texture
         // samples per fragment program run in DX9SM2 (32). A sigma param of 4.0
@@ -98,6 +96,8 @@
                         bool useBounds,
                         float bounds[2]);
 
+    GrGLFragmentProcessor* onCreateGLInstance() const override;
+
     void onGetGLProcessorKey(const GrGLSLCaps&, GrProcessorKeyBuilder*) const override;
 
     bool onIsEqual(const GrFragmentProcessor&) const override;
diff --git a/src/gpu/effects/GrCustomXfermode.cpp b/src/gpu/effects/GrCustomXfermode.cpp
index e7023ca..761e177 100644
--- a/src/gpu/effects/GrCustomXfermode.cpp
+++ b/src/gpu/effects/GrCustomXfermode.cpp
@@ -459,8 +459,6 @@
         emit_custom_xfermode_code(mode, fsBuilder, args.fOutputColor, args.fInputColor, dstColor);
     }
 
-    void setData(const GrGLProgramDataManager&, const GrProcessor&) override {}
-
     static void GenKey(const GrFragmentProcessor& proc, const GrGLSLCaps&, GrProcessorKeyBuilder* b) {
         // The background may come from the dst or from a texture.
         uint32_t key = proc.numTextures();
@@ -469,6 +467,9 @@
         b->add32(key);
     }
 
+protected:
+    void onSetData(const GrGLProgramDataManager&, const GrProcessor&) override {}
+
 private:
     typedef GrGLFragmentProcessor INHERITED;
 };
@@ -491,7 +492,7 @@
     GLCustomXferFP::GenKey(*this, caps, b);
 }
 
-GrGLFragmentProcessor* GrCustomXferFP::createGLInstance() const {
+GrGLFragmentProcessor* GrCustomXferFP::onCreateGLInstance() const {
     return SkNEW_ARGS(GLCustomXferFP, (*this));
 }
 
@@ -625,7 +626,7 @@
 
     void onSetData(const GrGLProgramDataManager&, const GrXferProcessor&) override {}
 
-    typedef GrGLFragmentProcessor INHERITED;
+    typedef GrGLXferProcessor INHERITED;
 };
 
 ///////////////////////////////////////////////////////////////////////////////
diff --git a/src/gpu/effects/GrCustomXfermodePriv.h b/src/gpu/effects/GrCustomXfermodePriv.h
index 2a4006b..05e07b6 100644
--- a/src/gpu/effects/GrCustomXfermodePriv.h
+++ b/src/gpu/effects/GrCustomXfermodePriv.h
@@ -29,14 +29,14 @@
 public:
     GrCustomXferFP(GrProcessorDataManager*, SkXfermode::Mode mode, GrTexture* background);
 
-    GrGLFragmentProcessor* createGLInstance() const override;
-
     const char* name() const override { return "Custom Xfermode"; }
 
     SkXfermode::Mode mode() const { return fMode; }
     const GrTextureAccess&  backgroundAccess() const { return fBackgroundAccess; }
 
 private:
+    GrGLFragmentProcessor* onCreateGLInstance() const override;
+
     void onGetGLProcessorKey(const GrGLSLCaps& caps, GrProcessorKeyBuilder* b) const override;
 
     bool onIsEqual(const GrFragmentProcessor& other) const override; 
diff --git a/src/gpu/effects/GrDitherEffect.cpp b/src/gpu/effects/GrDitherEffect.cpp
index 6d39450..2b10ac0 100644
--- a/src/gpu/effects/GrDitherEffect.cpp
+++ b/src/gpu/effects/GrDitherEffect.cpp
@@ -25,14 +25,14 @@
 
     const char* name() const override { return "Dither"; }
 
-    GrGLFragmentProcessor* createGLInstance() const override;
-
 private:
     DitherEffect() {
         this->initClassID<DitherEffect>();
         this->setWillReadFragmentPosition();
     }
 
+    GrGLFragmentProcessor* onCreateGLInstance() const override;
+
     void onGetGLProcessorKey(const GrGLSLCaps&, GrProcessorKeyBuilder*) const override;
 
     // All dither effects are equal
@@ -97,7 +97,7 @@
     GLDitherEffect::GenKey(*this, caps, b);
 }
 
-GrGLFragmentProcessor* DitherEffect::createGLInstance() const  {
+GrGLFragmentProcessor* DitherEffect::onCreateGLInstance() const  {
     return SkNEW_ARGS(GLDitherEffect, (*this));
 }
 
diff --git a/src/gpu/effects/GrMatrixConvolutionEffect.cpp b/src/gpu/effects/GrMatrixConvolutionEffect.cpp
index 625a3e9..3da4c54 100644
--- a/src/gpu/effects/GrMatrixConvolutionEffect.cpp
+++ b/src/gpu/effects/GrMatrixConvolutionEffect.cpp
@@ -16,7 +16,8 @@
 
     static inline void GenKey(const GrProcessor&, const GrGLSLCaps&, GrProcessorKeyBuilder*);
 
-    void setData(const GrGLProgramDataManager&, const GrProcessor&) override;
+protected:
+    void onSetData(const GrGLProgramDataManager&, const GrProcessor&) override;
 
 private:
     typedef GrGLProgramDataManager::UniformHandle UniformHandle;
@@ -110,7 +111,7 @@
     b->add32(GrTextureDomain::GLDomain::DomainKey(m.domain()));
 }
 
-void GrGLMatrixConvolutionEffect::setData(const GrGLProgramDataManager& pdman,
+void GrGLMatrixConvolutionEffect::onSetData(const GrGLProgramDataManager& pdman,
                                           const GrProcessor& processor) {
     const GrMatrixConvolutionEffect& conv = processor.cast<GrMatrixConvolutionEffect>();
     GrTexture& texture = *conv.texture(0);
@@ -160,7 +161,7 @@
     GrGLMatrixConvolutionEffect::GenKey(*this, caps, b);
 }
 
-GrGLFragmentProcessor* GrMatrixConvolutionEffect::createGLInstance() const  {
+GrGLFragmentProcessor* GrMatrixConvolutionEffect::onCreateGLInstance() const  {
     return SkNEW_ARGS(GrGLMatrixConvolutionEffect, (*this));
 }
 
diff --git a/src/gpu/effects/GrMatrixConvolutionEffect.h b/src/gpu/effects/GrMatrixConvolutionEffect.h
index ff0a51e..f3d6b24 100644
--- a/src/gpu/effects/GrMatrixConvolutionEffect.h
+++ b/src/gpu/effects/GrMatrixConvolutionEffect.h
@@ -65,8 +65,6 @@
 
     const char* name() const override { return "MatrixConvolution"; }
 
-    GrGLFragmentProcessor* createGLInstance() const override;
-
 private:
     GrMatrixConvolutionEffect(GrProcessorDataManager*,
                               GrTexture*,
@@ -79,6 +77,8 @@
                               GrTextureDomain::Mode tileMode,
                               bool convolveAlpha);
 
+    GrGLFragmentProcessor* onCreateGLInstance() const override;
+
     void onGetGLProcessorKey(const GrGLSLCaps&, GrProcessorKeyBuilder*) const override;
 
     bool onIsEqual(const GrFragmentProcessor&) const override;
diff --git a/src/gpu/effects/GrOvalEffect.cpp b/src/gpu/effects/GrOvalEffect.cpp
index 1fb54ae..3fb7b90 100644
--- a/src/gpu/effects/GrOvalEffect.cpp
+++ b/src/gpu/effects/GrOvalEffect.cpp
@@ -23,8 +23,6 @@
 
     const char* name() const override { return "Circle"; }
 
-    GrGLFragmentProcessor* createGLInstance() const override;
-
     const SkPoint& getCenter() const { return fCenter; }
     SkScalar getRadius() const { return fRadius; }
 
@@ -33,6 +31,8 @@
 private:
     CircleEffect(GrPrimitiveEdgeType, const SkPoint& center, SkScalar radius);
 
+    GrGLFragmentProcessor* onCreateGLInstance() const override;
+
     void onGetGLProcessorKey(const GrGLSLCaps&, GrProcessorKeyBuilder*) const override;
 
     bool onIsEqual(const GrFragmentProcessor&) const override;
@@ -97,7 +97,8 @@
 
     static inline void GenKey(const GrProcessor&, const GrGLSLCaps&, GrProcessorKeyBuilder*);
 
-    void setData(const GrGLProgramDataManager&, const GrProcessor&) override;
+protected:
+    void onSetData(const GrGLProgramDataManager&, const GrProcessor&) override;
 
 private:
     GrGLProgramDataManager::UniformHandle fCircleUniform;
@@ -152,7 +153,7 @@
     b->add32(ce.getEdgeType());
 }
 
-void GLCircleEffect::setData(const GrGLProgramDataManager& pdman, const GrProcessor& processor) {
+void GLCircleEffect::onSetData(const GrGLProgramDataManager& pdman, const GrProcessor& processor) {
     const CircleEffect& ce = processor.cast<CircleEffect>();
     if (ce.getRadius() != fPrevRadius || ce.getCenter() != fPrevCenter) {
         SkScalar radius = ce.getRadius();
@@ -175,7 +176,7 @@
     GLCircleEffect::GenKey(*this, caps, b);
 }
 
-GrGLFragmentProcessor* CircleEffect::createGLInstance() const  {
+GrGLFragmentProcessor* CircleEffect::onCreateGLInstance() const  {
     return SkNEW_ARGS(GLCircleEffect, (*this));
 }
 
@@ -190,8 +191,6 @@
 
     const char* name() const override { return "Ellipse"; }
 
-    GrGLFragmentProcessor* createGLInstance() const override;
-
     const SkPoint& getCenter() const { return fCenter; }
     SkVector getRadii() const { return fRadii; }
 
@@ -200,6 +199,8 @@
 private:
     EllipseEffect(GrPrimitiveEdgeType, const SkPoint& center, SkScalar rx, SkScalar ry);
 
+    GrGLFragmentProcessor* onCreateGLInstance() const override;
+
     void onGetGLProcessorKey(const GrGLSLCaps&, GrProcessorKeyBuilder*) const override;
 
     bool onIsEqual(const GrFragmentProcessor&) const override;
@@ -267,7 +268,8 @@
 
     static inline void GenKey(const GrProcessor&, const GrGLSLCaps&, GrProcessorKeyBuilder*);
 
-    void setData(const GrGLProgramDataManager&, const GrProcessor&) override;
+protected:
+    void onSetData(const GrGLProgramDataManager&, const GrProcessor&) override;
 
 private:
     GrGLProgramDataManager::UniformHandle fEllipseUniform;
@@ -332,7 +334,7 @@
     b->add32(ee.getEdgeType());
 }
 
-void GLEllipseEffect::setData(const GrGLProgramDataManager& pdman, const GrProcessor& effect) {
+void GLEllipseEffect::onSetData(const GrGLProgramDataManager& pdman, const GrProcessor& effect) {
     const EllipseEffect& ee = effect.cast<EllipseEffect>();
     if (ee.getRadii() != fPrevRadii || ee.getCenter() != fPrevCenter) {
         SkScalar invRXSqd = 1.f / (ee.getRadii().fX * ee.getRadii().fX);
@@ -350,7 +352,7 @@
     GLEllipseEffect::GenKey(*this, caps, b);
 }
 
-GrGLFragmentProcessor* EllipseEffect::createGLInstance() const  {
+GrGLFragmentProcessor* EllipseEffect::onCreateGLInstance() const  {
     return SkNEW_ARGS(GLEllipseEffect, (*this));
 }
 
diff --git a/src/gpu/effects/GrRRectEffect.cpp b/src/gpu/effects/GrRRectEffect.cpp
index 271a997..519d72c 100644
--- a/src/gpu/effects/GrRRectEffect.cpp
+++ b/src/gpu/effects/GrRRectEffect.cpp
@@ -49,8 +49,6 @@
 
     const char* name() const override { return "CircularRRect"; }
 
-    GrGLFragmentProcessor* createGLInstance() const override;
-
     const SkRRect& getRRect() const { return fRRect; }
 
     uint32_t getCircularCornerFlags() const { return fCircularCornerFlags; }
@@ -60,6 +58,8 @@
 private:
     CircularRRectEffect(GrPrimitiveEdgeType, uint32_t circularCornerFlags, const SkRRect&);
 
+    GrGLFragmentProcessor* onCreateGLInstance() const override;
+
     void onGetGLProcessorKey(const GrGLSLCaps&, GrProcessorKeyBuilder*) const override;
 
     bool onIsEqual(const GrFragmentProcessor& other) const override;
@@ -132,7 +132,8 @@
 
     static inline void GenKey(const GrProcessor&, const GrGLSLCaps&, GrProcessorKeyBuilder*);
 
-    void setData(const GrGLProgramDataManager&, const GrProcessor&) override;
+protected:
+    void onSetData(const GrGLProgramDataManager&, const GrProcessor&) override;
 
 private:
     GrGLProgramDataManager::UniformHandle fInnerRectUniform;
@@ -280,7 +281,7 @@
     b->add32((crre.getCircularCornerFlags() << 3) | crre.getEdgeType());
 }
 
-void GLCircularRRectEffect::setData(const GrGLProgramDataManager& pdman,
+void GLCircularRRectEffect::onSetData(const GrGLProgramDataManager& pdman,
                                     const GrProcessor& processor) {
     const CircularRRectEffect& crre = processor.cast<CircularRRectEffect>();
     const SkRRect& rrect = crre.getRRect();
@@ -366,7 +367,7 @@
     GLCircularRRectEffect::GenKey(*this, caps, b);
 }
 
-GrGLFragmentProcessor* CircularRRectEffect::createGLInstance() const  {
+GrGLFragmentProcessor* CircularRRectEffect::onCreateGLInstance() const  {
     return SkNEW_ARGS(GLCircularRRectEffect, (*this));
 }
 
@@ -380,8 +381,6 @@
 
     const char* name() const override { return "EllipticalRRect"; }
 
-    GrGLFragmentProcessor* createGLInstance() const override;
-
     const SkRRect& getRRect() const { return fRRect; }
 
     GrPrimitiveEdgeType getEdgeType() const { return fEdgeType; }
@@ -389,6 +388,8 @@
 private:
     EllipticalRRectEffect(GrPrimitiveEdgeType, const SkRRect&);
 
+    GrGLFragmentProcessor* onCreateGLInstance() const override;
+
     void onGetGLProcessorKey(const GrGLSLCaps&, GrProcessorKeyBuilder*) const override;
 
     bool onIsEqual(const GrFragmentProcessor& other) const override;
@@ -477,7 +478,8 @@
 
     static inline void GenKey(const GrProcessor&, const GrGLSLCaps&, GrProcessorKeyBuilder*);
 
-    void setData(const GrGLProgramDataManager&, const GrProcessor&) override;
+protected:
+    void onSetData(const GrGLProgramDataManager&, const GrProcessor&) override;
 
 private:
     GrGLProgramDataManager::UniformHandle fInnerRectUniform;
@@ -570,7 +572,7 @@
     b->add32(erre.getRRect().getType() | erre.getEdgeType() << 3);
 }
 
-void GLEllipticalRRectEffect::setData(const GrGLProgramDataManager& pdman,
+void GLEllipticalRRectEffect::onSetData(const GrGLProgramDataManager& pdman,
                                       const GrProcessor& effect) {
     const EllipticalRRectEffect& erre = effect.cast<EllipticalRRectEffect>();
     const SkRRect& rrect = erre.getRRect();
@@ -614,7 +616,7 @@
     GLEllipticalRRectEffect::GenKey(*this, caps, b);
 }
 
-GrGLFragmentProcessor* EllipticalRRectEffect::createGLInstance() const  {
+GrGLFragmentProcessor* EllipticalRRectEffect::onCreateGLInstance() const  {
     return SkNEW_ARGS(GLEllipticalRRectEffect, (*this));
 }
 
diff --git a/src/gpu/effects/GrSimpleTextureEffect.cpp b/src/gpu/effects/GrSimpleTextureEffect.cpp
index e3389bb..0bd1fcd 100644
--- a/src/gpu/effects/GrSimpleTextureEffect.cpp
+++ b/src/gpu/effects/GrSimpleTextureEffect.cpp
@@ -42,7 +42,7 @@
     GrGLSimpleTextureEffect::GenKey(*this, caps, b);
 }
 
-GrGLFragmentProcessor* GrSimpleTextureEffect::createGLInstance() const  {
+GrGLFragmentProcessor* GrSimpleTextureEffect::onCreateGLInstance() const  {
     return SkNEW_ARGS(GrGLSimpleTextureEffect, (*this));
 }
 
diff --git a/src/gpu/effects/GrSimpleTextureEffect.h b/src/gpu/effects/GrSimpleTextureEffect.h
index c86b136..ab10ecf 100644
--- a/src/gpu/effects/GrSimpleTextureEffect.h
+++ b/src/gpu/effects/GrSimpleTextureEffect.h
@@ -53,8 +53,6 @@
 
     const char* name() const override { return "SimpleTexture"; }
 
-    GrGLFragmentProcessor* createGLInstance() const override;
-
 private:
     GrSimpleTextureEffect(GrProcessorDataManager* procDataManager,
                           GrTexture* texture,
@@ -74,6 +72,8 @@
         this->initClassID<GrSimpleTextureEffect>();
     }
 
+    GrGLFragmentProcessor* onCreateGLInstance() const override;
+
     void onGetGLProcessorKey(const GrGLSLCaps&, GrProcessorKeyBuilder*) const override;
 
     bool onIsEqual(const GrFragmentProcessor& other) const override { return true; }
diff --git a/src/gpu/effects/GrTextureDomain.cpp b/src/gpu/effects/GrTextureDomain.cpp
index 7cc454e..3810c34 100644
--- a/src/gpu/effects/GrTextureDomain.cpp
+++ b/src/gpu/effects/GrTextureDomain.cpp
@@ -176,10 +176,11 @@
 
     virtual void emitCode(EmitArgs&) override;
 
-    void setData(const GrGLProgramDataManager&, const GrProcessor&) override;
-
     static inline void GenKey(const GrProcessor&, const GrGLSLCaps&, GrProcessorKeyBuilder*);
 
+protected:
+    void onSetData(const GrGLProgramDataManager&, const GrProcessor&) override;
+
 private:
     GrTextureDomain::GLDomain         fGLDomain;
     typedef GrGLFragmentProcessor INHERITED;
@@ -198,7 +199,7 @@
                             args.fInputColor);
 }
 
-void GrGLTextureDomainEffect::setData(const GrGLProgramDataManager& pdman,
+void GrGLTextureDomainEffect::onSetData(const GrGLProgramDataManager& pdman,
                                       const GrProcessor& processor) {
     const GrTextureDomainEffect& textureDomainEffect = processor.cast<GrTextureDomainEffect>();
     const GrTextureDomain& domain = textureDomainEffect.textureDomain();
@@ -260,7 +261,7 @@
     GrGLTextureDomainEffect::GenKey(*this, caps, b);
 }
 
-GrGLFragmentProcessor* GrTextureDomainEffect::createGLInstance() const  {
+GrGLFragmentProcessor* GrTextureDomainEffect::onCreateGLInstance() const  {
     return SkNEW_ARGS(GrGLTextureDomainEffect, (*this));
 }
 
diff --git a/src/gpu/effects/GrTextureDomain.h b/src/gpu/effects/GrTextureDomain.h
index 7cf75d6..a2e6652 100644
--- a/src/gpu/effects/GrTextureDomain.h
+++ b/src/gpu/effects/GrTextureDomain.h
@@ -169,8 +169,6 @@
 
     const char* name() const override { return "TextureDomain"; }
 
-    GrGLFragmentProcessor* createGLInstance() const override;
-
     const GrTextureDomain& textureDomain() const { return fTextureDomain; }
 
 protected:
@@ -185,6 +183,8 @@
                           GrTextureParams::FilterMode,
                           GrCoordSet);
 
+    GrGLFragmentProcessor* onCreateGLInstance() const override;
+
     void onGetGLProcessorKey(const GrGLSLCaps&, GrProcessorKeyBuilder*) const override;
 
     bool onIsEqual(const GrFragmentProcessor&) const override;
diff --git a/src/gpu/effects/GrYUVtoRGBEffect.cpp b/src/gpu/effects/GrYUVtoRGBEffect.cpp
index 7d77c1f..913c37e 100644
--- a/src/gpu/effects/GrYUVtoRGBEffect.cpp
+++ b/src/gpu/effects/GrYUVtoRGBEffect.cpp
@@ -80,7 +80,8 @@
             fsBuilder->codeAppendf(".r,\n\t\t1.0) * %s;\n", yuvMatrix);
         }
 
-        virtual void setData(const GrGLProgramDataManager& pdman,
+    protected:
+        virtual void onSetData(const GrGLProgramDataManager& pdman,
                              const GrProcessor& processor) override {
             const YUVtoRGBEffect& yuvEffect = processor.cast<YUVtoRGBEffect>();
             switch (yuvEffect.getColorSpace()) {
@@ -102,10 +103,6 @@
         typedef GrGLFragmentProcessor INHERITED;
     };
 
-    GrGLFragmentProcessor* createGLInstance() const override {
-        return SkNEW_ARGS(GLProcessor, (*this));
-    }
-
 private:
     YUVtoRGBEffect(GrProcessorDataManager*, GrTexture* yTexture, GrTexture* uTexture,
                    GrTexture* vTexture, const SkMatrix yuvMatrix[3],
@@ -126,6 +123,10 @@
         this->addTextureAccess(&fVAccess);
     }
 
+    GrGLFragmentProcessor* onCreateGLInstance() const override {
+        return SkNEW_ARGS(GLProcessor, (*this));
+    }
+
     virtual void onGetGLProcessorKey(const GrGLSLCaps& caps,
                                      GrProcessorKeyBuilder* b) const override {
         GLProcessor::GenKey(*this, caps, b);