First stage of reworking custom shader infrastructure to allow
radial mappings.

http://codereview.appspot.com/6239043/



git-svn-id: http://skia.googlecode.com/svn/trunk@4040 2bbb7eff-a529-9590-31e7-b0007b416f81
diff --git a/src/gpu/gl/GrGLProgram.cpp b/src/gpu/gl/GrGLProgram.cpp
index 755a2f8..8fc3ac2 100644
--- a/src/gpu/gl/GrGLProgram.cpp
+++ b/src/gpu/gl/GrGLProgram.cpp
@@ -1588,11 +1588,9 @@
     }
 
     if (NULL != customStage) {
-        GrStringBuilder vertexShader;
-        customStage->emitVS(&vertexShader, varyingVSName);
         segments->fVSCode.appendf("\t{ // stage %d %s\n",
                                   stageNum, customStage->name());
-        segments->fVSCode.append(vertexShader);
+        customStage->emitVS(segments, varyingVSName);
         segments->fVSCode.appendf("\t}\n");
     }
 
@@ -1631,30 +1629,32 @@
     }
 
     segments->fComplexCoord = false;
-    switch (desc.fCoordMapping) {
-    case StageDesc::kIdentity_CoordMapping:
-        // Do nothing
-        break;
-    case StageDesc::kSweepGradient_CoordMapping:
-        segments->fSampleCoords.printf("vec2(atan(- %s.y, - %s.x) * 0.1591549430918 + 0.5, 0.5)", segments->fSampleCoords.c_str(), segments->fSampleCoords.c_str());
-        segments->fComplexCoord = true;
-        break;
-    case StageDesc::kRadialGradient_CoordMapping:
-        segments->fSampleCoords.printf("vec2(length(%s.xy), 0.5)", segments->fSampleCoords.c_str());
-        segments->fComplexCoord = true;
-        break;
-    case StageDesc::kRadial2Gradient_CoordMapping:
-        genRadial2GradientCoordMapping(
-                           stageNum, segments,
-                           radial2VaryingFSName, radial2Params);
-        break;
-    case StageDesc::kRadial2GradientDegenerate_CoordMapping:
-        genRadial2GradientDegenerateCoordMapping(
-                           stageNum, segments,
-                           radial2VaryingFSName, radial2Params);
-        break;
-
-    };
+    // NOTE: GrGLProgramStages will soon responsible for mapping
+    //if (NULL == customStage) {
+        switch (desc.fCoordMapping) {
+        case StageDesc::kIdentity_CoordMapping:
+            // Do nothing
+            break;
+        case StageDesc::kSweepGradient_CoordMapping:
+            segments->fSampleCoords.printf("vec2(atan(- %s.y, - %s.x) * 0.1591549430918 + 0.5, 0.5)", segments->fSampleCoords.c_str(), segments->fSampleCoords.c_str());
+            segments->fComplexCoord = true;
+            break;
+        case StageDesc::kRadialGradient_CoordMapping:
+            segments->fSampleCoords.printf("vec2(length(%s.xy), 0.5)", segments->fSampleCoords.c_str());
+            segments->fComplexCoord = true;
+            break;
+        case StageDesc::kRadial2Gradient_CoordMapping:
+            genRadial2GradientCoordMapping(
+                               stageNum, segments,
+                               radial2VaryingFSName, radial2Params);
+            break;
+        case StageDesc::kRadial2GradientDegenerate_CoordMapping:
+            genRadial2GradientDegenerateCoordMapping(
+                               stageNum, segments,
+                               radial2VaryingFSName, radial2Params);
+            break;
+        }
+    //}
 
     static const uint32_t kMulByAlphaMask =
         (StageDesc::kMulRGBByAlpha_RoundUp_InConfigFlag |
@@ -1697,52 +1697,55 @@
         locations->fTexDomUni = kUseUniform;
     }
 
