Chromium Code Reviews| 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) { |