Index: src/gpu/gl/GrGLProgramDesc.cpp |
diff --git a/src/gpu/gl/GrGLProgramDesc.cpp b/src/gpu/gl/GrGLProgramDesc.cpp |
index 4f0011803c7d67d527386d5e39674614a605b89b..6b3008b7bdf999475042daa1792911c3d447d1c4 100644 |
--- a/src/gpu/gl/GrGLProgramDesc.cpp |
+++ b/src/gpu/gl/GrGLProgramDesc.cpp |
@@ -14,6 +14,24 @@ |
#include "SkChecksum.h" |
+namespace { |
+inline GrGLEffect::EffectKey get_key_and_update_stats(const GrEffectStage& stage, |
+ const GrGLCaps& caps, |
+ bool useExplicitLocalCoords, |
+ bool* setTrueIfReadsDst, |
+ bool* setTrueIfReadsPos) { |
+ const GrEffectRef& effect = *stage.getEffect(); |
+ const GrBackendEffectFactory& factory = effect->getFactory(); |
+ GrDrawEffect drawEffect(stage, useExplicitLocalCoords); |
+ if (effect->willReadDstColor()) { |
+ *setTrueIfReadsDst = true; |
+ } |
+ if (effect->willReadFragmentPosition()) { |
+ *setTrueIfReadsPos = true; |
+ } |
+ return factory.glEffectKey(drawEffect, caps); |
+} |
+} |
void GrGLProgramDesc::Build(const GrDrawState& drawState, |
bool isPoints, |
GrDrawState::BlendOptFlags blendOpts, |
@@ -50,27 +68,10 @@ void GrGLProgramDesc::Build(const GrDrawState& drawState, |
bool colorIsSolidWhite = (blendOpts & GrDrawState::kEmitCoverage_BlendOptFlag) || |
(!requiresColorAttrib && 0xffffffff == drawState.getColor()); |
- // Do an initial loop over the stages to count them. We count the color and coverage effects |
- // separately here. Later we may decide the distinction doesn't matter and will count all |
- // effects as color in desc. Two things will allow simplication of this mess: GrDrawState will |
- // have tight lists of color and coverage stages rather than a fixed size array with NULLS and |
- // the xfermode-color filter will be removed. |
- if (!skipColor) { |
- for (int s = 0; s < drawState.getFirstCoverageStage(); ++s) { |
- if (drawState.isStageEnabled(s)) { |
- colorStages->push_back(&drawState.getStage(s)); |
- } |
- } |
- } |
- if (!skipCoverage) { |
- for (int s = drawState.getFirstCoverageStage(); s < GrDrawState::kNumStages; ++s) { |
- if (drawState.isStageEnabled(s)) { |
- coverageStages->push_back(&drawState.getStage(s)); |
- } |
- } |
- } |
+ int numEffects = (skipColor ? 0 : drawState.numColorStages()) + |
+ (skipCoverage ? 0 : drawState.numCoverageStages()); |
- size_t newKeyLength = KeyLength(colorStages->count() + coverageStages->count()); |
+ size_t newKeyLength = KeyLength(numEffects); |
bool allocChanged; |
desc->fKey.reset(newKeyLength, SkAutoMalloc::kAlloc_OnShrink, &allocChanged); |
if (allocChanged || !desc->fInitialized) { |
@@ -86,20 +87,18 @@ void GrGLProgramDesc::Build(const GrDrawState& drawState, |
int currEffectKey = 0; |
bool readsDst = false; |
bool readFragPosition = false; |
- for (int s = 0; s < GrDrawState::kNumStages; ++s) { |
- bool skip = s < drawState.getFirstCoverageStage() ? skipColor : skipCoverage; |
- if (!skip && drawState.isStageEnabled(s)) { |
- const GrEffectRef& effect = *drawState.getStage(s).getEffect(); |
- const GrBackendEffectFactory& factory = effect->getFactory(); |
- GrDrawEffect drawEffect(drawState.getStage(s), requiresLocalCoordAttrib); |
- effectKeys[currEffectKey] = factory.glEffectKey(drawEffect, gpu->glCaps()); |
- ++currEffectKey; |
- if (effect->willReadDstColor()) { |
- readsDst = true; |
- } |
- if (effect->willReadFragmentPosition()) { |
- readFragPosition = true; |
- } |
+ if (!skipColor) { |
+ for (int s = 0; s < drawState.numColorStages(); ++s) { |
+ effectKeys[currEffectKey++] = |
+ get_key_and_update_stats(drawState.getColorStage(s), gpu->glCaps(), |
+ requiresLocalCoordAttrib, &readsDst, &readFragPosition); |
+ } |
+ } |
+ if (!skipCoverage) { |
+ for (int s = 0; s < drawState.numCoverageStages(); ++s) { |
+ effectKeys[currEffectKey++] = |
+ get_key_and_update_stats(drawState.getCoverageStage(s), gpu->glCaps(), |
+ requiresLocalCoordAttrib, &readsDst, &readFragPosition); |
} |
} |
@@ -189,7 +188,8 @@ void GrGLProgramDesc::Build(const GrDrawState& drawState, |
// If we do have coverage determine whether it matters. |
bool separateCoverageFromColor = false; |
- if (!drawState.isCoverageDrawing() && (coverageStages->count() > 0 || requiresCoverageAttrib)) { |
+ if (!drawState.isCoverageDrawing() && !skipCoverage && |
+ (drawState.numCoverageStages() > 0 || requiresCoverageAttrib)) { |
// color filter is applied between color/coverage computation |
if (SkXfermode::kDst_Mode != header->fColorFilterXfermode) { |
separateCoverageFromColor = true; |
@@ -224,14 +224,24 @@ void GrGLProgramDesc::Build(const GrDrawState& drawState, |
separateCoverageFromColor = true; |
} |
} |
- if (separateCoverageFromColor) { |
- header->fColorEffectCnt = colorStages->count(); |
- header->fCoverageEffectCnt = coverageStages->count(); |
- } else { |
- header->fColorEffectCnt = colorStages->count() + coverageStages->count(); |
- header->fCoverageEffectCnt = 0; |
- colorStages->push_back_n(coverageStages->count(), coverageStages->begin()); |
- coverageStages->reset(); |
+ if (!skipColor) { |
+ for (int s = 0; s < drawState.numColorStages(); ++s) { |
+ colorStages->push_back(&drawState.getColorStage(s)); |
+ } |
+ header->fColorEffectCnt = drawState.numColorStages(); |
+ } |
+ if (!skipCoverage) { |
+ SkTArray<const GrEffectStage*, true>* array; |
+ if (separateCoverageFromColor) { |
+ array = coverageStages; |
+ header->fCoverageEffectCnt = drawState.numCoverageStages(); |
+ } else { |
+ array = colorStages; |
+ header->fColorEffectCnt += drawState.numCoverageStages(); |
+ } |
+ for (int s = 0; s < drawState.numCoverageStages(); ++s) { |
+ array->push_back(&drawState.getCoverageStage(s)); |
+ } |
} |
*desc->checksum() = 0; |