Move loops that chain together effects into GrGLShaderBuilder from GrGLProgram.

R=robertphillips@google.com

Review URL: https://codereview.chromium.org/14925010

git-svn-id: http://skia.googlecode.com/svn/trunk@9073 2bbb7eff-a529-9590-31e7-b0007b416f81
diff --git a/src/gpu/gl/GrGLProgram.cpp b/src/gpu/gl/GrGLProgram.cpp
index 1b4baa4..1b9c3a2 100644
--- a/src/gpu/gl/GrGLProgram.cpp
+++ b/src/gpu/gl/GrGLProgram.cpp
@@ -485,35 +485,21 @@
     bool needColor, needFilterColor;
     need_blend_inputs(filterColorCoeff, colorCoeff, &needFilterColor, &needColor);
 
-    if (needColor) {
-        ///////////////////////////////////////////////////////////////////////////
-        // compute the color
-        // if we have color stages string them together, feeding the output color
-        // of each to the next and generating code for each stage.
-        SkString outColor;
-        for (int s = 0; s < fDesc.fFirstCoverageStage; ++s) {
-            if (GrGLEffect::kNoEffectKey != fDesc.fEffectKeys[s]) {
-                if (kZeros_GrSLConstantVec == knownColorValue) {
-                    // Effects have no way to communicate zeros, they treat an empty string as ones.
-                    inColor = "initialColor";
-                    builder.fsCodeAppendf("\tvec4 %s = %s;\n", inColor.c_str(), GrGLSLZerosVecf(4));
-                }
-                // create var to hold stage result
-                outColor = "color";
-                outColor.appendS32(s);
-                builder.fsCodeAppendf("\tvec4 %s;\n", outColor.c_str());
+    // used in order for builder to return the per-stage uniform handles.
+    SkTArray<GrGLUniformManager::UniformHandle, true>* stageUniformArrays[GrDrawState::kNumStages];
 
-                builder.setCurrentStage(s);
-                fEffects[s] = builder.createAndEmitGLEffect(*stages[s],
-                                                            fDesc.fEffectKeys[s],
-                                                            inColor.size() ? inColor.c_str() : NULL,
-                                                            outColor.c_str(),
-                                                            &fUniformHandles.fEffectSamplerUnis[s]);
-                builder.setNonStage();
-                inColor = outColor;
-                knownColorValue = kNone_GrSLConstantVec;
-            }
+    if (needColor) {
+        for (int s = 0; s < fDesc.fFirstCoverageStage; ++s) {
+            stageUniformArrays[s] = &fUniformHandles.fEffectSamplerUnis[s];
         }
+
+        builder.emitEffects(stages,
+                            fDesc.fEffectKeys,
+                            fDesc.fFirstCoverageStage,
+                            &inColor,
+                            &knownColorValue,
+                            stageUniformArrays,
+                            fEffects);
     }
 
     // Insert the color filter. This will soon be replaced by a color effect.
@@ -540,37 +526,21 @@
 
     ///////////////////////////////////////////////////////////////////////////
     // compute the partial coverage
-
-    // incoming coverage to current stage being processed.
     SkString inCoverage;
     GrSLConstantVec knownCoverageValue = this->genInputCoverage(&builder, &inCoverage);
 
-    SkString outCoverage;
-    for (int s = fDesc.fFirstCoverageStage; s < GrDrawState::kNumStages; ++s) {
-        if (fDesc.fEffectKeys[s]) {
-            if (kZeros_GrSLConstantVec == knownCoverageValue) {
-                // Effects have no way to communicate zeros, they treat an empty string as ones.
-                inCoverage = "initialCoverage";
-                builder.fsCodeAppendf("\tvec4 %s = %s;\n", inCoverage.c_str(), GrGLSLZerosVecf(4));
-            }
-            // create var to hold stage output
-            outCoverage = "coverage";
-            outCoverage.appendS32(s);
-            builder.fsCodeAppendf("\tvec4 %s;\n", outCoverage.c_str());
-
-            builder.setCurrentStage(s);
-            fEffects[s] = builder.createAndEmitGLEffect(
-                                            *stages[s],
-                                            fDesc.fEffectKeys[s],
-                                            inCoverage.size() ? inCoverage.c_str() : NULL,
-                                            outCoverage.c_str(),
-                                            &fUniformHandles.fEffectSamplerUnis[s]);
-            builder.setNonStage();
-            inCoverage = outCoverage;
-            knownCoverageValue = kNone_GrSLConstantVec;
-        }
+    for (int s = fDesc.fFirstCoverageStage, i = 0; s < GrDrawState::kNumStages; ++s, ++i) {
+        stageUniformArrays[i] = &fUniformHandles.fEffectSamplerUnis[s];
     }
 
+    builder.emitEffects(stages + fDesc.fFirstCoverageStage,
+                        fDesc.fEffectKeys + fDesc.fFirstCoverageStage,
+                        GrDrawState::kNumStages - fDesc.fFirstCoverageStage,
+                        &inCoverage,
+                        &knownCoverageValue,
+                        stageUniformArrays,
+                        fEffects + fDesc.fFirstCoverageStage);
+
     // discard if coverage is zero
     if (fDesc.fDiscardIfZeroCoverage && kOnes_GrSLConstantVec != knownCoverageValue) {
         if (kZeros_GrSLConstantVec == knownCoverageValue) {