| Index: src/gpu/gl/builders/GrGLProgramBuilder.h
 | 
| diff --git a/src/gpu/gl/builders/GrGLProgramBuilder.h b/src/gpu/gl/builders/GrGLProgramBuilder.h
 | 
| index 9915ad3f05dbe0da8a0853aa0cafd9f8db01e64b..9f8defb6dd5f11c3a57524e641bbe57de4d71132 100644
 | 
| --- a/src/gpu/gl/builders/GrGLProgramBuilder.h
 | 
| +++ b/src/gpu/gl/builders/GrGLProgramBuilder.h
 | 
| @@ -149,12 +149,28 @@ protected:
 | 
|      const GrGLProgramDesc& desc() const { return fDesc; }
 | 
|  
 | 
|      // Helper for emitEffects().
 | 
| -    void createAndEmitEffects(GrGLProgramEffectsBuilder*,
 | 
| -                              const GrEffectStage* effectStages[],
 | 
| +    void createAndEmitEffects(const GrEffectStage* effectStages[],
 | 
|                                int effectCnt,
 | 
|                                const GrGLProgramDesc::EffectKeyProvider&,
 | 
|                                GrGLSLExpr4* inOutFSColor);
 | 
|  
 | 
| +    /*
 | 
| +     * A helper function called to emit the geometry processor as well as individual coverage
 | 
| +     * and color stages.  this will call into subclasses emit effect
 | 
| +     */
 | 
| +    void emitEffect(const GrEffectStage& effectStage,
 | 
| +                    int effectIndex,
 | 
| +                    const GrGLProgramDesc::EffectKeyProvider& keyProvider,
 | 
| +                    GrGLSLExpr4* inColor,
 | 
| +                    GrGLSLExpr4* outColor);
 | 
| +
 | 
| +    /**
 | 
| +     * Helper for emitEffect() in subclasses. Emits uniforms for an effect's texture accesses and
 | 
| +     * appends the necessary data to the TextureSamplerArray* object so effects can add texture
 | 
| +     * lookups to their code. This method is only meant to be called during the construction phase.
 | 
| +     */
 | 
| +    void emitSamplers(const GrEffect& effect, GrGLEffect::TextureSamplerArray* outSamplers);
 | 
| +
 | 
|      // Generates a name for a variable. The generated string will be name prefixed by the prefix
 | 
|      // char (unless the prefix is '\0'). It also mangles the name to be stage-specific if we're
 | 
|      // generating stage code.
 | 
| @@ -168,16 +184,6 @@ protected:
 | 
|      void appendDecls(const VarArray&, SkString*) const;
 | 
|      void appendUniformDecls(ShaderVisibility, SkString*) const;
 | 
|  
 | 
| -    SkAutoTUnref<GrGLProgramEffects> fGeometryProcessor;
 | 
| -    SkAutoTUnref<GrGLProgramEffects> fColorEffects;
 | 
| -    SkAutoTUnref<GrGLProgramEffects> fCoverageEffects;
 | 
| -    BuiltinUniformHandles            fUniformHandles;
 | 
| -    bool                             fFragOnly;
 | 
| -    int                              fTexCoordSetCnt;
 | 
| -    GrGLuint                         fProgramID;
 | 
| -    GrGLFragmentShaderBuilder        fFS;
 | 
| -    SeparableVaryingInfoArray        fSeparableVaryingInfos;
 | 
| -
 | 
|      class CodeStage : SkNoncopyable {
 | 
|      public:
 | 
|          CodeStage() : fNextIndex(0), fCurrentIndex(-1), fEffectStage(NULL) {}
 | 
| @@ -227,43 +233,39 @@ protected:
 | 
|          int                     fNextIndex;
 | 
|          int                     fCurrentIndex;
 | 
|          const GrEffectStage*    fEffectStage;
 | 
| -    } fCodeStage;
 | 
| -
 | 
| -private:
 | 
| +    };
 | 
