Index: src/gpu/GrDrawState.h |
diff --git a/src/gpu/GrDrawState.h b/src/gpu/GrDrawState.h |
index b894cb5a2922a9c21e766efb019ccc41789ba6b8..a4db89d643d95acb4d77cc02eecf06c0dfda93d9 100644 |
--- a/src/gpu/GrDrawState.h |
+++ b/src/gpu/GrDrawState.h |
@@ -876,43 +876,58 @@ public: |
/////////////////////////////////////////////////////////////////////////// |
- bool operator ==(const GrDrawState& that) const { |
- if (fRenderTarget.get() != that.fRenderTarget.get() || |
- fColorStages.count() != that.fColorStages.count() || |
- fCoverageStages.count() != that.fCoverageStages.count() || |
- fColor != that.fColor || |
- !fViewMatrix.cheapEqualTo(that.fViewMatrix) || |
- fSrcBlend != that.fSrcBlend || |
- fDstBlend != that.fDstBlend || |
- fBlendConstant != that.fBlendConstant || |
- fFlagBits != that.fFlagBits || |
- fVACount != that.fVACount || |
- memcmp(fVAPtr, that.fVAPtr, fVACount * sizeof(GrVertexAttrib)) || |
- fStencilSettings != that.fStencilSettings || |
- fCoverage != that.fCoverage || |
- fDrawFace != that.fDrawFace) { |
- return false; |
+ /** Return type for CombineIfPossible. */ |
+ enum CombinedState { |
+ /** The GrDrawStates cannot be combined. */ |
+ kIncompatible_CombinedState, |
+ /** Either draw state can be used in place of the other. */ |
+ kAOrB_CombinedState, |
+ /** Use the first draw state. */ |
+ kA_CombinedState, |
+ /** Use the second draw state. */ |
+ kB_CombinedState, |
+ }; |
+ |
+ /** This function determines whether the GrDrawStates used for two draws can be combined into |
+ a single GrDrawState. This is used to avoid storing redundant GrDrawStates and to determine |
+ if draws can be batched. The return value indicates whether combining is possible and, if |
+ so, which of the two inputs should be used. */ |
+ static CombinedState CombineIfPossible(const GrDrawState& a, const GrDrawState& b) { |
+ if (a.fRenderTarget.get() != b.fRenderTarget.get() || |
+ a.fColorStages.count() != b.fColorStages.count() || |
+ a.fCoverageStages.count() != b.fCoverageStages.count() || |
+ a.fColor != b.fColor || |
+ !a.fViewMatrix.cheapEqualTo(b.fViewMatrix) || |
+ a.fSrcBlend != b.fSrcBlend || |
+ a.fDstBlend != b.fDstBlend || |
+ a.fBlendConstant != b.fBlendConstant || |
+ a.fFlagBits != b.fFlagBits || |
+ a.fVACount != b.fVACount || |
+ memcmp(a.fVAPtr, b.fVAPtr, a.fVACount * sizeof(GrVertexAttrib)) || |
+ a.fStencilSettings != b.fStencilSettings || |
+ a.fCoverage != b.fCoverage || |
+ a.fDrawFace != b.fDrawFace) { |
+ return kIncompatible_CombinedState; |
} |
- bool explicitLocalCoords = this->hasLocalCoordAttribute(); |
- for (int i = 0; i < fColorStages.count(); i++) { |
- if (!GrEffectStage::AreCompatible(fColorStages[i], that.fColorStages[i], |
+ bool explicitLocalCoords = a.hasLocalCoordAttribute(); |
+ for (int i = 0; i < a.fColorStages.count(); i++) { |
+ if (!GrEffectStage::AreCompatible(a.fColorStages[i], b.fColorStages[i], |
explicitLocalCoords)) { |
- return false; |
+ return kIncompatible_CombinedState; |
} |
} |
- for (int i = 0; i < fCoverageStages.count(); i++) { |
- if (!GrEffectStage::AreCompatible(fCoverageStages[i], that.fCoverageStages[i], |
+ for (int i = 0; i < a.fCoverageStages.count(); i++) { |
+ if (!GrEffectStage::AreCompatible(a.fCoverageStages[i], b.fCoverageStages[i], |
explicitLocalCoords)) { |
- return false; |
+ return kIncompatible_CombinedState; |
} |
} |
- SkASSERT(0 == memcmp(fFixedFunctionVertexAttribIndices, |
- that.fFixedFunctionVertexAttribIndices, |
- sizeof(fFixedFunctionVertexAttribIndices))); |
- return true; |
+ SkASSERT(0 == memcmp(a.fFixedFunctionVertexAttribIndices, |
+ b.fFixedFunctionVertexAttribIndices, |
+ sizeof(a.fFixedFunctionVertexAttribIndices))); |
+ return kAOrB_CombinedState; |
} |
- bool operator !=(const GrDrawState& s) const { return !(*this == s); } |
GrDrawState& operator= (const GrDrawState& that) { |
SkASSERT(0 == fBlockEffectRemovalCnt || 0 == this->numTotalStages()); |