Introduction of set of functions to manage generation of texture fetch shader code.  

A new set of routines have been added to GrGLShaderBuilder to emit texture fetches, taking into consideration the format of the texture to be accessed, and the channel swizzle.  
Review URL: https://codereview.appspot.com/6446072

git-svn-id: http://skia.googlecode.com/svn/trunk@4919 2bbb7eff-a529-9590-31e7-b0007b416f81
diff --git a/src/gpu/effects/GrColorTableEffect.cpp b/src/gpu/effects/GrColorTableEffect.cpp
index 2075c22..f1ce664 100644
--- a/src/gpu/effects/GrColorTableEffect.cpp
+++ b/src/gpu/effects/GrColorTableEffect.cpp
@@ -30,49 +30,72 @@
                          const GrRenderTarget*,
                          int stageNum) SK_OVERRIDE {}
 
-    static inline StageKey GenKey(const GrCustomStage&);
+    static StageKey GenKey(const GrCustomStage&, const GrGLCaps&);
 
 private:
+
+    const GrCustomStage& fCustomStage;
+
     typedef GrGLProgramStage INHERITED;
 };
 
 GrGLColorTableEffect::GrGLColorTableEffect(
     const GrProgramStageFactory& factory, const GrCustomStage& stage)
-    : INHERITED(factory) {
+    : INHERITED(factory)
+    , fCustomStage(stage) {
  }
 
-void GrGLColorTableEffect::emitFS(GrGLShaderBuilder* state,
+void GrGLColorTableEffect::emitFS(GrGLShaderBuilder* builder,
                                   const char* outputColor,
                                   const char* inputColor,
                                   const char* samplerName) {
     static const float kColorScaleFactor = 255.0f / 256.0f;
     static const float kColorOffsetFactor = 1.0f / 512.0f;
-    SkString* code = &state->fFSCode; 
+    SkString* code = &builder->fFSCode;
     code->appendf("\t\tvec4 coord = vec4(%s.rgb / %s.a, %s.a);\n",
                   inputColor, inputColor, inputColor);
     code->appendf("\t\tcoord = coord * %f + vec4(%f, %f, %f, %f);\n",
                   kColorScaleFactor,
                   kColorOffsetFactor, kColorOffsetFactor, kColorOffsetFactor, kColorOffsetFactor);
-    code->appendf("\t\t%s.a = texture2D(%s, vec2(coord.a, 0.125)).a;\n",
-                  outputColor, samplerName);
-    code->appendf("\t\t%s.r = texture2D(%s, vec2(coord.r, 0.375)).a;\n",
-                  outputColor, samplerName);
-    code->appendf("\t\t%s.g = texture2D(%s, vec2(coord.g, 0.625)).a;\n",
-                  outputColor, samplerName);
-    code->appendf("\t\t%s.b = texture2D(%s, vec2(coord.b, 0.875)).a;\n",
-                  outputColor, samplerName);
+
+    const GrTextureAccess& access = *fCustomStage.textureAccess(0);
+    code->appendf("\t\t%s.a = ", outputColor);
+    builder->emitCustomTextureLookup(GrGLShaderBuilder::kDefault_SamplerMode,
+                                     access,
+                                     samplerName,
+                                     "vec2(coord.a, 0.125)");
+
+    code->appendf("\t\t%s.r = ", outputColor);
+    builder->emitCustomTextureLookup(GrGLShaderBuilder::kDefault_SamplerMode,
+                                     access,
+                                     samplerName,
+                                     "vec2(coord.r, 0.375)");
+
+    code->appendf("\t\t%s.g = ", outputColor);
+    builder->emitCustomTextureLookup(GrGLShaderBuilder::kDefault_SamplerMode,
+                                     access,
+                                     samplerName,
+                                     "vec2(coord.g, 0.625)");
+
+    code->appendf("\t\t%s.b = ", outputColor);
+    builder->emitCustomTextureLookup(GrGLShaderBuilder::kDefault_SamplerMode,
+                                     access,
+                                     samplerName,
+                                     "vec2(coord.b, 0.875)");
+
     code->appendf("\t\t%s.rgb *= %s.a;\n", outputColor, outputColor);
 }
 
-GrGLProgramStage::StageKey GrGLColorTableEffect::GenKey(
-    const GrCustomStage& s) {
+GrGLProgramStage::StageKey GrGLColorTableEffect::GenKey(const GrCustomStage& s,
+                                                        const GrGLCaps& caps) {
     return 0;
 }
 
 ///////////////////////////////////////////////////////////////////////////////
 
 GrColorTableEffect::GrColorTableEffect(GrTexture* texture)
-    : INHERITED(texture) {
+    : INHERITED(texture)
+    , fTextureAccess(texture, SkString("a")) {
 }
 
 GrColorTableEffect::~GrColorTableEffect() {
@@ -85,3 +108,10 @@
 bool GrColorTableEffect::isEqual(const GrCustomStage& sBase) const {
     return INHERITED::isEqual(sBase);
 }
+
+const GrTextureAccess* GrColorTableEffect::textureAccess(unsigned int index) const {
+    if (0 == index)
+        return &fTextureAccess;
+
+    return NULL;
+}
diff --git a/src/gpu/effects/GrColorTableEffect.h b/src/gpu/effects/GrColorTableEffect.h
index ee7a630..16d76ad 100644
--- a/src/gpu/effects/GrColorTableEffect.h
+++ b/src/gpu/effects/GrColorTableEffect.h
@@ -29,10 +29,14 @@
     virtual const GrProgramStageFactory& getFactory() const SK_OVERRIDE;
     virtual bool isEqual(const GrCustomStage&) const SK_OVERRIDE;
 
+    virtual const GrTextureAccess* textureAccess(unsigned int index) const SK_OVERRIDE;
+
     typedef GrGLColorTableEffect GLProgramStage;
 
 private:
 
+    GrTextureAccess fTextureAccess;
+
     typedef GrSingleTextureEffect INHERITED;
 };
 #endif
diff --git a/src/gpu/effects/GrConvolutionEffect.cpp b/src/gpu/effects/GrConvolutionEffect.cpp
index 6af891b..5cce800 100644
--- a/src/gpu/effects/GrConvolutionEffect.cpp
+++ b/src/gpu/effects/GrConvolutionEffect.cpp
@@ -33,7 +33,7 @@
                          const GrRenderTarget*,
                          int stageNum) SK_OVERRIDE;
 
-    static inline StageKey GenKey(const GrCustomStage&);
+    static inline StageKey GenKey(const GrCustomStage&, const GrGLCaps&);
 
 private:
     int width() const { return Gr1DKernelEffect::WidthFromRadius(fRadius); }
@@ -125,8 +125,8 @@
     uman.set1fv(fKernelUni, 0, this->width(), conv.kernel());
 }
 
-GrGLProgramStage::StageKey GrGLConvolutionEffect::GenKey(
-                                                    const GrCustomStage& s) {
+GrGLProgramStage::StageKey GrGLConvolutionEffect::GenKey(const GrCustomStage& s,
+                                                         const GrGLCaps& caps) {
     return static_cast<const GrConvolutionEffect&>(s).radius();
 }
 
@@ -185,4 +185,3 @@
             this->direction() == s.direction() &&
             0 == memcmp(fKernel, s.fKernel, this->width() * sizeof(float)));
 }
-
diff --git a/src/gpu/effects/GrMorphologyEffect.cpp b/src/gpu/effects/GrMorphologyEffect.cpp
index f8b268d..be8485e 100644
--- a/src/gpu/effects/GrMorphologyEffect.cpp
+++ b/src/gpu/effects/GrMorphologyEffect.cpp
@@ -26,7 +26,7 @@
                         const char* inputColor,
                         const char* samplerName) SK_OVERRIDE;
 
