Index: src/gpu/GrDrawState.cpp |
diff --git a/src/gpu/GrDrawState.cpp b/src/gpu/GrDrawState.cpp |
index 1b40642251e87219f321d6a3e6aeeb836db6e84c..3189a0a079353a7be315dde3994394c166247db2 100644 |
--- a/src/gpu/GrDrawState.cpp |
+++ b/src/gpu/GrDrawState.cpp |
@@ -8,6 +8,124 @@ |
#include "GrDrawState.h" |
#include "GrPaint.h" |
+//////////////////////////////////////////////////////////////////////////////s |
+ |
+GrDrawState::CombinedState GrDrawState::CombineIfPossible( |
+ const GrDrawState& a, const GrDrawState& b) { |
+ |
+ bool usingVertexColors = a.hasColorVertexAttribute(); |
+ if (!usingVertexColors && a.fColor != b.fColor) { |
+ return kIncompatible_CombinedState; |
+ } |
+ |
+ if (a.fRenderTarget.get() != b.fRenderTarget.get() || |
+ a.fColorStages.count() != b.fColorStages.count() || |
+ a.fCoverageStages.count() != b.fCoverageStages.count() || |
+ !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.fDrawFace != b.fDrawFace) { |
+ return kIncompatible_CombinedState; |
+ } |
+ |
+ bool usingVertexCoverage = a.hasCoverageVertexAttribute(); |
+ if (!usingVertexCoverage && a.fCoverage != b.fCoverage) { |
+ return kIncompatible_CombinedState; |
+ } |
+ |
+ bool explicitLocalCoords = a.hasLocalCoordAttribute(); |
+ for (int i = 0; i < a.fColorStages.count(); i++) { |
+ if (!GrEffectStage::AreCompatible(a.fColorStages[i], b.fColorStages[i], |
+ explicitLocalCoords)) { |
+ return kIncompatible_CombinedState; |
+ } |
+ } |
+ for (int i = 0; i < a.fCoverageStages.count(); i++) { |
+ if (!GrEffectStage::AreCompatible(a.fCoverageStages[i], b.fCoverageStages[i], |
+ explicitLocalCoords)) { |
+ return kIncompatible_CombinedState; |
+ } |
+ } |
+ SkASSERT(0 == memcmp(a.fFixedFunctionVertexAttribIndices, |
+ b.fFixedFunctionVertexAttribIndices, |
+ sizeof(a.fFixedFunctionVertexAttribIndices))); |
+ return kAOrB_CombinedState; |
+} |
+ |
+ |
+//////////////////////////////////////////////////////////////////////////////s |
+ |
+GrDrawState::GrDrawState(const GrDrawState& state, const SkMatrix& preConcatMatrix) { |
+ SkDEBUGCODE(fBlockEffectRemovalCnt = 0;) |
+ *this = state; |
+ if (!preConcatMatrix.isIdentity()) { |
+ for (int i = 0; i < fColorStages.count(); ++i) { |
+ fColorStages[i].localCoordChange(preConcatMatrix); |
+ } |
+ for (int i = 0; i < fCoverageStages.count(); ++i) { |
+ fCoverageStages[i].localCoordChange(preConcatMatrix); |
+ } |
+ this->invalidateBlendOptFlags(); |
+ } |
+} |
+ |
+GrDrawState& GrDrawState::operator=(const GrDrawState& that) { |
+ SkASSERT(0 == fBlockEffectRemovalCnt || 0 == this->numTotalStages()); |
+ this->setRenderTarget(that.fRenderTarget.get()); |
+ fColor = that.fColor; |
+ fViewMatrix = that.fViewMatrix; |
+ fSrcBlend = that.fSrcBlend; |
+ fDstBlend = that.fDstBlend; |
+ fBlendConstant = that.fBlendConstant; |
+ fFlagBits = that.fFlagBits; |
+ fVACount = that.fVACount; |
+ fVAPtr = that.fVAPtr; |
+ fStencilSettings = that.fStencilSettings; |
+ fCoverage = that.fCoverage; |
+ fDrawFace = that.fDrawFace; |
+ fColorStages = that.fColorStages; |
+ fCoverageStages = that.fCoverageStages; |
+ fOptSrcBlend = that.fOptSrcBlend; |
+ fOptDstBlend = that.fOptDstBlend; |
+ fBlendOptFlags = that.fBlendOptFlags; |
+ |
+ memcpy(fFixedFunctionVertexAttribIndices, |
+ that.fFixedFunctionVertexAttribIndices, |
+ sizeof(fFixedFunctionVertexAttribIndices)); |
+ return *this; |
+} |
+ |
+void GrDrawState::onReset(const SkMatrix* initialViewMatrix) { |
+ SkASSERT(0 == fBlockEffectRemovalCnt || 0 == this->numTotalStages()); |
+ fColorStages.reset(); |
+ fCoverageStages.reset(); |
+ |
+ fRenderTarget.reset(NULL); |
+ |
+ this->setDefaultVertexAttribs(); |
+ |
+ fColor = 0xffffffff; |
+ if (NULL == initialViewMatrix) { |
+ fViewMatrix.reset(); |
+ } else { |
+ fViewMatrix = *initialViewMatrix; |
+ } |
+ fSrcBlend = kOne_GrBlendCoeff; |
+ fDstBlend = kZero_GrBlendCoeff; |
+ fBlendConstant = 0x0; |
+ fFlagBits = 0x0; |
+ fStencilSettings.setDisabled(); |
+ fCoverage = 0xffffffff; |
+ fDrawFace = kBoth_DrawFace; |
+ |
+ this->invalidateBlendOptFlags(); |
+} |
+ |
bool GrDrawState::setIdentityViewMatrix() { |
if (fColorStages.count() || fCoverageStages.count()) { |
SkMatrix invVM; |
@@ -411,6 +529,40 @@ bool GrDrawState::canIgnoreColorAttribute() const { |
GrDrawState::kEmitCoverage_BlendOptFlag)); |
} |
+////////////////////////////////////////////////////////////////////////////// |
+ |
+GrDrawState::AutoVertexAttribRestore::AutoVertexAttribRestore( |
+ GrDrawState* drawState) { |
+ SkASSERT(NULL != drawState); |
+ fDrawState = drawState; |
+ fVAPtr = drawState->fVAPtr; |
+ fVACount = drawState->fVACount; |
+ fDrawState->setDefaultVertexAttribs(); |
+} |
+ |
+//////////////////////////////////////////////////////////////////////////////s |
+ |
+void GrDrawState::AutoRestoreEffects::set(GrDrawState* ds) { |
+ if (NULL != fDrawState) { |
+ int m = fDrawState->fColorStages.count() - fColorEffectCnt; |
+ SkASSERT(m >= 0); |
+ fDrawState->fColorStages.pop_back_n(m); |
+ |
+ int n = fDrawState->fCoverageStages.count() - fCoverageEffectCnt; |
+ SkASSERT(n >= 0); |
+ fDrawState->fCoverageStages.pop_back_n(n); |
+ if (m + n > 0) { |
+ fDrawState->invalidateBlendOptFlags(); |
+ } |
+ SkDEBUGCODE(--fDrawState->fBlockEffectRemovalCnt;) |
+ } |
+ fDrawState = ds; |
+ if (NULL != ds) { |
+ fColorEffectCnt = ds->fColorStages.count(); |
+ fCoverageEffectCnt = ds->fCoverageStages.count(); |
+ SkDEBUGCODE(++ds->fBlockEffectRemovalCnt;) |
+ } |
+} |
//////////////////////////////////////////////////////////////////////////////// |