Chromium Code Reviews| Index: src/gpu/GrDrawState.h |
| diff --git a/src/gpu/GrDrawState.h b/src/gpu/GrDrawState.h |
| index 6440790c10b1d611e651ea786f97a4b0a008d79e..cb899b5eb3bf254b6f163996d76dd93061a98e7b 100644 |
| --- a/src/gpu/GrDrawState.h |
| +++ b/src/gpu/GrDrawState.h |
| @@ -266,18 +266,6 @@ public: |
| } |
| /** |
| - * Add a color filter that can be represented by a color and a mode. Applied |
| - * after color-computing effect stages. |
| - */ |
| - void setColorFilter(GrColor c, SkXfermode::Mode mode) { |
| - fCommon.fColorFilterColor = c; |
| - fCommon.fColorFilterMode = mode; |
| - } |
| - |
| - GrColor getColorFilterColor() const { return fCommon.fColorFilterColor; } |
| - SkXfermode::Mode getColorFilterMode() const { return fCommon.fColorFilterMode; } |
| - |
| - /** |
| * Constructor sets the color to be 'color' which is undone by the destructor. |
| */ |
| class AutoColorRestore : public ::SkNoncopyable { |
| @@ -360,13 +348,13 @@ public: |
| const GrEffectRef* addColorEffect(const GrEffectRef* effect, int attr0 = -1, int attr1 = -1) { |
| SkASSERT(NULL != effect); |
| - SkNEW_APPEND_TO_TARRAY(&fColorStages, GrEffectStage, (effect, attr0, attr1)); |
| + fColorStages.appendStage(effect, attr0, attr1); |
| return effect; |
| } |
| const GrEffectRef* addCoverageEffect(const GrEffectRef* effect, int attr0 = -1, int attr1 = -1) { |
| SkASSERT(NULL != effect); |
| - SkNEW_APPEND_TO_TARRAY(&fCoverageStages, GrEffectStage, (effect, attr0, attr1)); |
| + fCoverageStages.appendStage(effect, attr0, attr1); |
| return effect; |
| } |
| @@ -403,9 +391,20 @@ public: |
| */ |
| class AutoRestoreEffects : public ::SkNoncopyable { |
| public: |
| - AutoRestoreEffects() : fDrawState(NULL), fColorEffectCnt(0), fCoverageEffectCnt(0) {} |
| + AutoRestoreEffects() |
| + : fDrawState(NULL), |
| + fFirstEffectiveColorEffect(0), |
| + fColorEffectCnt(0), |
| + fFirstEffectiveCoverageEffect(0), |
| + fCoverageEffectCnt(0) { |
| + } |
| - AutoRestoreEffects(GrDrawState* ds) : fDrawState(NULL), fColorEffectCnt(0), fCoverageEffectCnt(0) { |
| + AutoRestoreEffects(GrDrawState* ds) |
| + : fDrawState(NULL), |
| + fFirstEffectiveColorEffect(0), |
| + fColorEffectCnt(0), |
| + fFirstEffectiveCoverageEffect(0), |
| + fCoverageEffectCnt(0) { |
| this->set(ds); |
| } |
| @@ -415,15 +414,17 @@ public: |
| if (NULL != fDrawState) { |
| int n = fDrawState->fColorStages.count() - fColorEffectCnt; |
| SkASSERT(n >= 0); |
| - fDrawState->fColorStages.pop_back_n(n); |
| + fDrawState->fColorStages.removeLastStages(n, fFirstEffectiveColorEffect); |
| n = fDrawState->fCoverageStages.count() - fCoverageEffectCnt; |
| SkASSERT(n >= 0); |
| - fDrawState->fCoverageStages.pop_back_n(n); |
| + fDrawState->fCoverageStages.removeLastStages(n, fFirstEffectiveCoverageEffect); |
| SkDEBUGCODE(--fDrawState->fBlockEffectRemovalCnt;) |
| } |
| fDrawState = ds; |
| if (NULL != ds) { |
| + fFirstEffectiveColorEffect = ds->fColorStages.getFirstEffectiveStageIndex(); |
| fColorEffectCnt = ds->fColorStages.count(); |
| + fFirstEffectiveCoverageEffect = ds->fCoverageStages.getFirstEffectiveStageIndex(); |
| fCoverageEffectCnt = ds->fCoverageStages.count(); |
| SkDEBUGCODE(++ds->fBlockEffectRemovalCnt;) |
| } |
| @@ -431,16 +432,20 @@ public: |
| private: |
| GrDrawState* fDrawState; |
| + int fFirstEffectiveColorEffect; |
| int fColorEffectCnt; |
| + int fFirstEffectiveCoverageEffect; |
| int fCoverageEffectCnt; |
| }; |
| - int numColorStages() const { return fColorStages.count(); } |
| - int numCoverageStages() const { return fCoverageStages.count(); } |
| - int numTotalStages() const { return this->numColorStages() + this->numCoverageStages(); } |
| + int totalStageCount() const { return fColorStages.count() + fCoverageStages.count(); } |
| + |
| + int effectiveColorStageCount() const { return fColorStages.effectiveStageCount(); } |
| + int effectiveCoverageStageCount() const { return fCoverageStages.effectiveStageCount(); } |
| + int totalEffectiveStageCount() const { return this->effectiveColorStageCount() + this->effectiveCoverageStageCount(); } |
| - const GrEffectStage& getColorStage(int stageIdx) const { return fColorStages[stageIdx]; } |
| - const GrEffectStage& getCoverageStage(int stageIdx) const { return fCoverageStages[stageIdx]; } |
| + const GrEffectStage& getEffectiveColorStage(int stageIdx) const { return fColorStages.getEffectiveStage(stageIdx); } |
| + const GrEffectStage& getEffectiveCoverageStage(int stageIdx) const { return fCoverageStages.getEffectiveStage(stageIdx); } |
| /** |
| * Checks whether any of the effects will read the dst pixel color. |
| @@ -884,18 +889,19 @@ public: |
| bool operator !=(const GrDrawState& s) const { return !(*this == s); } |
| GrDrawState& operator= (const GrDrawState& s) { |
| - SkASSERT(0 == fBlockEffectRemovalCnt || 0 == this->numTotalStages()); |
| + SkASSERT(0 == fBlockEffectRemovalCnt || 0 == this->totalStageCount()); |
| this->setRenderTarget(s.fRenderTarget.get()); |
| fCommon = s.fCommon; |
| fColorStages = s.fColorStages; |
| fCoverageStages = s.fCoverageStages; |
| + |
| return *this; |
| } |
| private: |
| void onReset(const SkMatrix* initialViewMatrix) { |
| - SkASSERT(0 == fBlockEffectRemovalCnt || 0 == this->numTotalStages()); |
| + SkASSERT(0 == fBlockEffectRemovalCnt || 0 == this->totalStageCount()); |
| fColorStages.reset(); |
| fCoverageStages.reset(); |
| @@ -915,8 +921,6 @@ private: |
| fCommon.fFlagBits = 0x0; |
| fCommon.fStencilSettings.setDisabled(); |
| fCommon.fCoverage = 0xffffffff; |
| - fCommon.fColorFilterMode = SkXfermode::kDst_Mode; |
| - fCommon.fColorFilterColor = 0x0; |
| fCommon.fDrawFace = kBoth_DrawFace; |
| } |
| @@ -933,8 +937,6 @@ private: |
| int fVACount; |
| GrStencilSettings fStencilSettings; |
| GrColor fCoverage; |
| - SkXfermode::Mode fColorFilterMode; |
| - GrColor fColorFilterColor; |
| DrawFace fDrawFace; |
| // This is simply a different representation of info in fVertexAttribs and thus does |
| @@ -952,8 +954,6 @@ private: |
| !memcmp(fVAPtr, other.fVAPtr, fVACount * sizeof(GrVertexAttrib)) && |
| fStencilSettings == other.fStencilSettings && |
| fCoverage == other.fCoverage && |
| - fColorFilterMode == other.fColorFilterMode && |
| - fColorFilterColor == other.fColorFilterColor && |
| fDrawFace == other.fDrawFace; |
| SkASSERT(!result || 0 == memcmp(fFixedFunctionVertexAttribIndices, |
| other.fFixedFunctionVertexAttribIndices, |
| @@ -1012,13 +1012,12 @@ public: |
| // reinflate color/cov stage arrays. |
| drawState->fColorStages.reset(); |
| for (int i = 0; i < fColorStageCnt; ++i) { |
| - SkNEW_APPEND_TO_TARRAY(&drawState->fColorStages, GrEffectStage, (fStages[i])); |
| + drawState->fColorStages.appendStage(fStages[i]); |
| } |
| int coverageStageCnt = fStages.count() - fColorStageCnt; |
| drawState->fCoverageStages.reset(); |
| for (int i = 0; i < coverageStageCnt; ++i) { |
| - SkNEW_APPEND_TO_TARRAY(&drawState->fCoverageStages, |
| - GrEffectStage, (fStages[i + fColorStageCnt])); |
| + drawState->fCoverageStages.appendStage(fStages[i + fColorStageCnt]); |
| } |
| } |
| @@ -1061,7 +1060,59 @@ private: |
| SkAutoTUnref<GrRenderTarget> fRenderTarget; |
| CommonState fCommon; |
| - typedef SkSTArray<4, GrEffectStage> EffectStageArray; |
| + class EffectStageArray { |
|
bsalomon
2013/10/07 14:05:00
It seems like we'd be adding a fair amount of comp
Kimmo Kinnunen
2013/10/10 08:12:29
Done.
|
| + public: |
| + EffectStageArray() |
| + : fFirstEffectiveStage(0) { |
| + } |
| + |
| + int getFirstEffectiveStageIndex() const { return fFirstEffectiveStage; } |
| + |
| + const GrEffectStage& getEffectiveStage(int i) const { return fArray[i + fFirstEffectiveStage]; } |
| + |
| + int effectiveStageCount() const { return fArray.count() - fFirstEffectiveStage; } |
| + |
| + void appendStage(const GrEffectRef* effect, int attr0, int attr1) { |
| + GrEffectStage* newStage = SkNEW_APPEND_TO_TARRAY(&fArray, GrEffectStage, (effect, attr0, attr1)); |
| + if (!(*newStage->getEffect())->willUseInputColor()) { |
| + fFirstEffectiveStage = fArray.count() - 1; |
| + } |
| + } |
| + |
| + void appendStage(const GrEffectStage::DeferredStage& effect) { |
| + GrEffectStage* newStage = SkNEW_APPEND_TO_TARRAY(&fArray, GrEffectStage, (effect)); |
| + if (!(*newStage->getEffect())->willUseInputColor()) { |
| + fFirstEffectiveStage = fArray.count() - 1; |
| + } |
| + } |
| + |
| + void appendStage(const GrEffectStage& effect) { |
| + GrEffectStage& newStage = fArray.push_back(effect); |
| + if (!(*newStage.getEffect())->willUseInputColor()) { |
| + fFirstEffectiveStage = fArray.count() - 1; |
| + } |
| + } |
| + |
| + void removeLastStages(int n, int newFirstEffectiveStage) { |
| + fArray.pop_back_n(n); |
| + fFirstEffectiveStage = newFirstEffectiveStage; |
| + } |
| + |
| + const GrEffectStage& operator[](int i) const { return fArray[i]; } |
| + GrEffectStage& operator[](int i) { return fArray[i]; } |
| + |
| + void reset() { |
| + fArray.reset(); |
| + fFirstEffectiveStage = 0; |
| + } |
| + |
| + int count() const { return fArray.count(); } |
| + |
| + private: |
| + SkSTArray<4, GrEffectStage> fArray; |
| + int fFirstEffectiveStage; |
| + }; |
| + |
| EffectStageArray fColorStages; |
| EffectStageArray fCoverageStages; |