Index: src/gpu/GrDrawState.h |
diff --git a/src/gpu/GrDrawState.h b/src/gpu/GrDrawState.h |
index 90bdc64507dc544356d9cb2d8860f1fe8142a953..6ed04eded99f287551e9625f2b2f798ff7518506 100644 |
--- a/src/gpu/GrDrawState.h |
+++ b/src/gpu/GrDrawState.h |
@@ -49,19 +49,7 @@ public: |
/** |
* Copies another draw state with a preconcat to the view matrix. |
**/ |
- 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(const GrDrawState& state, const SkMatrix& preConcatMatrix); |
virtual ~GrDrawState() { SkASSERT(0 == fBlockEffectRemovalCnt); } |
@@ -151,17 +139,9 @@ public: |
*/ |
class AutoVertexAttribRestore { |
public: |
- AutoVertexAttribRestore(GrDrawState* drawState) { |
- SkASSERT(NULL != drawState); |
- fDrawState = drawState; |
- fVAPtr = drawState->fVAPtr; |
- fVACount = drawState->fVACount; |
- fDrawState->setDefaultVertexAttribs(); |
- } |
- |
- ~AutoVertexAttribRestore(){ |
- fDrawState->setVertexAttribs(fVAPtr, fVACount); |
- } |
+ AutoVertexAttribRestore(GrDrawState* drawState); |
+ |
+ ~AutoVertexAttribRestore() { fDrawState->setVertexAttribs(fVAPtr, fVACount); } |
private: |
GrDrawState* fDrawState; |
@@ -169,64 +149,6 @@ public: |
int fVACount; |
}; |
- /** |
- * Accessing positions, local coords, or colors, of a vertex within an array is a hassle |
- * involving casts and simple math. These helpers exist to keep GrDrawTarget clients' code a bit |
- * nicer looking. |
- */ |
- |
- /** |
- * Gets a pointer to a GrPoint of a vertex's position or texture |
- * coordinate. |
- * @param vertices the vertex array |
- * @param vertexIndex the index of the vertex in the array |
- * @param vertexSize the size of each vertex in the array |
- * @param offset the offset in bytes of the vertex component. |
- * Defaults to zero (corresponding to vertex position) |
- * @return pointer to the vertex component as a GrPoint |
- */ |
- static SkPoint* GetVertexPoint(void* vertices, |
- int vertexIndex, |
- int vertexSize, |
- int offset = 0) { |
- intptr_t start = GrTCast<intptr_t>(vertices); |
- return GrTCast<SkPoint*>(start + offset + |
- vertexIndex * vertexSize); |
- } |
- static const SkPoint* GetVertexPoint(const void* vertices, |
- int vertexIndex, |
- int vertexSize, |
- int offset = 0) { |
- intptr_t start = GrTCast<intptr_t>(vertices); |
- return GrTCast<const SkPoint*>(start + offset + |
- vertexIndex * vertexSize); |
- } |
- |
- /** |
- * Gets a pointer to a GrColor inside a vertex within a vertex array. |
- * @param vertices the vetex array |
- * @param vertexIndex the index of the vertex in the array |
- * @param vertexSize the size of each vertex in the array |
- * @param offset the offset in bytes of the vertex color |
- * @return pointer to the vertex component as a GrColor |
- */ |
- static GrColor* GetVertexColor(void* vertices, |
- int vertexIndex, |
- int vertexSize, |
- int offset) { |
- intptr_t start = GrTCast<intptr_t>(vertices); |
- return GrTCast<GrColor*>(start + offset + |
- vertexIndex * vertexSize); |
- } |
- static const GrColor* GetVertexColor(const void* vertices, |
- int vertexIndex, |
- int vertexSize, |
- int offset) { |
- const intptr_t start = GrTCast<intptr_t>(vertices); |
- return GrTCast<const GrColor*>(start + offset + |
- vertexIndex * vertexSize); |
- } |
- |
/// @} |
/** |
@@ -364,27 +286,7 @@ public: |
~AutoRestoreEffects() { this->set(NULL); } |
- void 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;) |
- } |
- } |
+ void set(GrDrawState* ds); |
bool isSet() const { return NULL != fDrawState; } |
@@ -860,104 +762,13 @@ public: |
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) { |
- 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; |
- } |
+ static CombinedState CombineIfPossible(const GrDrawState& a, const GrDrawState& b); |
- 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; |
- } |
- |
- 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; |
- } |
+ GrDrawState& operator= (const GrDrawState& that); |
private: |
- void 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(); |
- } |
+ void onReset(const SkMatrix* initialViewMatrix); |
BlendOptFlags calcBlendOpts(bool forceCoverage = false, |
GrBlendCoeff* srcCoeff = NULL, |