Index: src/gpu/gl/GrGLProgram.cpp |
diff --git a/src/gpu/gl/GrGLProgram.cpp b/src/gpu/gl/GrGLProgram.cpp |
index 0445073d4c184e72dffd1ca77a50b63df48ffc82..1039b3b2e77357de63edc5e63a3c0896fb90b1a5 100644 |
--- a/src/gpu/gl/GrGLProgram.cpp |
+++ b/src/gpu/gl/GrGLProgram.cpp |
@@ -58,12 +58,12 @@ GrGLProgram::GrGLProgram(const GrGLContext& gl, |
fFShaderID = 0; |
fProgramID = 0; |
+ fDstCopyTexUnit = -1; |
+ |
fColor = GrColor_ILLEGAL; |
fColorFilterColor = GrColor_ILLEGAL; |
- for (int s = 0; s < GrDrawState::kNumStages; ++s) { |
- fEffects[s] = NULL; |
- } |
+ fEffectStates.reset(desc.numTotalEffects()); |
this->genProgram(stages); |
} |
@@ -81,10 +81,6 @@ GrGLProgram::~GrGLProgram() { |
if (fProgramID) { |
GL_CALL(DeleteProgram(fProgramID)); |
} |
- |
- for (int i = 0; i < GrDrawState::kNumStages; ++i) { |
- delete fEffects[i]; |
- } |
} |
void GrGLProgram::abandon() { |
@@ -488,11 +484,14 @@ bool GrGLProgram::genProgram(const GrEffectStage* stages[]) { |
need_blend_inputs(filterColorCoeff, colorCoeff, &needFilterColor, &needColor); |
// used in order for builder to return the per-stage uniform handles. |
- SkTArray<GrGLUniformManager::UniformHandle, true>* stageUniformArrays[GrDrawState::kNumStages]; |
+ typedef SkTArray<GrGLUniformManager::UniformHandle, true>* UniHandleArrayPtr; |
+ int maxColorOrCovEffectCnt = GrMax(fDesc.numColorEffects(), fDesc.numCoverageEffects()); |
+ SkAutoTArray<UniHandleArrayPtr> effectUniformArrays(maxColorOrCovEffectCnt); |
+ SkAutoTArray<GrGLEffect*> glEffects(maxColorOrCovEffectCnt); |
if (needColor) { |
- for (int s = 0; s < fDesc.numColorEffects(); ++s) { |
- stageUniformArrays[s] = &fUniformHandles.fEffectSamplerUnis[s]; |
+ for (int e = 0; e < fDesc.numColorEffects(); ++e) { |
+ effectUniformArrays[e] = &fEffectStates[e].fSamplerUnis; |
} |
builder.emitEffects(stages, |
@@ -500,8 +499,12 @@ bool GrGLProgram::genProgram(const GrEffectStage* stages[]) { |
fDesc.numColorEffects(), |
&inColor, |
&knownColorValue, |
- stageUniformArrays, |
- fEffects); |
+ effectUniformArrays.get(), |
+ glEffects.get()); |
+ |
+ for (int e = 0; e < fDesc.numColorEffects(); ++e) { |
+ fEffectStates[e].fGLEffect = glEffects[e]; |
+ } |
} |
// Insert the color filter. This will soon be replaced by a color effect. |
@@ -531,8 +534,8 @@ bool GrGLProgram::genProgram(const GrEffectStage* stages[]) { |
SkString inCoverage; |
GrSLConstantVec knownCoverageValue = this->genInputCoverage(&builder, &inCoverage); |
- for (int s = 0; s < fDesc.numCoverageEffects(); ++s) { |
- stageUniformArrays[s] = &fUniformHandles.fEffectSamplerUnis[s + fDesc.numColorEffects()]; |
+ for (int e = 0; e < fDesc.numCoverageEffects(); ++e) { |
+ effectUniformArrays[e] = &fEffectStates[e + fDesc.numColorEffects()].fSamplerUnis; |
} |
builder.emitEffects(stages + fDesc.numColorEffects(), |
@@ -540,8 +543,11 @@ bool GrGLProgram::genProgram(const GrEffectStage* stages[]) { |
fDesc.numCoverageEffects(), |
&inCoverage, |
&knownCoverageValue, |
- stageUniformArrays, |
- fEffects + fDesc.numColorEffects()); |
+ effectUniformArrays.get(), |
+ glEffects.get()); |
+ for (int e = 0; e < fDesc.numCoverageEffects(); ++e) { |
+ fEffectStates[e + fDesc.numColorEffects()].fGLEffect = glEffects[e]; |
+ } |
// discard if coverage is zero |
if (header.fDiscardIfZeroCoverage && kOnes_GrSLConstantVec != knownCoverageValue) { |
@@ -742,21 +748,20 @@ bool GrGLProgram::bindOutputsAttribsAndLinkProgram(const GrGLShaderBuilder& buil |
void GrGLProgram::initSamplerUniforms() { |
GL_CALL(UseProgram(fProgramID)); |
- // We simply bind the uniforms to successive texture units beginning at 0. setData() assumes |
- // this behavior. |
GrGLint texUnitIdx = 0; |
if (GrGLUniformManager::kInvalidUniformHandle != fUniformHandles.fDstCopySamplerUni) { |
fUniformManager.setSampler(fUniformHandles.fDstCopySamplerUni, texUnitIdx); |
- ++texUnitIdx; |
+ fDstCopyTexUnit = texUnitIdx++; |
} |
- for (int s = 0; s < GrDrawState::kNumStages; ++s) { |
- int numSamplers = fUniformHandles.fEffectSamplerUnis[s].count(); |
- for (int u = 0; u < numSamplers; ++u) { |
- UniformHandle handle = fUniformHandles.fEffectSamplerUnis[s][u]; |
+ 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); |
- ++texUnitIdx; |
+ fEffectStates[e].fTextureUnits[s] = texUnitIdx++; |
} |
} |
} |
@@ -797,7 +802,6 @@ void GrGLProgram::setData(GrGpuGL* gpu, |
fColorFilterColor = drawState.getColorFilterColor(); |
} |
- GrGLint texUnitIdx = 0; |
if (NULL != dstCopy) { |
if (GrGLUniformManager::kInvalidUniformHandle != fUniformHandles.fDstCopyTopLeftUni) { |
GrAssert(GrGLUniformManager::kInvalidUniformHandle != fUniformHandles.fDstCopyScaleUni); |
@@ -811,8 +815,7 @@ void GrGLProgram::setData(GrGpuGL* gpu, |
1.f / dstCopy->texture()->height()); |
GrGLTexture* texture = static_cast<GrGLTexture*>(dstCopy->texture()); |
static GrTextureParams kParams; // the default is clamp, nearest filtering. |
- gpu->bindTexture(texUnitIdx, kParams, texture); |
- ++texUnitIdx; |
+ gpu->bindTexture(fDstCopyTexUnit, kParams, texture); |
} else { |
GrAssert(GrGLUniformManager::kInvalidUniformHandle == |
fUniformHandles.fDstCopyScaleUni); |
@@ -830,18 +833,19 @@ void GrGLProgram::setData(GrGpuGL* gpu, |
GrAssert(NULL != stages[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 != fEffects[e]) { |
+ if (NULL != fEffectStates[e].fGLEffect) { |
bool explicitLocalCoords = -1 != fDesc.getHeader().fLocalCoordAttributeIndex; |
GrDrawEffect drawEffect(*stages[e], explicitLocalCoords); |
- fEffects[e]->setData(fUniformManager, drawEffect); |
- int numSamplers = fUniformHandles.fEffectSamplerUnis[e].count(); |
- for (int u = 0; u < numSamplers; ++u) { |
- UniformHandle handle = fUniformHandles.fEffectSamplerUnis[e][u]; |
+ 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(u); |
+ const GrTextureAccess& access = (*stages[e]->getEffect())->textureAccess(s); |
GrGLTexture* texture = static_cast<GrGLTexture*>(access.getTexture()); |
- gpu->bindTexture(texUnitIdx, access.getParams(), texture); |
- ++texUnitIdx; |
+ int unit = fEffectStates[e].fTextureUnits[s]; |
+ gpu->bindTexture(unit, access.getParams(), texture); |
} |
} |
} |