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) {