| Index: src/gpu/GrDrawTarget.h
 | 
| diff --git a/src/gpu/GrDrawTarget.h b/src/gpu/GrDrawTarget.h
 | 
| index 63d637803f02b6f6a5f493a09d74a5f94f4c7698..cae1552a3df2ac5b0acd26d18f54abdc39bd3905 100644
 | 
| --- a/src/gpu/GrDrawTarget.h
 | 
| +++ b/src/gpu/GrDrawTarget.h
 | 
| @@ -37,7 +37,7 @@ class GrDrawBatch;
 | 
|  class GrDrawPathBatchBase;
 | 
|  class GrPathRangeDraw;
 | 
|  
 | 
| -class GrDrawTarget : public SkRefCnt {
 | 
| +class GrDrawTarget final : public SkRefCnt {
 | 
|  public:
 | 
|      // The context may not be fully constructed and should not be used during GrDrawTarget
 | 
|      // construction.
 | 
| @@ -59,7 +59,7 @@ public:
 | 
|      /**
 | 
|       * Gets the capabilities of the draw target.
 | 
|       */
 | 
| -    const GrCaps* caps() const { return fCaps; }
 | 
| +    const GrCaps* caps() const { return fGpu->caps(); }
 | 
|  
 | 
|      void drawBatch(const GrPipelineBuilder&, GrDrawBatch*);
 | 
|  
 | 
| @@ -172,20 +172,35 @@ public:
 | 
|      /**
 | 
|       * Release any resources that are cached but not currently in use. This
 | 
|       * is intended to give an application some recourse when resources are low.
 | 
| +     * TODO: Stop holding on to resources.
 | 
|       */
 | 
| -    virtual void purgeResources() {};
 | 
| +    virtual void purgeResources() {
 | 
| +        // The clip mask manager can rebuild all its clip masks so just get rid of them all.
 | 
| +        fClipMaskManager->purgeResources();
 | 
| +    };
 | 
|  
 | 
|      bool programUnitTest(GrContext* owner, int maxStages);
 | 
|  
 | 
| -protected:
 | 
| -    GrGpu* getGpu() { return fGpu; }
 | 
| -    const GrGpu* getGpu() const { return fGpu; }
 | 
| +    /** Provides access to internal functions to GrClipMaskManager without friending all of
 | 
| +        GrDrawTarget to CMM. */
 | 
| +    class CMMAccess {
 | 
| +    public:
 | 
| +        CMMAccess(GrDrawTarget* drawTarget) : fDrawTarget(drawTarget) {}
 | 
| +    private:
 | 
| +        void clearStencilClip(const SkIRect& rect, bool insideClip, GrRenderTarget* rt) const {
 | 
| +            fDrawTarget->clearStencilClip(rect, insideClip, rt);
 | 
| +        }
 | 
|  
 | 
| -    void recordBatch(GrBatch*);
 | 
| +        GrContext* context() const { return fDrawTarget->fContext; }
 | 
| +        GrResourceProvider* resourceProvider() const { return fDrawTarget->fResourceProvider; }
 | 
| +        GrDrawTarget* fDrawTarget;
 | 
| +        friend class GrClipMaskManager;
 | 
| +    };
 | 
|  
 | 
| -private:
 | 
| -    SkSTArray<256, SkAutoTUnref<GrBatch>, true> fBatches;
 | 
| +    const CMMAccess cmmAccess() { return CMMAccess(this); }
 | 
|  
 | 
| +private:
 | 
| +    void recordBatch(GrBatch*);
 | 
|      bool installPipelineInDrawBatch(const GrPipelineBuilder* pipelineBuilder,
 | 
|                                      const GrScissorState* scissor,
 | 
|                                      GrDrawBatch* batch);
 | 
| @@ -205,63 +220,25 @@ private:
 | 
|      void getPathStencilSettingsForFilltype(GrPathRendering::FillType,
 | 
|                                             const GrStencilAttachment*,
 | 
|                                             GrStencilSettings*);
 | 
| -    virtual GrClipMaskManager* clipMaskManager() = 0;
 | 
| -    virtual bool setupClip(const GrPipelineBuilder&,
 | 
| +    bool setupClip(const GrPipelineBuilder&,
 | 
|                             GrPipelineBuilder::AutoRestoreFragmentProcessorState*,
 | 
|                             GrPipelineBuilder::AutoRestoreStencil*,
 | 
|                             GrScissorState*,
 | 
| -                           const SkRect* devBounds) = 0;
 | 
| +                           const SkRect* devBounds);
 | 
|  
 | 
| -    GrGpu*                  fGpu;
 | 
| -    const GrCaps*           fCaps;
 | 
| -    GrResourceProvider*     fResourceProvider;
 | 
| -    bool                    fFlushing;
 | 
| -    GrBatchToken            fLastFlushToken;
 | 
| -
 | 
| -    typedef SkRefCnt INHERITED;
 | 
| -};
 | 
| -
 | 
| -/*
 | 
| - * This class is JUST for clip mask manager.  Everyone else should just use draw target above.
 | 
| - */
 | 
| -class GrClipTarget : public GrDrawTarget {
 | 
| -public:
 | 
| -    GrClipTarget(GrContext*);
 | 
| -
 | 
| -    /* Clip mask manager needs access to the context.
 | 
| -     * TODO we only need a very small subset of context in the CMM.
 | 
| -     */
 | 
| -    GrContext* getContext() { return fContext; }
 | 
| -    const GrContext* getContext() const { return fContext; }
 | 
| -
 | 
| -    /**
 | 
| -     * Clip Mask Manager(and no one else) needs to clear private stencil bits.
 | 
| -     * ClipTarget subclass sets clip bit in the stencil buffer. The subclass
 | 
| -     * is free to clear the remaining bits to zero if masked clears are more
 | 
| -     * expensive than clearing all bits.
 | 
| -     */
 | 
| +    // Used only by CMM.
 | 
|      void clearStencilClip(const SkIRect&, bool insideClip, GrRenderTarget*);
 | 
|  
 | 
| -    /**
 | 
| -     * Release any resources that are cached but not currently in use. This
 | 
| -     * is intended to give an application some recourse when resources are low.
 | 
| -     */
 | 
| -    void purgeResources() override;
 | 
| -
 | 
| -protected:
 | 
| -    SkAutoTDelete<GrClipMaskManager> fClipMaskManager;
 | 
| -    GrContext*                       fContext;
 | 
| -
 | 
| -private:
 | 
| -    GrClipMaskManager* clipMaskManager() override { return fClipMaskManager; }
 | 
| -
 | 
| -    bool setupClip(const GrPipelineBuilder&,
 | 
| -                   GrPipelineBuilder::AutoRestoreFragmentProcessorState*,
 | 
| -                   GrPipelineBuilder::AutoRestoreStencil*,
 | 
| -                   GrScissorState* scissorState,
 | 
| -                   const SkRect* devBounds) override;
 | 
| +    SkSTArray<256, SkAutoTUnref<GrBatch>, true> fBatches;
 | 
| +    SkAutoTDelete<GrClipMaskManager>            fClipMaskManager;
 | 
| +    // The context is only in service of the clip mask manager, remove once CMM doesn't need this.
 | 
| +    GrContext*                                  fContext;
 | 
| +    GrGpu*                                      fGpu;
 | 
| +    GrResourceProvider*                         fResourceProvider;
 | 
| +    bool                                        fFlushing;
 | 
| +    GrBatchToken                                fLastFlushToken;
 | 
|  
 | 
| -    typedef GrDrawTarget INHERITED;
 | 
| +    typedef SkRefCnt INHERITED;
 | 
|  };
 | 
|  
 | 
|  #endif
 | 
| 
 |