aboutsummaryrefslogtreecommitdiffhomepage
path: root/gpu/src/GrStencilBuffer.cpp
diff options
context:
space:
mode:
authorGravatar bsalomon@google.com <bsalomon@google.com@2bbb7eff-a529-9590-31e7-b0007b416f81>2011-08-09 17:57:12 +0000
committerGravatar bsalomon@google.com <bsalomon@google.com@2bbb7eff-a529-9590-31e7-b0007b416f81>2011-08-09 17:57:12 +0000
commiteefe6f1eef1b5cd394853a3f31a92c3c8db62c45 (patch)
tree17e367f930ffbf3c3d259c25279ab12b5aaff4ed /gpu/src/GrStencilBuffer.cpp
parent8ccadddfa78adbdbbdfa724247318436465a7378 (diff)
Fix crash in GrStencilBuffer when it tries to unlock itself but has lost its GrGpu ptr.
Review URL: http://codereview.appspot.com/4810088/ git-svn-id: http://skia.googlecode.com/svn/trunk@2084 2bbb7eff-a529-9590-31e7-b0007b416f81
Diffstat (limited to 'gpu/src/GrStencilBuffer.cpp')
-rw-r--r--gpu/src/GrStencilBuffer.cpp33
1 files changed, 31 insertions, 2 deletions
diff --git a/gpu/src/GrStencilBuffer.cpp b/gpu/src/GrStencilBuffer.cpp
index d004612d14..4b08e238ef 100644
--- a/gpu/src/GrStencilBuffer.cpp
+++ b/gpu/src/GrStencilBuffer.cpp
@@ -13,8 +13,8 @@
void GrStencilBuffer::wasDetachedFromRenderTarget(const GrRenderTarget* rt) {
GrAssert(fRTAttachmentCnt > 0);
- if (0 == --fRTAttachmentCnt && NULL != fCacheEntry) {
- this->getGpu()->getContext()->unlockStencilBuffer(fCacheEntry);
+ if (0 == --fRTAttachmentCnt) {
+ this->unlockInCache();
// At this point we could be deleted!
}
}
@@ -24,3 +24,32 @@ void GrStencilBuffer::transferToCacheAndLock() {
fCacheEntry =
this->getGpu()->getContext()->addAndLockStencilBuffer(this);
}
+
+void GrStencilBuffer::onRelease() {
+ // When the GrGpu rips through its list of resources and releases
+ // them it may release an SB before it releases its attached RTs.
+ // In that case when GrStencilBuffer sees its last detach it no
+ // long has a gpu ptr (gets nulled in GrResource::release()) and can't
+ // access the cache to unlock itself. So if we're being released and still
+ // have attachments go ahead and unlock now.
+ if (fRTAttachmentCnt) {
+ this->unlockInCache();
+ // we shouldn't be deleted here because some RT still has a ref on us.
+ }
+ fCacheEntry = NULL;
+}
+
+void GrStencilBuffer::onAbandon() {
+ // we can use the same behavior as release.
+ this->onRelease();
+}
+
+void GrStencilBuffer::unlockInCache() {
+ if (NULL != fCacheEntry) {
+ GrGpu* gpu = this->getGpu();
+ if (NULL != gpu) {
+ GrAssert(NULL != gpu->getContext());
+ gpu->getContext()->unlockStencilBuffer(fCacheEntry);
+ }
+ }
+}