Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(2)

Unified Diff: src/gpu/gl/GrGLProgram.cpp

Issue 25605008: Repurpose GrGLCoordTransform as GrGLEffectArray (Closed) Base URL: https://skia.googlecode.com/svn/trunk
Patch Set: Created 7 years, 2 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
« no previous file with comments | « src/gpu/gl/GrGLProgram.h ('k') | src/gpu/gl/GrGLProgramEffects.h » ('j') | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: src/gpu/gl/GrGLProgram.cpp
diff --git a/src/gpu/gl/GrGLProgram.cpp b/src/gpu/gl/GrGLProgram.cpp
index 89f5f584bf0ba564481fb224b8d99323cf5e4924..3691fe994b3977a633947fd0a393a840b059fbb4 100644
--- a/src/gpu/gl/GrGLProgram.cpp
+++ b/src/gpu/gl/GrGLProgram.cpp
@@ -48,9 +48,6 @@ GrGLProgram::GrGLProgram(GrGpuGL* gpu,
fColor = GrColor_ILLEGAL;
fColorFilterColor = GrColor_ILLEGAL;
- fColorEffects.reset(desc.numColorEffects());
- fCoverageEffects.reset(desc.numCoverageEffects());
-
this->genProgram(colorStages, coverageStages);
}
@@ -235,33 +232,12 @@ bool GrGLProgram::genProgram(const GrEffectStage* colorStages[],
bool needColor, needFilterColor;
need_blend_inputs(filterColorCoeff, colorCoeff, &needFilterColor, &needColor);
- // used in order for builder to return the per-stage uniform handles.
- typedef SkTArray<GrGLCoordTransform, false>* CoordTransformArrayPtr;
- typedef SkTArray<GrGLUniformManager::UniformHandle, true>* UniHandleArrayPtr;
- int maxColorOrCovEffectCnt = GrMax(fDesc.numColorEffects(), fDesc.numCoverageEffects());
- SkAutoTArray<CoordTransformArrayPtr> effectCoordTransformArrays(maxColorOrCovEffectCnt);
- SkAutoTArray<UniHandleArrayPtr> effectUniformArrays(maxColorOrCovEffectCnt);
- SkAutoTArray<GrGLEffect*> glEffects(maxColorOrCovEffectCnt);
-
- if (needColor) {
- for (int e = 0; e < fDesc.numColorEffects(); ++e) {
- effectCoordTransformArrays[e] = &fColorEffects[e].fCoordTransforms;
- effectUniformArrays[e] = &fColorEffects[e].fSamplerUnis;
- }
-
- builder.emitEffects(colorStages,
- fDesc.effectKeys(),
- fDesc.numColorEffects(),
- &inColor,
- &knownColorValue,
- effectCoordTransformArrays.get(),
- effectUniformArrays.get(),
- glEffects.get());
-
- for (int e = 0; e < fDesc.numColorEffects(); ++e) {
- fColorEffects[e].fGLEffect = glEffects[e];
- }
- }
+ fColorEffects.reset(
+ builder.createAndEmitEffects(colorStages,
+ fDesc.effectKeys(),
+ needColor ? fDesc.numColorEffects() : 0,
+ &inColor,
+ &knownColorValue));
// Insert the color filter. This will soon be replaced by a color effect.
if (SkXfermode::kDst_Mode != header.fColorFilterXfermode) {
@@ -290,22 +266,12 @@ bool GrGLProgram::genProgram(const GrEffectStage* colorStages[],
SkString inCoverage = builder.getInputCoverage();
GrSLConstantVec knownCoverageValue = builder.getKnownCoverageValue();
- for (int e = 0; e < fDesc.numCoverageEffects(); ++e) {
- effectCoordTransformArrays[e] = &fCoverageEffects[e].fCoordTransforms;
- effectUniformArrays[e] = &fCoverageEffects[e].fSamplerUnis;
- }
-
- builder.emitEffects(coverageStages,
- fDesc.getEffectKeys() + fDesc.numColorEffects(),
- fDesc.numCoverageEffects(),
- &inCoverage,
- &knownCoverageValue,
- effectCoordTransformArrays.get(),
- effectUniformArrays.get(),
- glEffects.get());
- for (int e = 0; e < fDesc.numCoverageEffects(); ++e) {
- fCoverageEffects[e].fGLEffect = glEffects[e];
- }
+ fCoverageEffects.reset(
+ builder.createAndEmitEffects(coverageStages,
+ fDesc.getEffectKeys() + fDesc.numColorEffects(),
+ fDesc.numCoverageEffects(),
+ &inCoverage,
+ &knownCoverageValue));
// discard if coverage is zero
if (header.fDiscardIfZeroCoverage && kOnes_GrSLConstantVec != knownCoverageValue) {
@@ -421,59 +387,12 @@ void GrGLProgram::initSamplerUniforms() {
fUniformManager.setSampler(fUniformHandles.fDstCopySamplerUni, texUnitIdx);
fDstCopyTexUnit = 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 (handle.isValid()) {
- fUniformManager.setSampler(handle, *texUnitIdx);
- effect->fTextureUnits[s] = (*texUnitIdx)++;
- }
- }
+ fColorEffects->initSamplers(fUniformManager, &texUnitIdx);
+ fCoverageEffects->initSamplers(fUniformManager, &texUnitIdx);
}
///////////////////////////////////////////////////////////////////////////////
-void GrGLProgram::setEffectData(const GrEffectStage& stage,
- EffectAndSamplers& effect) {
-
- // Let the GrGLEffect set its data.
- bool explicitLocalCoords = -1 != fDesc.getHeader().fLocalCoordAttributeIndex;
- GrDrawEffect drawEffect(stage, explicitLocalCoords);
- effect.fGLEffect->setData(fUniformManager, drawEffect);
-
- // Set the effect's coord transform matrices.
- int numTransforms = effect.fCoordTransforms.count();
- SkASSERT((*stage.getEffect())->numTransforms() == numTransforms);
- for (int c = 0; c < numTransforms; ++c) {
- effect.fCoordTransforms[c].setData(fUniformManager, drawEffect, c);
- }
-
- // Bind the texures for the effect.
- int numSamplers = effect.fSamplerUnis.count();
- SkASSERT((*stage.getEffect())->numTextures() == numSamplers);
- for (int s = 0; s < numSamplers; ++s) {
- UniformHandle handle = effect.fSamplerUnis[s];
- if (handle.isValid()) {
- const GrTextureAccess& access = (*stage.getEffect())->textureAccess(s);
- GrGLTexture* texture = static_cast<GrGLTexture*>(access.getTexture());
- int unit = effect.fTextureUnits[s];
- fGpu->bindTexture(unit, access.getParams(), texture);
- }
- }
-}
-
void GrGLProgram::setData(GrDrawState::BlendOptFlags blendOpts,
const GrEffectStage* colorStages[],
const GrEffectStage* coverageStages[],
@@ -528,19 +447,8 @@ void GrGLProgram::setData(GrDrawState::BlendOptFlags blendOpts,
SkASSERT(!fUniformHandles.fDstCopySamplerUni.isValid());
}
- 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 != fColorEffects[e].fGLEffect) {
- this->setEffectData(*colorStages[e], fColorEffects[e]);
- }
- }
-
- for (int e = 0; e < fCoverageEffects.count(); ++e) {
- if (NULL != fCoverageEffects[e].fGLEffect) {
- this->setEffectData(*coverageStages[e], fCoverageEffects[e]);
- }
- }
+ fColorEffects->setData(fGpu, fUniformManager, colorStages);
+ fCoverageEffects->setData(fGpu, fUniformManager, coverageStages);
}
void GrGLProgram::setColor(const GrDrawState& drawState,
« no previous file with comments | « src/gpu/gl/GrGLProgram.h ('k') | src/gpu/gl/GrGLProgramEffects.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698