-    static inline StageKey GenKey(const GrCustomStage& s);
+    static inline StageKey GenKey(const GrCustomStage& s, const GrGLCaps& caps);
 
     virtual void setData(const GrGLUniformManager&,
                          const GrCustomStage&,
@@ -98,8 +98,8 @@
     code->appendf("\t\t%s = value%s;\n", outputColor, builder->fModulate.c_str());
 }
 
-GrGLProgramStage::StageKey GrGLMorphologyEffect::GenKey(
-                                                    const GrCustomStage& s) {
+GrGLProgramStage::StageKey GrGLMorphologyEffect::GenKey(const GrCustomStage& s,
+                                                        const GrGLCaps& caps) {
     const GrMorphologyEffect& m = static_cast<const GrMorphologyEffect&>(s);
     StageKey key = static_cast<StageKey>(m.radius());
     key |= (m.type() << 8);
diff --git a/src/gpu/effects/GrSingleTextureEffect.cpp b/src/gpu/effects/GrSingleTextureEffect.cpp
index 350d9e6..5f66e09 100644
--- a/src/gpu/effects/GrSingleTextureEffect.cpp
+++ b/src/gpu/effects/GrSingleTextureEffect.cpp
@@ -26,7 +26,7 @@
         builder->emitDefaultFetch(outputColor, samplerName);
     }
 
-    static inline StageKey GenKey(const GrCustomStage&) { return 0; }
+    static inline StageKey GenKey(const GrCustomStage&, const GrGLCaps&) { return 0; }
 
 private:
 
@@ -56,5 +56,3 @@
 const GrProgramStageFactory& GrSingleTextureEffect::getFactory() const {
     return GrTProgramStageFactory<GrSingleTextureEffect>::getInstance();
 }
-
-
diff --git a/src/gpu/effects/GrTextureDomainEffect.cpp b/src/gpu/effects/GrTextureDomainEffect.cpp
index 1bf0512..e76d0c9 100644
--- a/src/gpu/effects/GrTextureDomainEffect.cpp
+++ b/src/gpu/effects/GrTextureDomainEffect.cpp
@@ -27,7 +27,7 @@
                          const GrRenderTarget*,
                          int stageNum) SK_OVERRIDE;
 
-    static inline StageKey GenKey(const GrCustomStage&) { return 0; }
+    static inline StageKey GenKey(const GrCustomStage&, const GrGLCaps&) { return 0; }
 
 private:
     GrGLUniformManager::UniformHandle fNameUni;
@@ -107,5 +107,3 @@
     const GrTextureDomainEffect& s = static_cast<const GrTextureDomainEffect&>(sBase);
     return (INHERITED::isEqual(sBase) && this->fTextureDomain == s.fTextureDomain);
 }
-
-