| Index: src/gpu/GrDrawState.cpp
|
| diff --git a/src/gpu/GrDrawState.cpp b/src/gpu/GrDrawState.cpp
|
| index a6b3d68238cdc18a20f527c9f7a3dccd5b05b8c9..0c966a824d282914047c09278cf9a7d51e3c6a07 100644
|
| --- a/src/gpu/GrDrawState.cpp
|
| +++ b/src/gpu/GrDrawState.cpp
|
| @@ -6,8 +6,22 @@
|
| */
|
|
|
| #include "GrDrawState.h"
|
| -#include "GrPaint.h"
|
| +
|
| #include "GrDrawTargetCaps.h"
|
| +#include "GrOptDrawState.h"
|
| +#include "GrPaint.h"
|
| +
|
| +//////////////////////////////////////////////////////////////////////////////s
|
| +
|
| +GrOptDrawState* GrDrawState::createOptState() const {
|
| + if (NULL == fCachedOptState) {
|
| + fCachedOptState = SkNEW_ARGS(GrOptDrawState, (*this));
|
| + } else {
|
| + SkASSERT(GrOptDrawState(*this) == *fCachedOptState);
|
| + }
|
| + fCachedOptState->ref();
|
| + return fCachedOptState;
|
| +}
|
|
|
| //////////////////////////////////////////////////////////////////////////////s
|
|
|
| @@ -50,7 +64,8 @@ GrDrawState::CombinedState GrDrawState::CombineIfPossible(
|
|
|
| //////////////////////////////////////////////////////////////////////////////s
|
|
|
| -GrDrawState::GrDrawState(const GrDrawState& state, const SkMatrix& preConcatMatrix) {
|
| +GrDrawState::GrDrawState(const GrDrawState& state, const SkMatrix& preConcatMatrix)
|
| + : fCachedOptState(NULL) {
|
| SkDEBUGCODE(fBlockEffectRemovalCnt = 0;)
|
| *this = state;
|
| if (!preConcatMatrix.isIdentity()) {
|
| @@ -60,7 +75,7 @@ GrDrawState::GrDrawState(const GrDrawState& state, const SkMatrix& preConcatMatr
|
| for (int i = 0; i < this->numCoverageStages(); ++i) {
|
| fCoverageStages[i].localCoordChange(preConcatMatrix);
|
| }
|
| - this->invalidateBlendOptFlags();
|
| + this->invalidateOptState();
|
| }
|
| }
|
|
|
| @@ -87,6 +102,8 @@ GrDrawState& GrDrawState::operator=(const GrDrawState& that) {
|
|
|
| fHints = that.fHints;
|
|
|
| + SkRefCnt_SafeAssign(fCachedOptState, that.fCachedOptState);
|
| +
|
| memcpy(fFixedFunctionVertexAttribIndices,
|
| that.fFixedFunctionVertexAttribIndices,
|
| sizeof(fFixedFunctionVertexAttribIndices));
|
| @@ -118,7 +135,7 @@ void GrDrawState::onReset(const SkMatrix* initialViewMatrix) {
|
|
|
| fHints = 0;
|
|
|
| - this->invalidateBlendOptFlags();
|
| + this->invalidateOptState();
|
| }
|
|
|
| bool GrDrawState::setIdentityViewMatrix() {
|
| @@ -173,7 +190,7 @@ void GrDrawState::setFromPaint(const GrPaint& paint, const SkMatrix& vm, GrRende
|
|
|
| this->setBlendFunc(paint.getSrcBlendCoeff(), paint.getDstBlendCoeff());
|
| this->setCoverage(paint.getCoverage());
|
| - this->invalidateBlendOptFlags();
|
| + this->invalidateOptState();
|
| }
|
|
|
| ////////////////////////////////////////////////////////////////////////////////
|
| @@ -231,7 +248,7 @@ void GrDrawState::setVertexAttribs(const GrVertexAttrib* attribs, int count) {
|
| overlapCheck |= (mask << offsetShift);
|
| #endif
|
| }
|
| - this->invalidateBlendOptFlags();
|
| + this->invalidateOptState();
|
| // Positions must be specified.
|
| SkASSERT(-1 != fFixedFunctionVertexAttribIndices[kPosition_GrVertexAttribBinding]);
|
| }
|
| @@ -251,7 +268,7 @@ void GrDrawState::setDefaultVertexAttribs() {
|
| 0xff,
|
| sizeof(fFixedFunctionVertexAttribIndices));
|
| fFixedFunctionVertexAttribIndices[kPosition_GrVertexAttribBinding] = 0;
|
| - this->invalidateBlendOptFlags();
|
| + this->invalidateOptState();
|
| }
|
|
|
| ////////////////////////////////////////////////////////////////////////////////
|
| @@ -273,8 +290,7 @@ bool GrDrawState::couldApplyCoverage(const GrDrawTargetCaps& caps) const {
|
|
|
| //////////////////////////////////////////////////////////////////////////////
|
|
|
| -GrDrawState::AutoVertexAttribRestore::AutoVertexAttribRestore(
|
| - GrDrawState* drawState) {
|
| +GrDrawState::AutoVertexAttribRestore::AutoVertexAttribRestore(GrDrawState* drawState) {
|
| SkASSERT(NULL != drawState);
|
| fDrawState = drawState;
|
| fVAPtr = drawState->fVAPtr;
|
| @@ -294,7 +310,7 @@ void GrDrawState::AutoRestoreEffects::set(GrDrawState* ds) {
|
| SkASSERT(n >= 0);
|
| fDrawState->fCoverageStages.pop_back_n(n);
|
| if (m + n > 0) {
|
| - fDrawState->invalidateBlendOptFlags();
|
| + fDrawState->invalidateOptState();
|
| }
|
| SkDEBUGCODE(--fDrawState->fBlockEffectRemovalCnt;)
|
| }
|
| @@ -435,6 +451,7 @@ void GrDrawState::AutoViewMatrixRestore::restore() {
|
| for (int s = 0; s < numCoverageStages; ++s, ++i) {
|
| fDrawState->fCoverageStages[s].restoreCoordChange(fSavedCoordChanges[i]);
|
| }
|
| + fDrawState->invalidateOptState();
|
| fDrawState = NULL;
|
| }
|
| }
|
| @@ -454,6 +471,7 @@ void GrDrawState::AutoViewMatrixRestore::set(GrDrawState* drawState,
|
|
|
| this->doEffectCoordChanges(preconcatMatrix);
|
| SkDEBUGCODE(++fDrawState->fBlockEffectRemovalCnt;)
|
| + drawState->invalidateOptState();
|
| }
|
|
|
| bool GrDrawState::AutoViewMatrixRestore::setIdentity(GrDrawState* drawState) {
|
| @@ -467,6 +485,7 @@ bool GrDrawState::AutoViewMatrixRestore::setIdentity(GrDrawState* drawState) {
|
| return true;
|
| }
|
|
|
| + drawState->invalidateOptState();
|
| fViewMatrix = drawState->getViewMatrix();
|
| if (0 == drawState->numTotalStages()) {
|
| drawState->fViewMatrix.reset();
|
|
|