diff options
Diffstat (limited to 'src/gpu')
-rw-r--r-- | src/gpu/GrDrawState.cpp | 14 | ||||
-rw-r--r-- | src/gpu/GrDrawState.h | 6 | ||||
-rw-r--r-- | src/gpu/GrProgramElement.cpp | 9 |
3 files changed, 19 insertions, 10 deletions
diff --git a/src/gpu/GrDrawState.cpp b/src/gpu/GrDrawState.cpp index 6acc202065..f2028eaf94 100644 --- a/src/gpu/GrDrawState.cpp +++ b/src/gpu/GrDrawState.cpp @@ -300,12 +300,12 @@ GrDrawState::AutoVertexAttribRestore::AutoVertexAttribRestore( void GrDrawState::AutoRestoreEffects::set(GrDrawState* ds) { if (NULL != fDrawState) { // See the big comment on the class definition about GPs. - if (NULL != fOriginalGP) { - SkASSERT(fDrawState->getGeometryProcessor()->getEffect() == fOriginalGP); - fOriginalGP->unref(); - fOriginalGP = NULL; - } else { + if (SK_InvalidUniqueID == fOriginalGPID) { fDrawState->fGeometryProcessor.reset(NULL); + } else { + SkASSERT(fDrawState->getGeometryProcessor()->getEffect()->getUniqueID() == + fOriginalGPID); + fOriginalGPID = SK_InvalidUniqueID; } int m = fDrawState->numColorStages() - fColorEffectCnt; @@ -322,9 +322,9 @@ void GrDrawState::AutoRestoreEffects::set(GrDrawState* ds) { } fDrawState = ds; if (NULL != ds) { - SkASSERT(NULL == fOriginalGP); + SkASSERT(SK_InvalidUniqueID == fOriginalGPID); if (NULL != ds->getGeometryProcessor()) { - fOriginalGP = SkRef(ds->getGeometryProcessor()->getEffect()); + fOriginalGPID = ds->getGeometryProcessor()->getEffect()->getUniqueID(); } fColorEffectCnt = ds->numColorStages(); fCoverageEffectCnt = ds->numCoverageStages(); diff --git a/src/gpu/GrDrawState.h b/src/gpu/GrDrawState.h index 7b5f150f4c..6223f5388b 100644 --- a/src/gpu/GrDrawState.h +++ b/src/gpu/GrDrawState.h @@ -256,13 +256,13 @@ public: public: AutoRestoreEffects() : fDrawState(NULL) - , fOriginalGP(NULL) + , fOriginalGPID(SK_InvalidUniqueID) , fColorEffectCnt(0) , fCoverageEffectCnt(0) {} AutoRestoreEffects(GrDrawState* ds) : fDrawState(NULL) - , fOriginalGP(NULL) + , fOriginalGPID(SK_InvalidUniqueID) , fColorEffectCnt(0) , fCoverageEffectCnt(0) { this->set(ds); @@ -276,7 +276,7 @@ public: private: GrDrawState* fDrawState; - const GrEffect* fOriginalGP; + uint32_t fOriginalGPID; int fColorEffectCnt; int fCoverageEffectCnt; }; diff --git a/src/gpu/GrProgramElement.cpp b/src/gpu/GrProgramElement.cpp index 70d5339e90..20a957f7c7 100644 --- a/src/gpu/GrProgramElement.cpp +++ b/src/gpu/GrProgramElement.cpp @@ -8,6 +8,15 @@ #include "GrProgramElement.h" #include "GrProgramResource.h" +uint32_t GrProgramElement::CreateUniqueID() { + static int32_t gUniqueID = SK_InvalidUniqueID; + uint32_t id; + do { + id = static_cast<uint32_t>(sk_atomic_inc(&gUniqueID) + 1); + } while (id == SK_InvalidUniqueID); + return id; +} + void GrProgramElement::convertRefToPendingExecution() const { // This function makes it so that all the GrProgramResources own a single ref to their // underlying GrGpuResource if there are any refs to the GrProgramElement and a single |