-    switch (desc.fFetchMode) {
-    case StageDesc::k2x2_FetchMode:
-        GrAssert(!(desc.fInConfigFlags & kMulByAlphaMask));
-        gen2x2FS(stageNum, segments, locations,
-            samplerName, texelSizeName, swizzle, fsOutColor,
-            texFunc, modulate);
-        break;
-    case StageDesc::kConvolution_FetchMode:
-        GrAssert(!(desc.fInConfigFlags & kMulByAlphaMask));
-        break;
-    case StageDesc::kDilate_FetchMode:
-    case StageDesc::kErode_FetchMode:
-        GrAssert(!(desc.fInConfigFlags & kMulByAlphaMask));
-        genMorphologyFS(stageNum, desc, segments,
-            samplerName, swizzle, imageIncrementName, fsOutColor,
-            texFunc, modulate);
-        break;
-    default:
-        if (desc.fInConfigFlags & kMulByAlphaMask) {
-            // only one of the mul by alpha flags should be set
-            GrAssert(GrIsPow2(kMulByAlphaMask & desc.fInConfigFlags));
-            GrAssert(!(desc.fInConfigFlags & 
-                       StageDesc::kSmearAlpha_InConfigFlag));
-            GrAssert(!(desc.fInConfigFlags & 
-                       StageDesc::kSmearRed_InConfigFlag));
-            segments->fFSCode.appendf("\t%s = %s(%s, %s)%s;\n",
-                                      fsOutColor, texFunc.c_str(), 
-                                      samplerName,
-                                      segments->fSampleCoords.c_str(),
-                                      swizzle);
-            if (desc.fInConfigFlags &
-                StageDesc::kMulRGBByAlpha_RoundUp_InConfigFlag) {
-                segments->fFSCode.appendf("\t%s = vec4(ceil(%s.rgb*%s.a*255.0)/255.0,%s.a)%s;\n",
-                                          fsOutColor, fsOutColor, fsOutColor,
-                                          fsOutColor, modulate.c_str());
+    // NOTE: GrGLProgramStages are now responsible for fetching
+    if (NULL == customStage) {
+        switch (desc.fFetchMode) {
+        case StageDesc::k2x2_FetchMode:
+            GrAssert(!(desc.fInConfigFlags & kMulByAlphaMask));
+            gen2x2FS(stageNum, segments, locations,
+                samplerName, texelSizeName, swizzle, fsOutColor,
+                texFunc, modulate);
+            break;
+        case StageDesc::kConvolution_FetchMode:
+            GrAssert(!(desc.fInConfigFlags & kMulByAlphaMask));
+            break;
+        case StageDesc::kDilate_FetchMode:
+        case StageDesc::kErode_FetchMode:
+            GrAssert(!(desc.fInConfigFlags & kMulByAlphaMask));
+            genMorphologyFS(stageNum, desc, segments,
+                samplerName, swizzle, imageIncrementName, fsOutColor,
+                texFunc, modulate);
+            break;
+        default:
+            if (desc.fInConfigFlags & kMulByAlphaMask) {
+                // only one of the mul by alpha flags should be set
+                GrAssert(GrIsPow2(kMulByAlphaMask & desc.fInConfigFlags));
+                GrAssert(!(desc.fInConfigFlags & 
+                           StageDesc::kSmearAlpha_InConfigFlag));
+                GrAssert(!(desc.fInConfigFlags & 
+                           StageDesc::kSmearRed_InConfigFlag));
+                segments->fFSCode.appendf("\t%s = %s(%s, %s)%s;\n",
+                                          fsOutColor, texFunc.c_str(), 
+                                          samplerName,
+                                          segments->fSampleCoords.c_str(),
+                                          swizzle);
+                if (desc.fInConfigFlags &
+                    StageDesc::kMulRGBByAlpha_RoundUp_InConfigFlag) {
+                    segments->fFSCode.appendf("\t%s = vec4(ceil(%s.rgb*%s.a*255.0)/255.0,%s.a)%s;\n",
+                                              fsOutColor, fsOutColor, fsOutColor,
+                                              fsOutColor, modulate.c_str());
+                } else {
+                    segments->fFSCode.appendf("\t%s = vec4(floor(%s.rgb*%s.a*255.0)/255.0,%s.a)%s;\n",
+                                              fsOutColor, fsOutColor, fsOutColor,
+                                              fsOutColor, modulate.c_str());
+                }
             } else {
-                segments->fFSCode.appendf("\t%s = vec4(floor(%s.rgb*%s.a*255.0)/255.0,%s.a)%s;\n",
-                                          fsOutColor, fsOutColor, fsOutColor,
-                                          fsOutColor, modulate.c_str());
+                segments->fFSCode.appendf("\t%s = %s(%s, %s)%s%s;\n",
+                                          fsOutColor, texFunc.c_str(), 
+                                          samplerName, 
+                                          segments->fSampleCoords.c_str(),
+                                          swizzle, modulate.c_str());
             }
-        } else {
-            segments->fFSCode.appendf("\t%s = %s(%s, %s)%s%s;\n",
-                                      fsOutColor, texFunc.c_str(), 
-                                      samplerName, 
-                                      segments->fSampleCoords.c_str(),
-                                      swizzle, modulate.c_str());
         }
     }
 
@@ -1762,8 +1765,7 @@
         segments->fFSCode.appendf("\t{ // stage %d %s \n",
                                   stageNum, customStage->name());
         customStage->emitTextureSetup(segments);
-        customStage->emitFS(&segments->fFSCode, fsOutColor, fsInColor,
-                            samplerName, segments->fSampleCoords.c_str());
+        customStage->emitFS(segments, fsOutColor, fsInColor, samplerName);
         segments->fFSCode.appendf("\t}\n");
     }
 }