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