Consolidate texture access functions, provide default GrTextureAccess

Review URL: https://codereview.appspot.com/6506086/


git-svn-id: http://skia.googlecode.com/svn/trunk@5428 2bbb7eff-a529-9590-31e7-b0007b416f81
diff --git a/src/gpu/gl/GrGLProgram.cpp b/src/gpu/gl/GrGLProgram.cpp
index 934c4fc..dfe5277 100644
--- a/src/gpu/gl/GrGLProgram.cpp
+++ b/src/gpu/gl/GrGLProgram.cpp
@@ -964,16 +964,30 @@
 
     int numTextures = stage->numTextures();
     SkSTArray<8, GrGLShaderBuilder::TextureSampler> textureSamplers;
+    // temporary until we force custom stages to provide their own texture access
+    SkSTArray<8, bool, true> deleteTextureAccess;
+
     textureSamplers.push_back_n(numTextures);
+    deleteTextureAccess.push_back_n(numTextures);
+
     for (int i = 0; i < numTextures; ++i) {
         // Right now we don't require a texture access for every texture. This will change soon.
         const GrTextureAccess* access = stage->textureAccess(i);
-        if (NULL != access) {
-            GrAssert(access->getTexture() == stage->texture(i));
-            textureSamplers[i].init(builder, access);
+        GrAssert(NULL != stage->texture(i));
+        if (NULL == access) {
+            SkString swizzle;
+            if (desc.fInConfigFlags & StageDesc::kSmearAlpha_InConfigFlag) {
+                swizzle.printf("aaaa");
+            } else {
+                swizzle.printf("rgba");
+            }
+            access = SkNEW_ARGS(GrTextureAccess, (stage->texture(i), swizzle));
+            deleteTextureAccess[i] = true;
         } else {
-            textureSamplers[i].init(builder, stage->texture(i));
+            GrAssert(access->getTexture() == stage->texture(i));
+            deleteTextureAccess[i] = false;
         }
+        textureSamplers[i].init(builder, access);
         uniforms->fSamplerUniforms.push_back(textureSamplers[i].fSamplerUniform);
     }
 
@@ -991,12 +1005,15 @@
     glStage->emitVS(builder, varyingVSName);
     builder->fVSCode.appendf("\t}\n");
 
-    builder->computeSwizzle(desc.fInConfigFlags);
-
     // Enclose custom code in a block to avoid namespace conflicts
     builder->fFSCode.appendf("\t{ // %s \n", glStage->name());
     glStage->emitFS(builder, fsOutColor, fsInColor, textureSamplers);
     builder->fFSCode.appendf("\t}\n");
 
+    for (int i = 0; i < numTextures; ++i) {
+        if (deleteTextureAccess[i]) {
+            SkDELETE(textureSamplers[i].textureAccess());
+        }
+    }
     return glStage;
 }