| Index: src/gpu/gl/GrGLProgram.cpp
|
| diff --git a/src/gpu/gl/GrGLProgram.cpp b/src/gpu/gl/GrGLProgram.cpp
|
| index 1039b3b2e77357de63edc5e63a3c0896fb90b1a5..8a24d60c14d409fa104ae27c0c184c5f31703940 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,24 +758,56 @@ void GrGLProgram::initSamplerUniforms() {
|
| fDstCopyTexUnit = texUnitIdx++;
|
| }
|
|
|
| - for (int e = 0; e < fEffectStates.count(); ++e) {
|
| - int numSamplers = fEffectStates[e].fSamplerUnis.count();
|
| - fEffectStates[e].fTextureUnits.reset(numSamplers);
|
| - for (int s = 0; s < numSamplers; ++s) {
|
| - UniformHandle handle = fEffectStates[e].fSamplerUnis[s];
|
| - if (GrGLUniformManager::kInvalidUniformHandle != handle) {
|
| - fUniformManager.setSampler(handle, texUnitIdx);
|
| - fEffectStates[e].fTextureUnits[s] = texUnitIdx++;
|
| - }
|
| + for (int e = 0; e < fColorEffects.count(); ++e) {
|
| + this->initEffectSamplerUniforms(&fColorEffects[e], &texUnitIdx);
|
| + }
|
| +
|
| + for (int e = 0; e < fCoverageEffects.count(); ++e) {
|
| + this->initEffectSamplerUniforms(&fCoverageEffects[e], &texUnitIdx);
|
| + }
|
| +}
|
| +
|
| +void GrGLProgram::initEffectSamplerUniforms(EffectAndSamplers* effect, int* texUnitIdx) {
|
| + int numSamplers = effect->fSamplerUnis.count();
|
| + effect->fTextureUnits.reset(numSamplers);
|
| + for (int s = 0; s < numSamplers; ++s) {
|
| + UniformHandle handle = effect->fSamplerUnis[s];
|
| + if (GrGLUniformManager::kInvalidUniformHandle != handle) {
|
| + fUniformManager.setSampler(handle, *texUnitIdx);
|
| + effect->fTextureUnits[s] = (*texUnitIdx)++;
|
| }
|
| }
|
| }
|
|
|
| ///////////////////////////////////////////////////////////////////////////////
|
|
|
| +void GrGLProgram::setEffectData(GrGpuGL* gpu,
|
| + const GrEffectStage& stage,
|
| + const EffectAndSamplers& effect) {
|
| +
|
| + // Let the GrGLEffect set its data.
|
| + 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 +864,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]);
|
| }
|
| }
|
| }
|
|
|