Index: src/gpu/GrProgramResource.cpp |
diff --git a/src/gpu/GrProgramResource.cpp b/src/gpu/GrProgramResource.cpp |
new file mode 100644 |
index 0000000000000000000000000000000000000000..08975ae041dd7a51cd6675ca19a7e85fc071a3f3 |
--- /dev/null |
+++ b/src/gpu/GrProgramResource.cpp |
@@ -0,0 +1,109 @@ |
+/* |
+ * 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; |
+ fIOType = kNone_IOType; |
+ } |
+} |
+ |
+void GrProgramResource::setResource(GrGpuResource* resource, IOType ioType) { |
+ SkASSERT(!fPendingIO); |
+ SkASSERT((NULL != fResource) == fOwnRef); |
+ SkSafeUnref(fResource); |
+ if (NULL == resource) { |
+ fResource = NULL; |
+ fOwnRef = false; |
+ fIOType = kNone_IOType; |
+ } 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; |
+} |