Home | History | Annotate | Download | only in gpu
      1 
      2 /*
      3  * Copyright 2011 Google Inc.
      4  *
      5  * Use of this source code is governed by a BSD-style license that can be
      6  * found in the LICENSE file.
      7  */
      8 
      9 
     10 #ifndef GrStencilBuffer_DEFINED
     11 #define GrStencilBuffer_DEFINED
     12 
     13 #include "GrClipData.h"
     14 #include "GrGpuObject.h"
     15 
     16 class GrRenderTarget;
     17 class GrResourceKey;
     18 
     19 class GrStencilBuffer : public GrGpuObject {
     20 public:
     21     SK_DECLARE_INST_COUNT(GrStencilBuffer);
     22 
     23     virtual ~GrStencilBuffer() {
     24         // TODO: allow SB to be purged and detach itself from rts
     25     }
     26 
     27     int width() const { return fWidth; }
     28     int height() const { return fHeight; }
     29     int bits() const { return fBits; }
     30     int numSamples() const { return fSampleCnt; }
     31 
     32     // called to note the last clip drawn to this buffer.
     33     void setLastClip(int32_t clipStackGenID,
     34                      const SkIRect& clipSpaceRect,
     35                      const SkIPoint clipSpaceToStencilOffset) {
     36         fLastClipStackGenID = clipStackGenID;
     37         fLastClipStackRect = clipSpaceRect;
     38         fLastClipSpaceOffset = clipSpaceToStencilOffset;
     39     }
     40 
     41     // called to determine if we have to render the clip into SB.
     42     bool mustRenderClip(int32_t clipStackGenID,
     43                         const SkIRect& clipSpaceRect,
     44                         const SkIPoint clipSpaceToStencilOffset) const {
     45         return fLastClipStackGenID != clipStackGenID ||
     46                fLastClipSpaceOffset != clipSpaceToStencilOffset ||
     47                !fLastClipStackRect.contains(clipSpaceRect);
     48     }
     49 
     50     // Places the sb in the cache. The cache takes a ref of the stencil buffer.
     51     void transferToCache();
     52 
     53     static GrResourceKey ComputeKey(int width, int height, int sampleCnt);
     54 
     55 protected:
     56     GrStencilBuffer(GrGpu* gpu, bool isWrapped, int width, int height, int bits, int sampleCnt)
     57         : GrGpuObject(gpu, isWrapped)
     58         , fWidth(width)
     59         , fHeight(height)
     60         , fBits(bits)
     61         , fSampleCnt(sampleCnt)
     62         , fLastClipStackGenID(SkClipStack::kInvalidGenID) {
     63         fLastClipStackRect.setEmpty();
     64     }
     65 
     66 private:
     67 
     68     int fWidth;
     69     int fHeight;
     70     int fBits;
     71     int fSampleCnt;
     72 
     73     int32_t     fLastClipStackGenID;
     74     SkIRect     fLastClipStackRect;
     75     SkIPoint    fLastClipSpaceOffset;
     76 
     77     typedef GrGpuObject INHERITED;
     78 };
     79 
     80 #endif
     81