Extend texture release on GrDrawState to also handle custom stages.
authortomhudson@google.com <tomhudson@google.com@2bbb7eff-a529-9590-31e7-b0007b416f81>
Fri, 22 Jun 2012 20:10:50 +0000 (20:10 +0000)
committertomhudson@google.com <tomhudson@google.com@2bbb7eff-a529-9590-31e7-b0007b416f81>
Fri, 22 Jun 2012 20:10:50 +0000 (20:10 +0000)
Add asserts to GrContext::setPaint() to make sure we're keeping things
cleaned up.
Remove double-call of setPaint() during text context initialization.

http://codereview.appspot.com/6324046/

git-svn-id: http://skia.googlecode.com/svn/trunk@4313 2bbb7eff-a529-9590-31e7-b0007b416f81

src/gpu/GrBatchedTextContext.cpp
src/gpu/GrBatchedTextContext.h
src/gpu/GrContext.cpp
src/gpu/GrDefaultTextContext.cpp
src/gpu/GrDrawState.h

index 9de2bad..666d894 100644 (file)
@@ -26,7 +26,7 @@ void GrBatchedTextContext::init(GrContext* context,
                                 const GrMatrix* extMatrix) {
     this->INHERITED::init(context, grPaint, extMatrix);
     fGrPaint = grPaint;
-    fDrawTarget = fContext->getTextTarget(fGrPaint);
+    fDrawTarget = NULL;
 
     fMaxVertices = 0;
     fCurrTexture = NULL;
@@ -34,6 +34,10 @@ void GrBatchedTextContext::init(GrContext* context,
 }
 
 void GrBatchedTextContext::finish() {
+    GrAssert(fDrawTarget);
+    if (fDrawTarget) {
+        fDrawTarget->drawState()->disableStages();
+    }
     fDrawTarget = NULL;
 
     this->INHERITED::finish();
@@ -41,6 +45,7 @@ void GrBatchedTextContext::finish() {
 
 void GrBatchedTextContext::reset() {
     GrAssert(this->isValid());
+    GrAssert(fDrawTarget);
     fDrawTarget->resetVertexSource();
     fMaxVertices = 0;
     fCurrVertex = 0;
@@ -61,6 +66,7 @@ void GrBatchedTextContext::prepareForGlyph(GrTexture* texture) {
 void GrBatchedTextContext::setupVertexBuff(void** vertexBuff,
                                            GrVertexLayout vertexLayout) {
     GrAssert(this->isValid());
+    GrAssert(fDrawTarget);
     if (NULL == *vertexBuff) {
         // If we need to reserve vertices allow the draw target to suggest
         // a number of verts to reserve and whether to perform a flush.
index c0a136b..e1f4736 100644 (file)
@@ -38,6 +38,8 @@ protected:
     };
 
     GrPaint         fGrPaint;
+
+    /** fDrawTarget is not set by init() - MUST be set by subclasses! */
     GrDrawTarget*   fDrawTarget;
 
     int32_t     fMaxVertices;
index c426405..61f37ff 100644 (file)
@@ -784,7 +784,7 @@ void GrContext::drawRect(const GrPaint& paint,
     SK_TRACE_EVENT0("GrContext::drawRect");
 
     GrDrawTarget* target = this->prepareToDraw(paint, kUnbuffered_DrawCategory);
-    GrDrawState::AutoTextureRelease atr(fDrawState);
+    GrDrawState::AutoStageDisable atr(fDrawState);
     int stageMask = paint.getActiveStageMask();
 
     GrRect devRect = rect;
@@ -904,7 +904,7 @@ void GrContext::drawRectToRect(const GrPaint& paint,
 
 #if GR_STATIC_RECT_VB
     GrDrawTarget* target = this->prepareToDraw(paint, kUnbuffered_DrawCategory);
-    GrDrawState::AutoTextureRelease atr(fDrawState);
+    GrDrawState::AutoStageDisable atr(fDrawState);
     GrDrawState* drawState = target->drawState();
     GrVertexLayout layout = PaintStageVertexLayoutBits(paint, NULL);
     GrDrawState::AutoViewMatrixRestore avmr(drawState);
@@ -949,7 +949,7 @@ void GrContext::drawRectToRect(const GrPaint& paint,
 #else
     target = this->prepareToDraw(paint, kUnbuffered_DrawCategory);
 #endif
-    GrDrawState::AutoTextureRelease atr(fDrawState);
+    GrDrawState::AutoStageDisable atr(fDrawState);
 
     const GrRect* srcRects[GrDrawState::kNumStages] = {NULL};
     const GrMatrix* srcMatrices[GrDrawState::kNumStages] = {NULL};
@@ -973,7 +973,7 @@ void GrContext::drawVertices(const GrPaint& paint,
     GrDrawTarget::AutoReleaseGeometry geo;
 
     GrDrawTarget* target = this->prepareToDraw(paint, kUnbuffered_DrawCategory);
-    GrDrawState::AutoTextureRelease atr(fDrawState);
+    GrDrawState::AutoStageDisable atr(fDrawState);
 
     bool hasTexCoords[GrPaint::kTotalStages] = {
         NULL != texCoords,   // texCoordSrc provides explicit stage 0 coords
@@ -1078,7 +1078,7 @@ void GrContext::drawOval(const GrPaint& paint,
     DrawCategory category = (DEFER_PATHS) ? kBuffered_DrawCategory :
                                             kUnbuffered_DrawCategory;
     GrDrawTarget* target = this->prepareToDraw(paint, category);
-    GrDrawState::AutoTextureRelease atr(fDrawState);
+    GrDrawState::AutoStageDisable atr(fDrawState);
     GrDrawState* drawState = target->drawState();
     GrMatrix vm = drawState->getViewMatrix();
 
@@ -1187,7 +1187,7 @@ void GrContext::internalDrawPath(const GrPaint& paint, const SkPath& path,
     DrawCategory category = (DEFER_PATHS) ? kBuffered_DrawCategory :
                                             kUnbuffered_DrawCategory;
     GrDrawTarget* target = this->prepareToDraw(paint, category);
-    GrDrawState::AutoTextureRelease atr(fDrawState);
+    GrDrawState::AutoStageDisable atr(fDrawState);
     GrDrawState::StageMask stageMask = paint.getActiveStageMask();
 
     bool prAA = paint.fAntiAlias && !this->getRenderTarget()->isMultisampled();
@@ -1588,6 +1588,7 @@ void GrContext::internalWriteRenderTargetPixels(GrRenderTarget* target,
 ////////////////////////////////////////////////////////////////////////////////
 
 void GrContext::setPaint(const GrPaint& paint) {
+    GrAssert(fDrawState->stagesDisabled());
 
     for (int i = 0; i < GrPaint::kMaxTextures; ++i) {
         int s = i + GrPaint::kFirstTextureStage;
index 21cb990..c6f34e2 100644 (file)
@@ -131,8 +131,6 @@ void GrDefaultTextContext::init(GrContext* context,
         }
     }
 
-    // this has been already done in the baseclass, but we need to repeat
-    // due to new matrix
     fDrawTarget = fContext->getTextTarget(fGrPaint);
 
     fVertices = NULL;
index 5feccb5..acfca8c 100644 (file)
@@ -74,16 +74,18 @@ public:
     }
 
     virtual ~GrDrawState() {
-        this->releaseTextures();
+        this->disableStages();
         GrSafeSetNull(fRenderTarget);
     }
 
     /**
-     * Resets to the default state. Sampler states will not be modified.
+     * Resets to the default state.
+     * Sampler states *will* be modified: textures or CustomStage objects
+     * will be released.
      */ 
     void reset() {
 
-        this->releaseTextures();
+        this->disableStages();
         GrSafeSetNull(fRenderTarget);
 
         // make sure any pad is zero for memcmp
@@ -213,21 +215,32 @@ public:
         return fTextures[stage];
     }
 
+    bool stagesDisabled() {
+        for (int i = 0; i < kNumStages; ++i) {
+            if (NULL != fTextures[i] ||
+                NULL != fSamplerStates[i].getCustomStage()) {
+                return false;
+            }
+            return true;
+        }
+    }
     /**
-     * Release all the textures referred to by this draw state
+     * Release all the textures and custom stages referred to by this
+     * draw state.
      */
-    void releaseTextures() {
+    void disableStages() {
         for (int i = 0; i < kNumStages; ++i) {
             GrSafeSetNull(fTextures[i]);
+            fSamplerStates[i].setCustomStage(NULL);
         }
     }
 
-    class AutoTextureRelease : public ::GrNoncopyable {
+    class AutoStageDisable : public ::GrNoncopyable {
     public:
-        AutoTextureRelease(GrDrawState* ds) : fDrawState(ds) {}
-        ~AutoTextureRelease() {
+        AutoStageDisable(GrDrawState* ds) : fDrawState(ds) {}
+        ~AutoStageDisable() {
             if (NULL != fDrawState) {
-                fDrawState->releaseTextures();
+                fDrawState->disableStages();
             }
         }
     private: