Chromium Code Reviews| Index: src/gpu/gl/GrGLProgram.cpp |
| diff --git a/src/gpu/gl/GrGLProgram.cpp b/src/gpu/gl/GrGLProgram.cpp |
| index 1039b3b2e77357de63edc5e63a3c0896fb90b1a5..f9305aad1343a1ab328e2f83e3b804f7e3df02f0 100644 |
| --- a/src/gpu/gl/GrGLProgram.cpp |
| +++ b/src/gpu/gl/GrGLProgram.cpp |
| @@ -38,8 +38,9 @@ inline const char* dual_source_output_name() { return "dualSourceOut"; } |
| GrGLProgram* GrGLProgram::Create(const GrGLContext& gl, |
| const GrGLProgramDesc& desc, |
| - const GrEffectStage* stages[]) { |
| - GrGLProgram* program = SkNEW_ARGS(GrGLProgram, (gl, desc, stages)); |
| + const GrEffectStage* colorStages[], |
| + const GrEffectStage* coverageStages[]) { |
| + GrGLProgram* program = SkNEW_ARGS(GrGLProgram, (gl, desc, colorStages, coverageStages)); |
| if (!program->succeeded()) { |
| delete program; |
| program = NULL; |
| @@ -49,7 +50,8 @@ GrGLProgram* GrGLProgram::Create(const GrGLContext& gl, |
| GrGLProgram::GrGLProgram(const GrGLContext& gl, |
| const GrGLProgramDesc& desc, |
| - const GrEffectStage* stages[]) |
| + const GrEffectStage* colorStages[], |
| + const GrEffectStage* coverageStages[]) |
| : fContext(gl) |
| , fUniformManager(gl) { |
| fDesc = desc; |
| @@ -63,9 +65,10 @@ GrGLProgram::GrGLProgram(const GrGLContext& gl, |
| fColor = GrColor_ILLEGAL; |
| fColorFilterColor = GrColor_ILLEGAL; |
| - fEffectStates.reset(desc.numTotalEffects()); |
| + fColorEffects.reset(desc.numColorEffects()); |
| + fCoverageEffects.reset(desc.numCoverageEffects()); |
| - this->genProgram(stages); |
| + this->genProgram(colorStages, coverageStages); |
| } |
| GrGLProgram::~GrGLProgram() { |
| @@ -432,7 +435,8 @@ bool GrGLProgram::compileShaders(const GrGLShaderBuilder& builder) { |
| return true; |
| } |
| -bool GrGLProgram::genProgram(const GrEffectStage* stages[]) { |
| +bool GrGLProgram::genProgram(const GrEffectStage* colorStages[], |
| + const GrEffectStage* coverageStages[]) { |
| GrAssert(0 == fProgramID); |
| const GrGLProgramDesc::KeyHeader& header = fDesc.getHeader(); |
| @@ -491,10 +495,10 @@ bool GrGLProgram::genProgram(const GrEffectStage* stages[]) { |
| if (needColor) { |
| for (int e = 0; e < fDesc.numColorEffects(); ++e) { |
| - effectUniformArrays[e] = &fEffectStates[e].fSamplerUnis; |
| + effectUniformArrays[e] = &fColorEffects[e].fSamplerUnis; |
| } |
| - builder.emitEffects(stages, |
| + builder.emitEffects(colorStages, |
| fDesc.effectKeys(), |
| fDesc.numColorEffects(), |
| &inColor, |
| @@ -503,7 +507,7 @@ bool GrGLProgram::genProgram(const GrEffectStage* stages[]) { |
| glEffects.get()); |
| for (int e = 0; e < fDesc.numColorEffects(); ++e) { |
| - fEffectStates[e].fGLEffect = glEffects[e]; |
| + fColorEffects[e].fGLEffect = glEffects[e]; |
| } |
| } |
| @@ -535,10 +539,10 @@ bool GrGLProgram::genProgram(const GrEffectStage* stages[]) { |
| GrSLConstantVec knownCoverageValue = this->genInputCoverage(&builder, &inCoverage); |
| for (int e = 0; e < fDesc.numCoverageEffects(); ++e) { |
| - effectUniformArrays[e] = &fEffectStates[e + fDesc.numColorEffects()].fSamplerUnis; |
| + effectUniformArrays[e] = &fCoverageEffects[e].fSamplerUnis; |
| } |
| - builder.emitEffects(stages + fDesc.numColorEffects(), |
| + builder.emitEffects(coverageStages, |
| fDesc.getEffectKeys() + fDesc.numColorEffects(), |
| fDesc.numCoverageEffects(), |
| &inCoverage, |
| @@ -546,7 +550,7 @@ bool GrGLProgram::genProgram(const GrEffectStage* stages[]) { |
| effectUniformArrays.get(), |
| glEffects.get()); |
| for (int e = 0; e < fDesc.numCoverageEffects(); ++e) { |
| - fEffectStates[e + fDesc.numColorEffects()].fGLEffect = glEffects[e]; |
| + fCoverageEffects[e].fGLEffect = glEffects[e]; |
| } |
| // discard if coverage is zero |
| @@ -754,14 +758,26 @@ void GrGLProgram::initSamplerUniforms() { |
| fDstCopyTexUnit = texUnitIdx++; |
| } |
|
robertphillips
2013/06/06 19:38:15
sub-routine for these two?
bsalomon
2013/06/06 20:07:40
yeah, will do
|
| - for (int e = 0; e < fEffectStates.count(); ++e) { |
| - int numSamplers = fEffectStates[e].fSamplerUnis.count(); |
| - fEffectStates[e].fTextureUnits.reset(numSamplers); |
| + for (int e = 0; e < fColorEffects.count(); ++e) { |
| + int numSamplers = fColorEffects[e].fSamplerUnis.count(); |
| + fColorEffects[e].fTextureUnits.reset(numSamplers); |
| for (int s = 0; s < numSamplers; ++s) { |
| - UniformHandle handle = fEffectStates[e].fSamplerUnis[s]; |
| + UniformHandle handle = fColorEffects[e].fSamplerUnis[s]; |
| if (GrGLUniformManager::kInvalidUniformHandle != handle) { |
| fUniformManager.setSampler(handle, texUnitIdx); |
| - fEffectStates[e].fTextureUnits[s] = texUnitIdx++; |
| + fColorEffects[e].fTextureUnits[s] = texUnitIdx++; |
| + } |
| + } |
| + } |
| + |
| + for (int e = 0; e < fCoverageEffects.count(); ++e) { |
| + int numSamplers = fCoverageEffects[e].fSamplerUnis.count(); |
| + fCoverageEffects[e].fTextureUnits.reset(numSamplers); |
| + for (int s = 0; s < numSamplers; ++s) { |
| + UniformHandle handle = fCoverageEffects[e].fSamplerUnis[s]; |
| + if (GrGLUniformManager::kInvalidUniformHandle != handle) { |
| + fUniformManager.setSampler(handle, texUnitIdx); |
| + fCoverageEffects[e].fTextureUnits[s] = texUnitIdx++; |
| } |
| } |
| } |
| @@ -769,9 +785,33 @@ void GrGLProgram::initSamplerUniforms() { |
| /////////////////////////////////////////////////////////////////////////////// |
| +void GrGLProgram::setEffectData(GrGpuGL* gpu, |
| + const GrEffectStage& stage, |
| + const EffectAndSamplers& effect) { |
| + |
| + // Let the GrGLEffect set its data. |
|
bsalomon
2013/06/06 19:13:02
This is the removed block below, split out into it
|
| + bool explicitLocalCoords = -1 != fDesc.getHeader().fLocalCoordAttributeIndex; |
| + GrDrawEffect drawEffect(stage, explicitLocalCoords); |
| + effect.fGLEffect->setData(fUniformManager, drawEffect); |
| + |
| + // Bind the texures for the effect. |
| + int numSamplers = effect.fSamplerUnis.count(); |
| + GrAssert((*stage.getEffect())->numTextures() == numSamplers); |
| + for (int s = 0; s < numSamplers; ++s) { |
| + UniformHandle handle = effect.fSamplerUnis[s]; |
| + if (GrGLUniformManager::kInvalidUniformHandle != handle) { |
| + const GrTextureAccess& access = (*stage.getEffect())->textureAccess(s); |
| + GrGLTexture* texture = static_cast<GrGLTexture*>(access.getTexture()); |
| + int unit = effect.fTextureUnits[s]; |
| + gpu->bindTexture(unit, access.getParams(), texture); |
| + } |
| + } |
| +} |
| + |
| void GrGLProgram::setData(GrGpuGL* gpu, |
| GrDrawState::BlendOptFlags blendOpts, |
| - const GrEffectStage* stages[], |
| + const GrEffectStage* colorStages[], |
| + const GrEffectStage* coverageStages[], |
| const GrDeviceCoordTexture* dstCopy, |
| SharedGLState* sharedState) { |
| const GrDrawState& drawState = gpu->getDrawState(); |
| @@ -828,26 +868,17 @@ void GrGLProgram::setData(GrGpuGL* gpu, |
| GrAssert(GrGLUniformManager::kInvalidUniformHandle == fUniformHandles.fDstCopySamplerUni); |
| } |
| - int numEffects = fDesc.numTotalEffects(); |
| - for (int e = 0; e < numEffects; ++e) { |
| - GrAssert(NULL != stages[e]); |
| + for (int e = 0; e < fColorEffects.count(); ++e) { |
| // We may have omitted the GrGLEffect because of the color filter logic in genProgram. |
| // This can be removed when the color filter is an effect. |
| - if (NULL != fEffectStates[e].fGLEffect) { |
| - bool explicitLocalCoords = -1 != fDesc.getHeader().fLocalCoordAttributeIndex; |
| - GrDrawEffect drawEffect(*stages[e], explicitLocalCoords); |
| - fEffectStates[e].fGLEffect->setData(fUniformManager, drawEffect); |
| - int numSamplers = fEffectStates[e].fSamplerUnis.count(); |
| - GrAssert((*stages[e]->getEffect())->numTextures() == numSamplers); |
| - for (int s = 0; s < numSamplers; ++s) { |
| - UniformHandle handle = fEffectStates[e].fSamplerUnis[s]; |
| - if (GrGLUniformManager::kInvalidUniformHandle != handle) { |
| - const GrTextureAccess& access = (*stages[e]->getEffect())->textureAccess(s); |
| - GrGLTexture* texture = static_cast<GrGLTexture*>(access.getTexture()); |
| - int unit = fEffectStates[e].fTextureUnits[s]; |
| - gpu->bindTexture(unit, access.getParams(), texture); |
| - } |
| - } |
| + if (NULL != fColorEffects[e].fGLEffect) { |
| + this->setEffectData(gpu, *colorStages[e], fColorEffects[e]); |
| + } |
| + } |
| + |
| + for (int e = 0; e < fCoverageEffects.count(); ++e) { |
| + if (NULL != fCoverageEffects[e].fGLEffect) { |
| + this->setEffectData(gpu, *coverageStages[e], fCoverageEffects[e]); |
| } |
| } |
| } |