/* * Copyright 2011 Google Inc. * * Use of this source code is governed by a BSD-style license that can be * found in the LICENSE file. */ #include "GrStencilBuffer.h" #include "GrContext.h" #include "GrGpu.h" void GrStencilBuffer::wasDetachedFromRenderTarget(const GrRenderTarget* rt) { GrAssert(fRTAttachmentCnt > 0); if (0 == --fRTAttachmentCnt) { this->unlockInCache(); // At this point we could be deleted! } } void GrStencilBuffer::transferToCacheAndLock() { GrAssert(NULL == fCacheEntry); 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); } } }