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 "GrGpuResource.h"
15
16class GrRenderTarget;
17class GrResourceKey;
18
19class GrStencilBuffer : public GrGpuResource {
20public:
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
55protected:
56    GrStencilBuffer(GrGpu* gpu, bool isWrapped, int width, int height, int bits, int sampleCnt)
57        : GrGpuResource(gpu, isWrapped)
58        , fWidth(width)
59        , fHeight(height)
60        , fBits(bits)
61        , fSampleCnt(sampleCnt)
62        , fLastClipStackGenID(SkClipStack::kInvalidGenID) {
63        fLastClipStackRect.setEmpty();
64    }
65
66private:
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 GrGpuResource INHERITED;
78};
79
80#endif
81