13f30e3a41fc16816105e28e0d4c241eff6d391b4bsalomon@google.com
23f30e3a41fc16816105e28e0d4c241eff6d391b4bsalomon@google.com/*
33f30e3a41fc16816105e28e0d4c241eff6d391b4bsalomon@google.com * Copyright 2011 Google Inc.
43f30e3a41fc16816105e28e0d4c241eff6d391b4bsalomon@google.com *
53f30e3a41fc16816105e28e0d4c241eff6d391b4bsalomon@google.com * Use of this source code is governed by a BSD-style license that can be
63f30e3a41fc16816105e28e0d4c241eff6d391b4bsalomon@google.com * found in the LICENSE file.
73f30e3a41fc16816105e28e0d4c241eff6d391b4bsalomon@google.com */
83f30e3a41fc16816105e28e0d4c241eff6d391b4bsalomon@google.com
93f30e3a41fc16816105e28e0d4c241eff6d391b4bsalomon@google.com
103f30e3a41fc16816105e28e0d4c241eff6d391b4bsalomon@google.com#ifndef GrStencilBuffer_DEFINED
113f30e3a41fc16816105e28e0d4c241eff6d391b4bsalomon@google.com#define GrStencilBuffer_DEFINED
123f30e3a41fc16816105e28e0d4c241eff6d391b4bsalomon@google.com
13d5519f11df6d8b43201cb479d455ce6ff53a2ef1robertphillips@google.com#include "GrClipData.h"
143f30e3a41fc16816105e28e0d4c241eff6d391b4bsalomon@google.com#include "GrResource.h"
153f30e3a41fc16816105e28e0d4c241eff6d391b4bsalomon@google.com
163f30e3a41fc16816105e28e0d4c241eff6d391b4bsalomon@google.comclass GrRenderTarget;
173f30e3a41fc16816105e28e0d4c241eff6d391b4bsalomon@google.comclass GrResourceEntry;
1808e41f3f301dfbbe911c67cd773dba7de0478068robertphillips@google.comclass GrResourceKey;
193f30e3a41fc16816105e28e0d4c241eff6d391b4bsalomon@google.com
203f30e3a41fc16816105e28e0d4c241eff6d391b4bsalomon@google.comclass GrStencilBuffer : public GrResource {
213f30e3a41fc16816105e28e0d4c241eff6d391b4bsalomon@google.compublic:
226a644b9c3d212d240ff1d16b4c98e4517184118crobertphillips@google.com    SK_DECLARE_INST_COUNT(GrStencilBuffer);
2308e41f3f301dfbbe911c67cd773dba7de0478068robertphillips@google.com
243f30e3a41fc16816105e28e0d4c241eff6d391b4bsalomon@google.com    virtual ~GrStencilBuffer() {
253f30e3a41fc16816105e28e0d4c241eff6d391b4bsalomon@google.com        // TODO: allow SB to be purged and detach itself from rts
263f30e3a41fc16816105e28e0d4c241eff6d391b4bsalomon@google.com    }
273f30e3a41fc16816105e28e0d4c241eff6d391b4bsalomon@google.com
283f30e3a41fc16816105e28e0d4c241eff6d391b4bsalomon@google.com    int width() const { return fWidth; }
293f30e3a41fc16816105e28e0d4c241eff6d391b4bsalomon@google.com    int height() const { return fHeight; }
303f30e3a41fc16816105e28e0d4c241eff6d391b4bsalomon@google.com    int bits() const { return fBits; }
313f30e3a41fc16816105e28e0d4c241eff6d391b4bsalomon@google.com    int numSamples() const { return fSampleCnt; }
323f30e3a41fc16816105e28e0d4c241eff6d391b4bsalomon@google.com
333f30e3a41fc16816105e28e0d4c241eff6d391b4bsalomon@google.com    // called to note the last clip drawn to this buffer.
34e6aa2fce1b318c69ecf03324d19f93168e86feb6bsalomon@google.com    void setLastClip(int32_t clipStackGenID,
35e6aa2fce1b318c69ecf03324d19f93168e86feb6bsalomon@google.com                     const SkIRect& clipSpaceRect,
36e6aa2fce1b318c69ecf03324d19f93168e86feb6bsalomon@google.com                     const SkIPoint clipSpaceToStencilOffset) {
37e6aa2fce1b318c69ecf03324d19f93168e86feb6bsalomon@google.com        fLastClipStackGenID = clipStackGenID;
38e6aa2fce1b318c69ecf03324d19f93168e86feb6bsalomon@google.com        fLastClipStackRect = clipSpaceRect;
39e6aa2fce1b318c69ecf03324d19f93168e86feb6bsalomon@google.com        fLastClipSpaceOffset = clipSpaceToStencilOffset;
403f30e3a41fc16816105e28e0d4c241eff6d391b4bsalomon@google.com    }
413f30e3a41fc16816105e28e0d4c241eff6d391b4bsalomon@google.com
423f30e3a41fc16816105e28e0d4c241eff6d391b4bsalomon@google.com    // called to determine if we have to render the clip into SB.
43e6aa2fce1b318c69ecf03324d19f93168e86feb6bsalomon@google.com    bool mustRenderClip(int32_t clipStackGenID,
44e6aa2fce1b318c69ecf03324d19f93168e86feb6bsalomon@google.com                        const SkIRect& clipSpaceRect,
45e6aa2fce1b318c69ecf03324d19f93168e86feb6bsalomon@google.com                        const SkIPoint clipSpaceToStencilOffset) const {
46e6aa2fce1b318c69ecf03324d19f93168e86feb6bsalomon@google.com        return SkClipStack::kInvalidGenID == clipStackGenID ||
47e6aa2fce1b318c69ecf03324d19f93168e86feb6bsalomon@google.com               fLastClipStackGenID != clipStackGenID ||
48e6aa2fce1b318c69ecf03324d19f93168e86feb6bsalomon@google.com               fLastClipSpaceOffset != clipSpaceToStencilOffset ||
49e6aa2fce1b318c69ecf03324d19f93168e86feb6bsalomon@google.com               !fLastClipStackRect.contains(clipSpaceRect);
503f30e3a41fc16816105e28e0d4c241eff6d391b4bsalomon@google.com    }
513f30e3a41fc16816105e28e0d4c241eff6d391b4bsalomon@google.com
529addc0ab3020b8d09fae95afe618bb084c1ee7d6robertphillips@google.com    // Places the sb in the cache. The cache takes a ref of the stencil buffer.
539addc0ab3020b8d09fae95afe618bb084c1ee7d6robertphillips@google.com    void transferToCache();
543f30e3a41fc16816105e28e0d4c241eff6d391b4bsalomon@google.com
5508e41f3f301dfbbe911c67cd773dba7de0478068robertphillips@google.com    static GrResourceKey ComputeKey(int width, int height, int sampleCnt);
5608e41f3f301dfbbe911c67cd773dba7de0478068robertphillips@google.com
573f30e3a41fc16816105e28e0d4c241eff6d391b4bsalomon@google.comprotected:
5855dcfe8e57a379c114d711fb5e7fc740d837e76bbsalomon@google.com    GrStencilBuffer(GrGpu* gpu, bool isWrapped, int width, int height, int bits, int sampleCnt)
5955dcfe8e57a379c114d711fb5e7fc740d837e76bbsalomon@google.com        : GrResource(gpu, isWrapped)
603f30e3a41fc16816105e28e0d4c241eff6d391b4bsalomon@google.com        , fWidth(width)
613f30e3a41fc16816105e28e0d4c241eff6d391b4bsalomon@google.com        , fHeight(height)
623f30e3a41fc16816105e28e0d4c241eff6d391b4bsalomon@google.com        , fBits(bits)
633f30e3a41fc16816105e28e0d4c241eff6d391b4bsalomon@google.com        , fSampleCnt(sampleCnt)
64e6aa2fce1b318c69ecf03324d19f93168e86feb6bsalomon@google.com        , fLastClipStackGenID(SkClipStack::kInvalidGenID) {
65e6aa2fce1b318c69ecf03324d19f93168e86feb6bsalomon@google.com        fLastClipStackRect.setEmpty();
663f30e3a41fc16816105e28e0d4c241eff6d391b4bsalomon@google.com    }
673f30e3a41fc16816105e28e0d4c241eff6d391b4bsalomon@google.com
683f30e3a41fc16816105e28e0d4c241eff6d391b4bsalomon@google.comprivate:
693f30e3a41fc16816105e28e0d4c241eff6d391b4bsalomon@google.com
703f30e3a41fc16816105e28e0d4c241eff6d391b4bsalomon@google.com    int fWidth;
713f30e3a41fc16816105e28e0d4c241eff6d391b4bsalomon@google.com    int fHeight;
723f30e3a41fc16816105e28e0d4c241eff6d391b4bsalomon@google.com    int fBits;
733f30e3a41fc16816105e28e0d4c241eff6d391b4bsalomon@google.com    int fSampleCnt;
743f30e3a41fc16816105e28e0d4c241eff6d391b4bsalomon@google.com
75e6aa2fce1b318c69ecf03324d19f93168e86feb6bsalomon@google.com    int32_t     fLastClipStackGenID;
76e6aa2fce1b318c69ecf03324d19f93168e86feb6bsalomon@google.com    SkIRect     fLastClipStackRect;
77e6aa2fce1b318c69ecf03324d19f93168e86feb6bsalomon@google.com    SkIPoint    fLastClipSpaceOffset;
783f30e3a41fc16816105e28e0d4c241eff6d391b4bsalomon@google.com
793f30e3a41fc16816105e28e0d4c241eff6d391b4bsalomon@google.com    typedef GrResource INHERITED;
803f30e3a41fc16816105e28e0d4c241eff6d391b4bsalomon@google.com};
813f30e3a41fc16816105e28e0d4c241eff6d391b4bsalomon@google.com
823f30e3a41fc16816105e28e0d4c241eff6d391b4bsalomon@google.com#endif
83