| /* |
| * Copyright 2014 Google Inc. |
| * |
| * Use of this source code is governed by a BSD-style license that can be |
| * found in the LICENSE file. |
| */ |
| |
| #include "GrGpuResourceRef.h" |
| |
| GrGpuResourceRef::GrGpuResourceRef() { |
| fResource = NULL; |
| fOwnRef = false; |
| fPendingIO = false; |
| } |
| |
| GrGpuResourceRef::GrGpuResourceRef(GrGpuResource* resource, GrIOType ioType) { |
| fResource = NULL; |
| fOwnRef = false; |
| fPendingIO = false; |
| this->setResource(resource, ioType); |
| } |
| |
| GrGpuResourceRef::~GrGpuResourceRef() { |
| if (fOwnRef) { |
| SkASSERT(fResource); |
| fResource->unref(); |
| } |
| if (fPendingIO) { |
| switch (fIOType) { |
| case kRead_GrIOType: |
| fResource->completedRead(); |
| break; |
| case kWrite_GrIOType: |
| fResource->completedWrite(); |
| break; |
| case kRW_GrIOType: |
| fResource->completedRead(); |
| fResource->completedWrite(); |
| break; |
| } |
| } |
| } |
| |
| void GrGpuResourceRef::reset() { |
| SkASSERT(!fPendingIO); |
| SkASSERT(SkToBool(fResource) == fOwnRef); |
| if (fOwnRef) { |
| fResource->unref(); |
| fOwnRef = false; |
| fResource = NULL; |
| } |
| } |
| |
| void GrGpuResourceRef::setResource(GrGpuResource* resource, GrIOType ioType) { |
| SkASSERT(!fPendingIO); |
| SkASSERT(SkToBool(fResource) == fOwnRef); |
| SkSafeUnref(fResource); |
| if (NULL == resource) { |
| fResource = NULL; |
| fOwnRef = false; |
| } else { |
| fResource = resource; |
| fOwnRef = true; |
| fIOType = ioType; |
| } |
| } |
| |
| void GrGpuResourceRef::markPendingIO() const { |
| // This should only be called when the owning GrProgramElement gets its first |
| // pendingExecution ref. |
| SkASSERT(!fPendingIO); |
| SkASSERT(fResource); |
| fPendingIO = true; |
| switch (fIOType) { |
| case kRead_GrIOType: |
| fResource->addPendingRead(); |
| break; |
| case kWrite_GrIOType: |
| fResource->addPendingWrite(); |
| break; |
| case kRW_GrIOType: |
| fResource->addPendingRead(); |
| fResource->addPendingWrite(); |
| break; |
| } |
| } |
| |
| void GrGpuResourceRef::pendingIOComplete() const { |
| // This should only be called when the owner's pending executions have ocurred but it is still |
| // reffed. |
| SkASSERT(fOwnRef); |
| SkASSERT(fPendingIO); |
| switch (fIOType) { |
| case kRead_GrIOType: |
| fResource->completedRead(); |
| break; |
| case kWrite_GrIOType: |
| fResource->completedWrite(); |
| break; |
| case kRW_GrIOType: |
| fResource->completedRead(); |
| fResource->completedWrite(); |
| break; |
| |
| } |
| fPendingIO = false; |
| } |
| |
| void GrGpuResourceRef::removeRef() const { |
| // This should only be called once, when the owners last ref goes away and |
| // there is a pending execution. |
| SkASSERT(fOwnRef); |
| SkASSERT(fPendingIO); |
| SkASSERT(fResource); |
| fResource->unref(); |
| fOwnRef = false; |
| } |