|  
 | 
| -    /**
 | 
| -     * The base class will emit the fragment code that precedes the per-effect code and then call
 | 
| -     * this function. The subclass can use it to insert additional fragment code that should
 | 
| -     * execute before the effects' code and/or emit other shaders (e.g. geometry, vertex).
 | 
| -     *
 | 
| -     * The subclass can modify the initial color or coverage 
 | 
| -     */
 | 
| -    virtual void emitCodeBeforeEffects(GrGLSLExpr4* color,
 | 
| -                                       GrGLSLExpr4* coverage) = 0;
 | 
| +    CodeStage                        fCodeStage;
 | 
| +    SkAutoTUnref<GrGLProgramEffects> fGeometryProcessor;
 | 
| +    SkAutoTUnref<GrGLProgramEffects> fColorEffects;
 | 
| +    SkAutoTUnref<GrGLProgramEffects> fCoverageEffects;
 | 
| +    BuiltinUniformHandles            fUniformHandles;
 | 
| +    bool                             fFragOnly;
 | 
| +    int                              fTexCoordSetCnt;
 | 
| +    GrGLuint                         fProgramID;
 | 
| +    GrGLFragmentShaderBuilder        fFS;
 | 
| +    SeparableVaryingInfoArray        fSeparableVaryingInfos;
 | 
|  
 | 
| +private:
 | 
| +    virtual void createAndEmitEffects(const GrEffectStage* geometryProcessor,
 | 
| +                                      const GrEffectStage* colorStages[],
 | 
| +                                      const GrEffectStage* coverageStages[],
 | 
| +                                      GrGLSLExpr4* inputColor,
 | 
| +                                      GrGLSLExpr4* inputCoverage) = 0;
 | 
|      /*
 | 
| -     * Full shader builder needs to emit code after the color stages and before the coverage stages
 | 
| +     * Subclasses override emitEffect below to emit data and code for a specific single effect
 | 
|       */
 | 
| -    virtual void emitGeometryProcessor(const GrEffectStage* geometryProcessor,
 | 
| -                                       GrGLSLExpr4* coverage) = 0;
 | 
| +    virtual void emitEffect(const GrEffectStage&,
 | 
| +                            const GrEffectKey&,
 | 
| +                            const char* outColor,
 | 
| +                            const char* inColor,
 | 
| +                            int stageIndex) = 0;
 | 
|  
 | 
| -    /**
 | 
| -    * Adds code for effects and returns a GrGLProgramEffects* object. The caller is responsible for
 | 
| -    * deleting it when finished. effectStages contains the effects to add. The effect key provider 
 | 
| -    * is used to communicate the key each effect created in its GenKey function. inOutFSColor
 | 
| -    * specifies the input color to the first stage and is updated to be the output color of the
 | 
| -    * last stage. The handles to texture samplers for effectStage[i] are added to
 | 
| -    * effectSamplerHandles[i].
 | 
| -    */
 | 
| -    virtual GrGLProgramEffects* createAndEmitEffects(const GrEffectStage* effectStages[],
 | 
| -                                                     int effectCnt,
 | 
| -                                                     const GrGLProgramDesc::EffectKeyProvider&,
 | 
| -                                                     GrGLSLExpr4* inOutFSColor) = 0;
 | 
| -
 | 
| -    /**
 | 
| -     * Similar to emitCodeBeforeEffects() but called after per-effect code is emitted.
 | 
| +    /*
 | 
| +     * Because we have fragment only builders, and those builders need to implement a subclass
 | 
| +     * of program effects, we have to have base classes overload the program effects here
 | 
|       */
 | 
| -    virtual void emitCodeAfterEffects() = 0;
 | 
| +    virtual GrGLProgramEffects* getProgramEffects() = 0;
 | 
|  
 | 
|      /**
 | 
|       * Compiles all the shaders, links them into a program, and writes the program id to the output
 | 
| 
 |