• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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)14 void 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()22 void GrStencilBuffer::transferToCacheAndLock() {
23     GrAssert(NULL == fCacheEntry);
24     fCacheEntry =
25         this->getGpu()->getContext()->addAndLockStencilBuffer(this);
26 }
27 
onRelease()28 void 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()42 void GrStencilBuffer::onAbandon() {
43     // we can use the same behavior as release.
44     this->onRelease();
45 }
46 
unlockInCache()47 void 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