11cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger 21cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger/* 31cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger * Copyright 2011 Google Inc. 41cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger * 51cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger * Use of this source code is governed by a BSD-style license that can be 61cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger * found in the LICENSE file. 71cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger */ 81cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger 91cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger#include "GrStencilBuffer.h" 101cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger 111cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger#include "GrContext.h" 121cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger#include "GrGpu.h" 131cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger 141cab2921ab279367f8206cdadc9259d12e603548Derek Sollenbergervoid GrStencilBuffer::wasDetachedFromRenderTarget(const GrRenderTarget* rt) { 151cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger GrAssert(fRTAttachmentCnt > 0); 161cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger if (0 == --fRTAttachmentCnt) { 171cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger this->unlockInCache(); 181cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger // At this point we could be deleted! 191cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger } 201cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger} 211cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger 221cab2921ab279367f8206cdadc9259d12e603548Derek Sollenbergervoid GrStencilBuffer::transferToCacheAndLock() { 231cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger GrAssert(NULL == fCacheEntry); 241cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger fCacheEntry = 251cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger this->getGpu()->getContext()->addAndLockStencilBuffer(this); 261cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger} 271cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger 281cab2921ab279367f8206cdadc9259d12e603548Derek Sollenbergervoid GrStencilBuffer::onRelease() { 291cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger // When the GrGpu rips through its list of resources and releases 301cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger // them it may release an SB before it releases its attached RTs. 311cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger // In that case when GrStencilBuffer sees its last detach it no 321cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger // long has a gpu ptr (gets nulled in GrResource::release()) and can't 331cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger // access the cache to unlock itself. So if we're being released and still 341cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger // have attachments go ahead and unlock now. 351cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger if (fRTAttachmentCnt) { 361cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger this->unlockInCache(); 371cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger // we shouldn't be deleted here because some RT still has a ref on us. 381cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger } 391cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger fCacheEntry = NULL; 401cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger} 411cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger 421cab2921ab279367f8206cdadc9259d12e603548Derek Sollenbergervoid GrStencilBuffer::onAbandon() { 431cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger // we can use the same behavior as release. 441cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger this->onRelease(); 451cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger} 461cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger 471cab2921ab279367f8206cdadc9259d12e603548Derek Sollenbergervoid GrStencilBuffer::unlockInCache() { 481cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger if (NULL != fCacheEntry) { 491cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger GrGpu* gpu = this->getGpu(); 501cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger if (NULL != gpu) { 511cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger GrAssert(NULL != gpu->getContext()); 521cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger gpu->getContext()->unlockStencilBuffer(fCacheEntry); 531cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger } 541cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger } 551cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger} 56