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 #include "GrStencilBuffer.h" 10 11 #include "GrContext.h" 12 #include "GrGpu.h" 13 wasDetachedFromRenderTarget(const GrRenderTarget * rt)14void GrStencilBuffer::wasDetachedFromRenderTarget(const GrRenderTarget* rt) { 15 GrAssert(fRTAttachmentCnt > 0); 16 if (0 == --fRTAttachmentCnt) { 17 this->unlockInCache(); 18 // At this point we could be deleted! 19 } 20 } 21 transferToCacheAndLock()22void GrStencilBuffer::transferToCacheAndLock() { 23 GrAssert(NULL == fCacheEntry); 24 fCacheEntry = 25 this->getGpu()->getContext()->addAndLockStencilBuffer(this); 26 } 27 onRelease()28void GrStencilBuffer::onRelease() { 29 // When the GrGpu rips through its list of resources and releases 30 // them it may release an SB before it releases its attached RTs. 31 // In that case when GrStencilBuffer sees its last detach it no 32 // long has a gpu ptr (gets nulled in GrResource::release()) and can't 33 // access the cache to unlock itself. So if we're being released and still 34 // have attachments go ahead and unlock now. 35 if (fRTAttachmentCnt) { 36 this->unlockInCache(); 37 // we shouldn't be deleted here because some RT still has a ref on us. 38 } 39 fCacheEntry = NULL; 40 } 41 onAbandon()42void GrStencilBuffer::onAbandon() { 43 // we can use the same behavior as release. 44 this->onRelease(); 45 } 46 unlockInCache()47void GrStencilBuffer::unlockInCache() { 48 if (NULL != fCacheEntry) { 49 GrGpu* gpu = this->getGpu(); 50 if (NULL != gpu) { 51 GrAssert(NULL != gpu->getContext()); 52 gpu->getContext()->unlockStencilBuffer(fCacheEntry); 53 } 54 } 55 } 56