Index: src/gpu/gl/GrGLProgram.cpp |
diff --git a/src/gpu/gl/GrGLProgram.cpp b/src/gpu/gl/GrGLProgram.cpp |
index ac9794d4d5d3f5994cfcb427ae3293c839ff5f3f..00185b8110858511c22b918ba7de903e5fce9434 100644 |
--- a/src/gpu/gl/GrGLProgram.cpp |
+++ b/src/gpu/gl/GrGLProgram.cpp |
@@ -446,10 +446,44 @@ bool GrGLProgram::genProgram(const GrEffectStage* colorStages[], |
SkASSERT(0 == fProgramID); |
const GrGLProgramDesc::KeyHeader& header = fDesc.getHeader(); |
+ const bool hasExplicitLocalCoords = -1 != header.fLocalCoordAttributeIndex; |
- bool needsVertexShader = true; |
+ // 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); |
- GrGLShaderBuilder builder(fGpu->ctxInfo(), fUniformManager, fDesc, needsVertexShader); |
+ // Create the GL effects. |
+ bool requiresVertexShader = true; |
+ |
+ SkTArray<GrDrawEffect> colorDrawEffects(needColor ? fDesc.numColorEffects() : 0); |
bsalomon
2013/09/06 14:10:03
A couple small style things.. we try to wrap at 10
Chris Dalton
2013/09/06 17:17:24
Will do.
|
+ if (needColor) { |
+ for (int e = 0; e < fDesc.numColorEffects(); ++e) { |
+ SkASSERT(NULL != colorStages[e] && NULL != colorStages[e]->getEffect()); |
+ SkNEW_APPEND_TO_TARRAY(&colorDrawEffects, GrDrawEffect, (*colorStages[e], hasExplicitLocalCoords)); |
+ fColorEffects[e].fGLEffect = |
+ (*colorStages[e]->getEffect())->getFactory().createGLInstance(colorDrawEffects[e]); |
+ requiresVertexShader = requiresVertexShader |
+ || fColorEffects[e].fGLEffect->requiresVertexShader(colorDrawEffects[e]); |
+ } |
+ } |
+ |
+ SkTArray<GrDrawEffect> coverageDrawEffects(fDesc.numCoverageEffects()); |
+ for (int e = 0; e < fDesc.numCoverageEffects(); ++e) { |
+ SkASSERT(NULL != coverageStages[e] && NULL != coverageStages[e]->getEffect()); |
+ SkNEW_APPEND_TO_TARRAY(&coverageDrawEffects, GrDrawEffect, (*coverageStages[e], hasExplicitLocalCoords)); |
+ fCoverageEffects[e].fGLEffect = |
+ (*coverageStages[e]->getEffect())->getFactory().createGLInstance(coverageDrawEffects[e]); |
+ requiresVertexShader = requiresVertexShader |
+ || fCoverageEffects[e].fGLEffect->requiresVertexShader(coverageDrawEffects[e]);; |
+ } |
+ |
+ GrGLShaderBuilder builder(fGpu->ctxInfo(), fUniformManager, fDesc, requiresVertexShader); |
if (GrGLShaderBuilder::VertexBuilder* vertexBuilder = builder.getVertexBuilder()) { |
const char* viewMName; |
@@ -486,16 +520,6 @@ 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()); |
@@ -504,20 +528,17 @@ 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(colorStages, |
+ builder.emitEffects(glEffects.get(), |
+ colorDrawEffects.begin(), |
fDesc.effectKeys(), |
fDesc.numColorEffects(), |
&inColor, |
&knownColorValue, |
- effectUniformArrays.get(), |
- glEffects.get()); |
- |
- for (int e = 0; e < fDesc.numColorEffects(); ++e) { |
- fColorEffects[e].fGLEffect = glEffects[e]; |
- } |
+ effectUniformArrays.get()); |
} |
// Insert the color filter. This will soon be replaced by a color effect. |
@@ -548,19 +569,17 @@ 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(coverageStages, |
+ builder.emitEffects(glEffects.get(), |
+ coverageDrawEffects.begin(), |
fDesc.getEffectKeys() + fDesc.numColorEffects(), |
fDesc.numCoverageEffects(), |
&inCoverage, |
&knownCoverageValue, |
- effectUniformArrays.get(), |
- glEffects.get()); |
- for (int e = 0; e < fDesc.numCoverageEffects(); ++e) { |
- fCoverageEffects[e].fGLEffect = glEffects[e]; |
- } |
+ effectUniformArrays.get()); |
// discard if coverage is zero |
if (header.fDiscardIfZeroCoverage && kOnes_GrSLConstantVec != knownCoverageValue) { |