Rename GrProgramResource to GrGpuResourceRef

BUG=skia:2889
R=robertphillips@google.com

Author: bsalomon@google.com

Review URL: https://codereview.chromium.org/574333003
diff --git a/src/gpu/GrGpuResourceRef.cpp b/src/gpu/GrGpuResourceRef.cpp
new file mode 100644
index 0000000..74b1ef0
--- /dev/null
+++ b/src/gpu/GrGpuResourceRef.cpp
@@ -0,0 +1,133 @@
+/*
+ * 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"
+#include "GrGpuResource.h"
+
+GrGpuResourceRef::GrGpuResourceRef() {
+    fResource = NULL;
+    fOwnRef = false;
+    fPendingIO = false;
+    fIOType = kNone_IOType;
+}
+
+GrGpuResourceRef::GrGpuResourceRef(GrGpuResource* resource, IOType ioType) {
+    fResource = NULL;
+    fOwnRef = false;
+    fPendingIO = false;
+    this->setResource(resource, ioType);
+}
+
+GrGpuResourceRef::~GrGpuResourceRef() {
+    if (fOwnRef) {
+        SkASSERT(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 GrGpuResourceRef::reset() {
+    SkASSERT(!fPendingIO);
+    SkASSERT(SkToBool(fResource) == fOwnRef);
+    if (fOwnRef) {
+        fResource->unref();
+        fOwnRef = false;
+        fResource = NULL;
+        fIOType = kNone_IOType;
+    }
+}
+
+void GrGpuResourceRef::setResource(GrGpuResource* resource, IOType ioType) {
+    SkASSERT(!fPendingIO);
+    SkASSERT(SkToBool(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 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 kNone_IOType:
+            SkFAIL("GrGpuResourceRef 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 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 kNone_IOType:
+            SkFAIL("GrGpuResourceRef with neither reads nor writes?");
+            break;
+        case kRead_IOType:
+            fResource->completedRead();
+            break;
+        case kWrite_IOType:
+            fResource->completedWrite();
+            break;
+        case kRW_IOType:
+            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(kNone_IOType != fIOType);
+    SkASSERT(fResource);
+    fResource->unref();
+    fOwnRef = false;
+}