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