Move IOType to GrGpuRef and rename that to GrIORef. Template GrPendingIORef on IOType.

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

Author: bsalomon@google.com

Review URL: https://codereview.chromium.org/579403003
diff --git a/include/gpu/GrGpuResourceRef.h b/include/gpu/GrGpuResourceRef.h
index d178908..6b3937b 100644
--- a/include/gpu/GrGpuResourceRef.h
+++ b/include/gpu/GrGpuResourceRef.h
@@ -8,10 +8,9 @@
 #ifndef GrGpuResourceRef_DEFINED
 #define GrGpuResourceRef_DEFINED
 
+#include "GrGpuResource.h"
 #include "SkRefCnt.h"
 
-class GrGpuResource;
-
 /**
  * This class is intended only for internal use in core Gr code.
  *
@@ -37,14 +36,6 @@
 public:
     SK_DECLARE_INST_COUNT_ROOT(GrGpuResourceRef);
 
-    enum IOType {
-        kRead_IOType,
-        kWrite_IOType,
-        kRW_IOType,
-
-        kNone_IOType, // For internal use only, don't specify to constructor or setResource().
-    };
-
     ~GrGpuResourceRef();
 
     GrGpuResource* getResource() const { return fResource; }
@@ -61,11 +52,11 @@
 
     /** Adopts a ref from the caller. ioType expresses what type of IO operations will be marked as
         pending on the resource when markPendingIO is called. */
-    GrGpuResourceRef(GrGpuResource*, IOType);
+    GrGpuResourceRef(GrGpuResource*, GrIORef::IOType);
 
     /** Adopts a ref from the caller. ioType expresses what type of IO operations will be marked as
         pending on the resource when markPendingIO is called. */
-    void setResource(GrGpuResource*, IOType);
+    void setResource(GrGpuResource*, GrIORef::IOType);
 
 private:
     /** Called by owning GrProgramElement when the program element is first scheduled for
@@ -90,7 +81,7 @@
     GrGpuResource*      fResource;
     mutable bool        fOwnRef;
     mutable bool        fPendingIO;
-    IOType              fIOType;
+    GrIORef::IOType     fIOType;
 
     typedef SkNoncopyable INHERITED;
 };
@@ -104,13 +95,13 @@
 
     /** Adopts a ref from the caller. ioType expresses what type of IO operations will be marked as
         pending on the resource when markPendingIO is called. */
-    GrTGpuResourceRef(T* resource, IOType ioType) : INHERITED(resource, ioType) {}
+    GrTGpuResourceRef(T* resource, GrIORef::IOType ioType) : INHERITED(resource, ioType) {}
 
     T* get() const { return static_cast<T*>(this->getResource()); }
 
     /** Adopts a ref from the caller. ioType expresses what type of IO operations will be marked as
         pending on the resource when markPendingIO is called. */
-    void set(T* resource, IOType ioType) { this->setResource(resource, ioType); }
+    void set(T* resource, GrIORef::IOType ioType) { this->setResource(resource, ioType); }
 
 private:
     typedef GrGpuResourceRef INHERITED;
@@ -120,22 +111,18 @@
  * This is similar to GrTGpuResourceRef but can only be in the pending IO state. It never owns a
  * ref.
  */
-template <typename T> class GrPendingIOResource : SkNoncopyable {
+template <typename T, GrIORef::IOType IO_TYPE> class GrPendingIOResource : SkNoncopyable {
 public:
-    typedef GrGpuResourceRef::IOType IOType;
-    GrPendingIOResource(T* resource, IOType ioType) : fResource(resource), fIOType(ioType) {
+    GrPendingIOResource(T* resource) : fResource(resource) {
         if (NULL != fResource) {
-            switch (fIOType) {
-                case GrGpuResourceRef::kNone_IOType:
-                    SkFAIL("GrPendingIOResource with neither reads nor writes?");
-                    break;
-                case GrGpuResourceRef::kRead_IOType:
+            switch (IO_TYPE) {
+                case GrIORef::kRead_IOType:
                     fResource->addPendingRead();
                     break;
-                case GrGpuResourceRef::kWrite_IOType:
+                case GrIORef::kWrite_IOType:
                     fResource->addPendingWrite();
                     break;
-                case GrGpuResourceRef::kRW_IOType:
+                case GrIORef::kRW_IOType:
                     fResource->addPendingRead();
                     fResource->addPendingWrite();
                     break;
@@ -145,17 +132,14 @@
 
     ~GrPendingIOResource() {
         if (NULL != fResource) {
-            switch (fIOType) {
-                case GrGpuResourceRef::kNone_IOType:
-                    SkFAIL("GrPendingIOResource with neither reads nor writes?");
-                    break;
-                case GrGpuResourceRef::kRead_IOType:
+            switch (IO_TYPE) {
+                case GrIORef::kRead_IOType:
                     fResource->completedRead();
                     break;
-                case GrGpuResourceRef::kWrite_IOType:
+                case GrIORef::kWrite_IOType:
                     fResource->completedWrite();
                     break;
-                case GrGpuResourceRef::kRW_IOType:
+                case GrIORef::kRW_IOType:
                     fResource->completedRead();
                     fResource->completedWrite();
                     break;
@@ -167,6 +151,5 @@
 
 private:
     T*      fResource;
-    IOType  fIOType;
 };
 #endif