Chromium Code Reviews| Index: src/gpu/GrProgramResource.cpp |
| diff --git a/src/gpu/GrProgramResource.cpp b/src/gpu/GrProgramResource.cpp |
| new file mode 100644 |
| index 0000000000000000000000000000000000000000..756cbc2e8609cb93d5bb14f609678286a6e88268 |
| --- /dev/null |
| +++ b/src/gpu/GrProgramResource.cpp |
| @@ -0,0 +1,107 @@ |
| +/* |
| + * 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 "GrProgramResource.h" |
| +#include "GrGpuResource.h" |
| + |
| +GrProgramResource::GrProgramResource() { |
| + fResource = NULL; |
| + fOwnRef = false; |
| + fPendingIO = false; |
| + fIOType = kNone_IOType; |
| +} |
| + |
| +GrProgramResource::GrProgramResource(GrGpuResource* resource, IOType ioType) { |
| + fResource = NULL; |
| + fOwnRef = false; |
| + fPendingIO = false; |
| + this->setResource(resource, ioType); |
| +} |
| + |
| +GrProgramResource::~GrProgramResource() { |
| + if (fOwnRef) { |
| + SkASSERT(NULL != fResource); |
| + fResource->unref(); |
| + } |
| + if (fPendingIO) { |
| + switch (fIOType) { |
| + case kNone_IOType: |
| + SkFAIL("Shouldn't get here if fIOType is kNone."); |
| + break; |
| + case kRead_IOType: |
| + fResource->completedRead(); |
| + break; |
| + case kWrite_IOType: |
| + fResource->completedWrite(); |
| + break; |
| + case kRW_IOType: |
| + fResource->completedRead(); |
| + fResource->completedWrite(); |
| + break; |
| + } |
| + } |
| +} |
| + |
| +void GrProgramResource::reset() { |
| + SkASSERT(!fPendingIO); |
| + SkASSERT((NULL != fResource) == fOwnRef); |
| + if (fOwnRef) { |
| + fResource->unref(); |
| + fOwnRef = false; |
| + fResource = NULL; |
| + } |
| +} |
| + |
| +void GrProgramResource::setResource(GrGpuResource* resource, IOType ioType) { |
| + SkASSERT(!fPendingIO); |
| + SkASSERT((NULL != fResource) == fOwnRef); |
| + SkSafeUnref(fResource); |
| + if (NULL == resource) { |
| + fResource = NULL; |
| + fOwnRef = false; |
|
robertphillips
2014/09/04 19:48:57
fIOType = kNone_IOType; ?
bsalomon
2014/09/04 20:03:17
Done (here and in reset()).
|
| + } else { |
| + SkASSERT(kNone_IOType != ioType); |
| + fResource = resource; |
| + fOwnRef = true; |
| + fIOType = ioType; |
| + } |
| +} |
| + |
| +void GrProgramResource::markPendingIO() const { |
| + // This should only be called once, when the owning GrProgramElement gets its first |
| + // pendingExecution ref. |
| + SkASSERT(!fPendingIO); |
| + SkASSERT(NULL != fResource); |
| + fPendingIO = true; |
| + switch (fIOType) { |
| + case kNone_IOType: |
| + SkFAIL("GrProgramResource with neither reads nor writes?"); |
| + break; |
| + case kRead_IOType: |
| + fResource->addPendingRead(); |
| + break; |
| + case kWrite_IOType: |
| + fResource->addPendingWrite(); |
| + break; |
| + case kRW_IOType: |
| + fResource->addPendingRead(); |
| + fResource->addPendingWrite(); |
| + break; |
| + |
| + } |
| +} |
| + |
| +void GrProgramResource::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(kNone_IOType != fIOType); |
| + SkASSERT(NULL != fResource); |
| + fResource->unref(); |
| + fOwnRef = false; |
| +} |