Index: src/gpu/gl/GrGLProgram.cpp |
diff --git a/src/gpu/gl/GrGLProgram.cpp b/src/gpu/gl/GrGLProgram.cpp |
index ebc57827c5d69393fd745563c56304283b5b2271..ac9794d4d5d3f5994cfcb427ae3293c839ff5f3f 100644 |
--- a/src/gpu/gl/GrGLProgram.cpp |
+++ b/src/gpu/gl/GrGLProgram.cpp |
@@ -446,32 +446,10 @@ bool GrGLProgram::genProgram(const GrEffectStage* colorStages[], |
SkASSERT(0 == fProgramID); |
const GrGLProgramDesc::KeyHeader& header = fDesc.getHeader(); |
- bool hasExplicitLocalCoords = -1 != header.fLocalCoordAttributeIndex; |
- // Get the coeffs for the Mode-based color filter, determine if color is needed. |
- SkXfermode::Coeff colorCoeff; |
- SkXfermode::Coeff filterColorCoeff; |
- SkAssertResult( |
- SkXfermode::ModeAsCoeff(static_cast<SkXfermode::Mode>(header.fColorFilterXfermode), |
- &filterColorCoeff, |
- &colorCoeff)); |
- bool needColor, needFilterColor; |
- need_blend_inputs(filterColorCoeff, colorCoeff, &needFilterColor, &needColor); |
+ bool needsVertexShader = true; |
- // Create the GL effects. |
- bool hasVertexShaderEffects = false; |
- |
- SkTArray<GrDrawEffect> colorDrawEffects(needColor ? fDesc.numColorEffects() : 0); |
- if (needColor) { |
- this->buildGLEffects(&GrGLProgram::fColorEffects, colorStages, fDesc.numColorEffects(), |
- hasExplicitLocalCoords, &colorDrawEffects, &hasVertexShaderEffects); |
- } |
- |
- SkTArray<GrDrawEffect> coverageDrawEffects(fDesc.numCoverageEffects()); |
- this->buildGLEffects(&GrGLProgram::fCoverageEffects, coverageStages, fDesc.numCoverageEffects(), |
- hasExplicitLocalCoords, &coverageDrawEffects, &hasVertexShaderEffects); |
- |
- GrGLShaderBuilder builder(fGpu->ctxInfo(), fUniformManager, fDesc, hasVertexShaderEffects); |
+ GrGLShaderBuilder builder(fGpu->ctxInfo(), fUniformManager, fDesc, needsVertexShader); |
if (GrGLShaderBuilder::VertexBuilder* vertexBuilder = builder.getVertexBuilder()) { |
const char* viewMName; |
@@ -508,6 +486,16 @@ bool GrGLProgram::genProgram(const GrEffectStage* colorStages[], |
SkString inColor; |
GrSLConstantVec knownColorValue = this->genInputColor(&builder, &inColor); |
+ // Get the coeffs for the Mode-based color filter, determine if color is needed. |
+ SkXfermode::Coeff colorCoeff; |
+ SkXfermode::Coeff filterColorCoeff; |
+ SkAssertResult( |
+ SkXfermode::ModeAsCoeff(static_cast<SkXfermode::Mode>(header.fColorFilterXfermode), |
+ &filterColorCoeff, |
+ &colorCoeff)); |
+ bool needColor, needFilterColor; |
+ need_blend_inputs(filterColorCoeff, colorCoeff, &needFilterColor, &needColor); |
+ |
// used in order for builder to return the per-stage uniform handles. |
typedef SkTArray<GrGLUniformManager::UniformHandle, true>* UniHandleArrayPtr; |
int maxColorOrCovEffectCnt = GrMax(fDesc.numColorEffects(), fDesc.numCoverageEffects()); |
@@ -516,17 +504,20 @@ bool GrGLProgram::genProgram(const GrEffectStage* colorStages[], |
if (needColor) { |
for (int e = 0; e < fDesc.numColorEffects(); ++e) { |
- glEffects[e] = fColorEffects[e].fGLEffect; |
effectUniformArrays[e] = &fColorEffects[e].fSamplerUnis; |
} |
- builder.emitEffects(glEffects.get(), |
- colorDrawEffects.begin(), |
+ builder.emitEffects(colorStages, |
fDesc.effectKeys(), |
fDesc.numColorEffects(), |
&inColor, |
&knownColorValue, |
- effectUniformArrays.get()); |
+ effectUniformArrays.get(), |
+ glEffects.get()); |
+ |
+ for (int e = 0; e < fDesc.numColorEffects(); ++e) { |
+ fColorEffects[e].fGLEffect = glEffects[e]; |
+ } |
} |
// Insert the color filter. This will soon be replaced by a color effect. |
@@ -557,17 +548,19 @@ bool GrGLProgram::genProgram(const GrEffectStage* colorStages[], |
GrSLConstantVec knownCoverageValue = this->genInputCoverage(&builder, &inCoverage); |
for (int e = 0; e < fDesc.numCoverageEffects(); ++e) { |
- glEffects[e] = fCoverageEffects[e].fGLEffect; |
effectUniformArrays[e] = &fCoverageEffects[e].fSamplerUnis; |
} |
- builder.emitEffects(glEffects.get(), |
- coverageDrawEffects.begin(), |
+ builder.emitEffects(coverageStages, |
fDesc.getEffectKeys() + fDesc.numColorEffects(), |
fDesc.numCoverageEffects(), |
&inCoverage, |
&knownCoverageValue, |
- effectUniformArrays.get()); |
+ effectUniformArrays.get(), |
+ glEffects.get()); |
+ for (int e = 0; e < fDesc.numCoverageEffects(); ++e) { |
+ fCoverageEffects[e].fGLEffect = glEffects[e]; |
+ } |
// discard if coverage is zero |
if (header.fDiscardIfZeroCoverage && kOnes_GrSLConstantVec != knownCoverageValue) { |
@@ -696,28 +689,6 @@ bool GrGLProgram::genProgram(const GrEffectStage* colorStages[], |
return true; |
} |
-void GrGLProgram::buildGLEffects(SkTArray<EffectAndSamplers> GrGLProgram::* effectSet, |
- const GrEffectStage* stages[], |
- int count, |
- bool hasExplicitLocalCoords, |
- SkTArray<GrDrawEffect>* drawEffects, |
- bool* hasVertexShaderEffects) { |
- for (int e = 0; e < count; ++e) { |
- SkASSERT(NULL != stages[e] && NULL != stages[e]->getEffect()); |
- |
- const GrEffectStage& stage = *stages[e]; |
- SkNEW_APPEND_TO_TARRAY(drawEffects, GrDrawEffect, (stage, hasExplicitLocalCoords)); |
- |
- const GrDrawEffect& drawEffect = (*drawEffects)[e]; |
- GrGLEffect* effect = (this->*effectSet)[e].fGLEffect = |
- (*stage.getEffect())->getFactory().createGLInstance(drawEffect); |
- |
- if (!*hasVertexShaderEffects && effect->requiresVertexShader(drawEffect)) { |
- *hasVertexShaderEffects = true; |
- } |
- } |
-} |
- |
bool GrGLProgram::bindOutputsAttribsAndLinkProgram(const GrGLShaderBuilder& builder, |
bool bindColorOut, |
bool bindDualSrcOut) { |