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 GrStencilAttachment_DEFINED
     11 #define GrStencilAttachment_DEFINED
     12 
     13 #include "GrClip.h"
     14 #include "GrGpuResource.h"
     15 
     16 class GrRenderTarget;
     17 class GrResourceKey;
     18 
     19 class GrStencilAttachment : public GrGpuResource {
     20 public:
     21     SK_DECLARE_INST_COUNT(GrStencilAttachment);
     22 
     23     virtual ~GrStencilAttachment() {
     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     // We create a unique stencil buffer at each width, height and sampleCnt and share it for
     51     // all render targets that require a stencil with those params.
     52     static void ComputeSharedStencilAttachmentKey(int width, int height, int sampleCnt,
     53                                                   GrUniqueKey* key);
     54 
     55 protected:
     56     GrStencilAttachment(GrGpu* gpu, LifeCycle lifeCycle, int width, int height, int bits,
     57                         int sampleCnt)
     58         : GrGpuResource(gpu, lifeCycle)
     59         , fWidth(width)
     60         , fHeight(height)
     61         , fBits(bits)
     62         , fSampleCnt(sampleCnt)
     63         , fLastClipStackGenID(SkClipStack::kInvalidGenID) {
     64         fLastClipStackRect.setEmpty();
     65     }
     66 
     67 private:
     68 
     69     int fWidth;
     70     int fHeight;
     71     int fBits;
     72     int fSampleCnt;
     73 
     74     int32_t     fLastClipStackGenID;
     75     SkIRect     fLastClipStackRect;
     76     SkIPoint    fLastClipSpaceOffset;
     77 
     78     typedef GrGpuResource INHERITED;
     79 };
     80 
     81 #endif
     82