Give GrClipMaskManager a GrGpu*
Review URL: http://codereview.appspot.com/6301090/



git-svn-id: http://skia.googlecode.com/svn/trunk@4269 2bbb7eff-a529-9590-31e7-b0007b416f81
diff --git a/src/gpu/GrClipMaskManager.cpp b/src/gpu/GrClipMaskManager.cpp
index 1cb9dc4..ee1bcae 100644
--- a/src/gpu/GrClipMaskManager.cpp
+++ b/src/gpu/GrClipMaskManager.cpp
@@ -61,10 +61,10 @@
 }
 
 bool path_needs_SW_renderer(GrContext* context,
-                           GrGpu* gpu,
-                           const SkPath& path,
-                           GrPathFill fill,
-                           bool doAA) {
+                            GrGpu* gpu,
+                            const SkPath& path,
+                            GrPathFill fill,
+                            bool doAA) {
     // last (false) parameter disallows use of the SW path renderer
     return NULL == context->getPathRenderer(path, fill, gpu, doAA, false);
 }
@@ -76,7 +76,7 @@
  * will be used on any element. If so, it returns true to indicate that the
  * entire clip should be rendered in SW and then uploaded en masse to the gpu.
  */
-bool GrClipMaskManager::useSWOnlyPath(GrGpu* gpu, const GrClip& clipIn) {
+bool GrClipMaskManager::useSWOnlyPath(const GrClip& clipIn) {
 
     if (!clipIn.requiresAA()) {
         // The stencil buffer can handle this case
@@ -99,7 +99,7 @@
         // rects can always be drawn directly w/o using the software path
         // so only paths need to be checked
         if (kPath_ClipType == clipIn.getElementType(i) &&
-            path_needs_SW_renderer(this->getContext(), gpu, 
+            path_needs_SW_renderer(this->getContext(), fGpu, 
                                     clipIn.getPath(i), 
                                     clipIn.getPathFill(i), 
                                     clipIn.getDoAA(i))) {
@@ -113,8 +113,7 @@
 ////////////////////////////////////////////////////////////////////////////////
 // sort out what kind of clip mask needs to be created: alpha, stencil,
 // scissor, or entirely software
-bool GrClipMaskManager::createClipMask(GrGpu* gpu, 
-                                       const GrClip& clipIn,
+bool GrClipMaskManager::createClipMask(const GrClip& clipIn,
                                        ScissoringSettings* scissorSettings) {
 
     GrAssert(scissorSettings);
@@ -123,7 +122,7 @@
     fClipMaskInStencil = false;
     fClipMaskInAlpha = false;
 
-    GrDrawState* drawState = gpu->drawState();
+    GrDrawState* drawState = fGpu->drawState();
     if (!drawState->isClipState()) {
         return true;
     }
@@ -143,10 +142,10 @@
         // efficient to create it entirely in software
         GrTexture* result = NULL;
         GrIRect bound;
-        if (this->createSoftwareClipMask(gpu, clipIn, &result, &bound)) {
+        if (this->createSoftwareClipMask(fGpu, clipIn, &result, &bound)) {
             fClipMaskInAlpha = true;
 
-            setup_drawstate_aaclip(gpu, result, bound);
+            setup_drawstate_aaclip(fGpu, result, bound);
             return true;
         }
 
@@ -165,10 +164,10 @@
         // path does (see scissorSettings below)
         GrTexture* result = NULL;
         GrIRect bound;
-        if (this->createAlphaClipMask(gpu, clipIn, &result, &bound)) {
+        if (this->createAlphaClipMask(fGpu, clipIn, &result, &bound)) {
             fClipMaskInAlpha = true;
 
-            setup_drawstate_aaclip(gpu, result, bound);
+            setup_drawstate_aaclip(fGpu, result, bound);
             return true;
         }
 
@@ -213,7 +212,7 @@
                          !bounds.isEmpty();
 
     if (fClipMaskInStencil) {
-        return this->createStencilClipMask(gpu, clipIn, bounds, scissorSettings);
+        return this->createStencilClipMask(clipIn, bounds, scissorSettings);
     }
 
     return true;
@@ -386,25 +385,24 @@
 }
 
 ////////////////////////////////////////////////////////////////////////////////
-bool GrClipMaskManager::drawClipShape(GrGpu* gpu,
-                                      GrTexture* target,
+bool GrClipMaskManager::drawClipShape(GrTexture* target,
                                       const GrClip& clipIn,
                                       int index) {
-    GrDrawState* drawState = gpu->drawState();
+    GrDrawState* drawState = fGpu->drawState();
     GrAssert(NULL != drawState);
 
     drawState->setRenderTarget(target->asRenderTarget());
 
     if (kRect_ClipType == clipIn.getElementType(index)) {
         if (clipIn.getDoAA(index)) {
-            getContext()->getAARectRenderer()->fillAARect(gpu, gpu,
+            getContext()->getAARectRenderer()->fillAARect(fGpu, fGpu,
                                                           clipIn.getRect(index), 
                                                           true);
         } else {
-            gpu->drawSimpleRect(clipIn.getRect(index), NULL, 0);
+            fGpu->drawSimpleRect(clipIn.getRect(index), NULL, 0);
         }
     } else {
-        return draw_path(this->getContext(), gpu,
+        return draw_path(this->getContext(), fGpu,
                          clipIn.getPath(index),
                          clipIn.getPathFill(index),
                          clipIn.getDoAA(index));
@@ -412,10 +410,9 @@
     return true;
 }
 
-void GrClipMaskManager::drawTexture(GrGpu* gpu,
-                                    GrTexture* target,
+void GrClipMaskManager::drawTexture(GrTexture* target,
                                     GrTexture* texture) {
-    GrDrawState* drawState = gpu->drawState();
+    GrDrawState* drawState = fGpu->drawState();
     GrAssert(NULL != drawState);
 
     // no AA here since it is encoded in the texture
@@ -432,7 +429,7 @@
     GrRect rect = GrRect::MakeWH(SkIntToScalar(target->width()), 
                                  SkIntToScalar(target->height()));
 
-    gpu->drawSimpleRect(rect, NULL, 1 << 0);
+    fGpu->drawSimpleRect(rect, NULL, 1 << 0);
 
     drawState->setTexture(0, NULL);
 }
@@ -491,11 +488,10 @@
 // Handles caching, determination of clip mask bound & allocation (if needed)
 // of the result texture
 // Returns true if there is no more work to be done (i.e., we got a cache hit)
-bool GrClipMaskManager::clipMaskPreamble(GrGpu* gpu,
-                                         const GrClip& clipIn,
+bool GrClipMaskManager::clipMaskPreamble(const GrClip& clipIn,
                                          GrTexture** result,
                                          GrIRect *resultBounds) {
-    GrDrawState* origDrawState = gpu->drawState();
+    GrDrawState* origDrawState = fGpu->drawState();
     GrAssert(origDrawState->isClipState());
 
     GrRenderTarget* rt = origDrawState->getRenderTarget();
@@ -546,12 +542,11 @@
 
 ////////////////////////////////////////////////////////////////////////////////
 // Create a 8-bit clip mask in alpha
-bool GrClipMaskManager::createAlphaClipMask(GrGpu* gpu,
-                                            const GrClip& clipIn,
+bool GrClipMaskManager::createAlphaClipMask(const GrClip& clipIn,
                                             GrTexture** result,
                                             GrIRect *resultBounds) {
 
-    if (this->clipMaskPreamble(gpu, clipIn, result, resultBounds)) {
+    if (this->clipMaskPreamble(clipIn, result, resultBounds)) {
         return true;
     }
 
@@ -562,10 +557,10 @@
         return false;
     }
 
-    GrDrawTarget::AutoStateRestore asr(gpu, GrDrawTarget::kReset_ASRInit);
-    GrDrawState* drawState = gpu->drawState();
+    GrDrawTarget::AutoStateRestore asr(fGpu, GrDrawTarget::kReset_ASRInit);
+    GrDrawState* drawState = fGpu->drawState();
 
-    GrDrawTarget::AutoGeometryPush agp(gpu);
+    GrDrawTarget::AutoGeometryPush agp(fGpu);
 
     int count = clipIn.getElementCount();
 
@@ -587,7 +582,7 @@
                                               &clearToInside,
                                               &startOp);
 
-    clear(gpu, accum, clearToInside ? 0xffffffff : 0x00000000);
+    clear(fGpu, accum, clearToInside ? 0xffffffff : 0x00000000);
 
     GrAutoScratchTexture temp;
 
@@ -602,10 +597,10 @@
             // replace ops and alter GrClip to allow them through
 
             // clear the accumulator and draw the new object directly into it
-            clear(gpu, accum, 0x00000000);
+            clear(fGpu, accum, 0x00000000);
 
             setup_boolean_blendcoeffs(drawState, op);
-            this->drawClipShape(gpu, accum, clipIn, c);
+            this->drawClipShape(accum, clipIn, c);
 
         } else if (SkRegion::kReverseDifference_Op == op ||
                    SkRegion::kIntersect_Op == op) {
@@ -624,10 +619,10 @@
             }
 
             // clear the temp target & draw into it
-            clear(gpu, temp.texture(), 0x00000000);
+            clear(fGpu, temp.texture(), 0x00000000);
 
             setup_boolean_blendcoeffs(drawState, SkRegion::kReplace_Op);
-            this->drawClipShape(gpu, temp.texture(), clipIn, c);
+            this->drawClipShape(temp.texture(), clipIn, c);
 
             // TODO: rather than adding these two translations here
             // compute the bounding box needed to render the texture
@@ -644,7 +639,7 @@
             // Now draw into the accumulator using the real operation
             // and the temp buffer as a texture
             setup_boolean_blendcoeffs(drawState, op);
-            this->drawTexture(gpu, accum, temp.texture());
+            this->drawTexture(accum, temp.texture());
 
             if (0 != resultBounds->fTop || 0 != resultBounds->fLeft) {
                 GrMatrix m;
@@ -659,7 +654,7 @@
             // all the remaining ops can just be directly draw into 
             // the accumulation buffer
             setup_boolean_blendcoeffs(drawState, op);
-            this->drawClipShape(gpu, accum, clipIn, c);
+            this->drawClipShape(accum, clipIn, c);
         }
     }
 
@@ -670,14 +665,13 @@
 
 ////////////////////////////////////////////////////////////////////////////////
 // Create a 1-bit clip mask in the stencil buffer
-bool GrClipMaskManager::createStencilClipMask(GrGpu* gpu, 
-                                              const GrClip& clipIn,
+bool GrClipMaskManager::createStencilClipMask(const GrClip& clipIn,
                                               const GrRect& bounds,
                                               ScissoringSettings* scissorSettings) {
 
     GrAssert(fClipMaskInStencil);
 
-    GrDrawState* drawState = gpu->drawState();
+    GrDrawState* drawState = fGpu->drawState();
     GrAssert(drawState->isClipState());
 
     GrRenderTarget* rt = drawState->getRenderTarget();
@@ -698,14 +692,14 @@
         // we just stashed on the SB to render from. We set it back after
         // we finish drawing it into the stencil.
         const GrClip& clipCopy = stencilBuffer->getLastClip();
-        gpu->setClip(GrClip(bounds));
+        fGpu->setClip(GrClip(bounds));
 
-        GrDrawTarget::AutoStateRestore asr(gpu, GrDrawTarget::kReset_ASRInit);
-        drawState = gpu->drawState();
+        GrDrawTarget::AutoStateRestore asr(fGpu, GrDrawTarget::kReset_ASRInit);
+        drawState = fGpu->drawState();
         drawState->setRenderTarget(rt);
-        GrDrawTarget::AutoGeometryPush agp(gpu);
+        GrDrawTarget::AutoGeometryPush agp(fGpu);
 
-        gpu->disableScissor();
+        fGpu->disableScissor();
 #if !VISUALIZE_COMPLEX_CLIP
         drawState->enableState(GrDrawState::kNoColorWrites_StateBit);
 #endif
@@ -725,7 +719,7 @@
                                                     &clearToInside,
                                                     &startOp);
 
-        gpu->clearStencilClip(scissorSettings->fScissorRect, clearToInside);
+        fGpu->clearStencilClip(scissorSettings->fScissorRect, clearToInside);
 
         // walk through each clip element and perform its set op
         // with the existing clip.
@@ -761,15 +755,15 @@
                 fill = GrNonInvertedFill(fill);
                 clipPath = &clipCopy.getPath(c);
                 pr = this->getContext()->getPathRenderer(*clipPath,
-                                                         fill, gpu, false,
+                                                         fill, fGpu, false,
                                                          true);
                 if (NULL == pr) {
                     fClipMaskInStencil = false;
-                    gpu->setClip(clipCopy);     // restore to the original
+                    fGpu->setClip(clipCopy);     // restore to the original
                     return false;
                 }
                 canRenderDirectToStencil =
-                    !pr->requiresStencilPass(*clipPath, fill, gpu);
+                    !pr->requiresStencilPass(*clipPath, fill, fGpu);
             }
 
             int passes;
@@ -798,13 +792,13 @@
                 SET_RANDOM_COLOR
                 if (kRect_ClipType == clipCopy.getElementType(c)) {
                     *drawState->stencil() = gDrawToStencil;
-                    gpu->drawSimpleRect(clipCopy.getRect(c), NULL, 0);
+                    fGpu->drawSimpleRect(clipCopy.getRect(c), NULL, 0);
                 } else {
                     if (canRenderDirectToStencil) {
                         *drawState->stencil() = gDrawToStencil;
-                        pr->drawPath(*clipPath, fill, NULL, gpu, 0, false);
+                        pr->drawPath(*clipPath, fill, NULL, fGpu, 0, false);
                     } else {
-                        pr->drawPathToStencil(*clipPath, fill, gpu);
+                        pr->drawPathToStencil(*clipPath, fill, fGpu);
                     }
                 }
             }
@@ -817,19 +811,19 @@
                 if (canDrawDirectToClip) {
                     if (kRect_ClipType == clipCopy.getElementType(c)) {
                         SET_RANDOM_COLOR
-                        gpu->drawSimpleRect(clipCopy.getRect(c), NULL, 0);
+                        fGpu->drawSimpleRect(clipCopy.getRect(c), NULL, 0);
                     } else {
                         SET_RANDOM_COLOR
-                        pr->drawPath(*clipPath, fill, NULL, gpu, 0, false);
+                        pr->drawPath(*clipPath, fill, NULL, fGpu, 0, false);
                     }
                 } else {
                     SET_RANDOM_COLOR
-                    gpu->drawSimpleRect(bounds, NULL, 0);
+                    fGpu->drawSimpleRect(bounds, NULL, 0);
                 }
             }
         }
         // restore clip
-        gpu->setClip(clipCopy);
+        fGpu->setClip(clipCopy);
         // recusive draws would have disabled this since they drew with
         // the clip bounds as clip.
         fClipMaskInStencil = true;
@@ -953,12 +947,11 @@
 
 }
 
-bool GrClipMaskManager::createSoftwareClipMask(GrGpu* gpu,
-                                               const GrClip& clipIn,
+bool GrClipMaskManager::createSoftwareClipMask(const GrClip& clipIn,
                                                GrTexture** result,
                                                GrIRect *resultBounds) {
 
-    if (this->clipMaskPreamble(gpu, clipIn, result, resultBounds)) {
+    if (this->clipMaskPreamble(clipIn, result, resultBounds)) {
         return true;
     }
 
@@ -1053,10 +1046,10 @@
 
     // TODO: need a simpler way to clear the texture - can we combine
     // the clear and the writePixels (inside toTexture)
-    GrDrawState* drawState = gpu->drawState();
+    GrDrawState* drawState = fGpu->drawState();
     GrAssert(NULL != drawState);
     GrRenderTarget* temp = drawState->getRenderTarget();
-    clear(gpu, accum, 0x00000000);
+    clear(fGpu, accum, 0x00000000);
     // can't leave the accum bound as a rendertarget
     drawState->setRenderTarget(temp);
 
diff --git a/src/gpu/GrClipMaskManager.h b/src/gpu/GrClipMaskManager.h
index 1acdba5..2e46c08 100644
--- a/src/gpu/GrClipMaskManager.h
+++ b/src/gpu/GrClipMaskManager.h
@@ -283,13 +283,13 @@
  */
 class GrClipMaskManager : public GrNoncopyable {
 public:
-    GrClipMaskManager()
-        : fClipMaskInStencil(false)
+    GrClipMaskManager(GrGpu* gpu)
+        : fGpu(gpu)
+        , fClipMaskInStencil(false)
         , fClipMaskInAlpha(false) {
     }
 
-    bool createClipMask(GrGpu* gpu, 
-                        const GrClip& clip, 
+    bool createClipMask(const GrClip& clip, 
                         ScissoringSettings* scissorSettings);
 
     void releaseResources();
@@ -349,36 +349,31 @@
                                       unsigned int* writeMask);
 
 private:
+    GrGpu* fGpu;
     bool fClipMaskInStencil;        // is the clip mask in the stencil buffer?
     bool fClipMaskInAlpha;          // is the clip mask in an alpha texture?
     GrClipMaskCache fAACache;       // cache for the AA path
 
-    bool createStencilClipMask(GrGpu* gpu, 
-                               const GrClip& clip, 
+    bool createStencilClipMask(const GrClip& clip, 
                                const GrRect& bounds,
                                ScissoringSettings* scissorSettings);
-    bool createAlphaClipMask(GrGpu* gpu,
-                             const GrClip& clipIn,
+    bool createAlphaClipMask(const GrClip& clipIn,
                              GrTexture** result,
                              GrIRect *resultBounds);
-    bool createSoftwareClipMask(GrGpu* gpu,
-                                const GrClip& clipIn,
+    bool createSoftwareClipMask(const GrClip& clipIn,
                                 GrTexture** result,
                                 GrIRect *resultBounds);
-    bool clipMaskPreamble(GrGpu* gpu,
-                          const GrClip& clipIn,
+    bool clipMaskPreamble(const GrClip& clipIn,
                           GrTexture** result,
                           GrIRect *resultBounds);
 
-    bool useSWOnlyPath(GrGpu* gpu, const GrClip& clipIn);
+    bool useSWOnlyPath(const GrClip& clipIn);
 
-    bool drawClipShape(GrGpu* gpu,
-                       GrTexture* target,
+    bool drawClipShape(GrTexture* target,
                        const GrClip& clipIn,
                        int index);
 
-    void drawTexture(GrGpu* gpu,
-                     GrTexture* target,
+    void drawTexture(GrTexture* target,
                      GrTexture* texture);
 
     void getTemp(const GrIRect& bounds, GrAutoScratchTexture* temp);
diff --git a/src/gpu/GrGpu.cpp b/src/gpu/GrGpu.cpp
index 7765d24..c8c983c 100644
--- a/src/gpu/GrGpu.cpp
+++ b/src/gpu/GrGpu.cpp
@@ -30,7 +30,8 @@
 #define DEBUG_INVAL_START_IDX -1
 
 GrGpu::GrGpu()
-    : fContext(NULL)
+    : fClipMaskManager(this)
+    , fContext(NULL)
     , fResetTimestamp(kExpiredTimestamp+1)
     , fVertexPool(NULL)
     , fIndexPool(NULL)
@@ -368,7 +369,7 @@
 
     ScissoringSettings scissoringSettings;
 
-    if (!fClipMaskManager.createClipMask(this, fClip, &scissoringSettings)) {
+    if (!fClipMaskManager.createClipMask(fClip, &scissoringSettings)) {
         return false;
     }