blob: 5249ce8466ed65a476f1fb58b3aa28a06cb8e7b5 [file] [log] [blame]
/*
* Copyright 2011 Google Inc.
*
* Use of this source code is governed by a BSD-style license that can be
* found in the LICENSE file.
*/
#ifndef GrStencilBuffer_DEFINED
#define GrStencilBuffer_DEFINED
#include "GrClip.h"
#include "GrResource.h"
class GrRenderTarget;
class GrResourceEntry;
class GrStencilBuffer : public GrResource {
public:
virtual ~GrStencilBuffer() {
// currently each rt that has attached this sb keeps a ref
// TODO: allow SB to be purged and detach itself from rts
GrAssert(0 == fRTAttachmentCnt);
}
int width() const { return fWidth; }
int height() const { return fHeight; }
int bits() const { return fBits; }
int numSamples() const { return fSampleCnt; }
// called to note the last clip drawn to this buffer.
void setLastClip(const GrClip& clip, int width, int height) {
fLastClip = clip;
fLastClipWidth = width;
fLastClipHeight = height;
GrAssert(width <= fWidth);
GrAssert(height <= fHeight);
}
// called to determine if we have to render the clip into SB.
bool mustRenderClip(const GrClip& clip, int width, int height) const {
// The clip is in device space. That is it doesn't scale to fit a
// smaller RT. It is just truncated on the right / bottom edges.
// Note that this assumes that the viewport origin never moves within
// the stencil buffer. This is valid today.
return width > fLastClipWidth ||
height > fLastClipHeight ||
clip != fLastClip;
}
const GrClip& getLastClip() const {
return fLastClip;
}
// places the sb in the cache and locks it. Caller transfers
// a ref to the the cache which will unref when purged.
void transferToCacheAndLock();
void wasAttachedToRenderTarget(const GrRenderTarget* rt) {
++fRTAttachmentCnt;
}
void wasDetachedFromRenderTarget(const GrRenderTarget* rt);
protected:
GrStencilBuffer(GrGpu* gpu, int width, int height, int bits, int sampleCnt)
: GrResource(gpu)
, fWidth(width)
, fHeight(height)
, fBits(bits)
, fSampleCnt(sampleCnt)
, fLastClip()
, fLastClipWidth(-1)
, fLastClipHeight(-1)
, fCacheEntry(NULL)
, fRTAttachmentCnt(0) {
}
// GrResource overrides
// subclass override must call INHERITED::onRelease
virtual void onRelease();
// subclass override must call INHERITED::onAbandon
virtual void onAbandon();
private:
void unlockInCache();
int fWidth;
int fHeight;
int fBits;
int fSampleCnt;
GrClip fLastClip;
int fLastClipWidth;
int fLastClipHeight;
GrResourceEntry* fCacheEntry;
int fRTAttachmentCnt;
typedef GrResource INHERITED;
};
#endif