Refactored cacheID in preparation for clip mask caching changes

http://codereview.appspot.com/6458089/



git-svn-id: http://skia.googlecode.com/svn/trunk@5002 2bbb7eff-a529-9590-31e7-b0007b416f81
diff --git a/src/gpu/GrCacheID.h b/src/gpu/GrCacheID.h
new file mode 100644
index 0000000..972ce10
--- /dev/null
+++ b/src/gpu/GrCacheID.h
@@ -0,0 +1,104 @@
+/*
+ * Copyright 2012 Google Inc.
+ *
+ * Use of this source code is governed by a BSD-style license that can be
+ * found in the LICENSE file.
+ */
+
+#ifndef GrCacheID_DEFINED
+#define GrCacheID_DEFINED
+
+#include "GrTypes.h"
+
+///////////////////////////////////////////////////////////////////////////////
+#define GR_DECLARE_RESOURCE_CACHE_TYPE()                         \
+    static int8_t GetResourceType();
+
+#define GR_DEFINE_RESOURCE_CACHE_TYPE(ClassName)                 \
+    int8_t ClassName::GetResourceType() {                        \
+        static int8_t kResourceTypeID = 0;                       \
+        if (0 == kResourceTypeID) {                              \
+            kResourceTypeID = GrCacheID::GetNextResourceType();  \
+        }                                                        \
+        return kResourceTypeID;                                  \
+    }
+
+
+///////////////////////////////////////////////////////////////////////////////
+#define GR_DECLARE_RESOURCE_CACHE_DOMAIN(AccessorName)           \
+    static int8_t AccessorName();
+
+#define GR_DEFINE_RESOURCE_CACHE_DOMAIN(ClassName, AccessorName) \
+    int8_t ClassName::AccessorName() {                           \
+        static int8_t kDomainID = 0;                             \
+        if (0 == kDomainID) {                                    \
+            kDomainID = GrCacheID::GetNextDomain();              \
+        }                                                        \
+        return kDomainID;                                        \
+    }
+
+/**
+ * The cache ID adds structure to the IDs used for caching GPU resources. It
+ * is broken into three portions:
+ *      the public portion - which is filled in by Skia clients
+ *      the private portion - which is used by the cache (domain & type)
+ *      the resource-specific portion - which is filled in by each GrResource-
+ *              derived class.
+ *
+ * For the public portion each client of the cache makes up its own 
+ * unique-per-resource identifier (e.g., bitmap genID). A public ID of 
+ * 'kScratch_CacheID' indicates that the resource is a "scratch" resource. 
+ * When used to acquire a resource it indicates the cache user is 
+ * looking for a resource that matches a resource-subclass-specific set of 
+ * “dimensions” such as width, height, buffer size, or pixel config, but not 
+ * for particular resource contents (e.g., texel or vertex values). The public 
+ * IDs are unique within a private ID value but not necessarily across 
+ * private IDs.
+ *
+ * The domain portion identifies the cache client while the type field
+ * indicates the resource type. When the public portion indicates that the 
+ * resource is a scratch resource, the domain field should be kUnrestricted
+ * so that scratch resources can be recycled across domains.
+ */
+class GrCacheID {
+public:
+    uint64_t     fPublicID;
+
+    uint32_t     fResourceSpecific32;
+
+    uint8_t      fDomain;
+private:
+    uint8_t      fResourceType;
+
+public:
+    uint16_t     fResourceSpecific16;
+
+    GrCacheID(uint8_t resourceType)
+        : fPublicID(kDefaultPublicCacheID)
+        , fDomain(kUnrestricted_ResourceDomain)
+        , fResourceType(resourceType) {
+    }
+
+    void toRaw(uint32_t v[4]);
+
+    uint8_t getResourceType() const { return fResourceType; }
+
+    /*
+     * Default value for public portion of GrCacheID
+     */
+    static const uint64_t kDefaultPublicCacheID = 0;
+
+    static const uint8_t kInvalid_ResourceType = 0;
+    /**
+     * All scratch resources should be Unrestricted so they can be used 
+     * by any domain.
+     */
+    static const uint8_t kUnrestricted_ResourceDomain = 0;
+
+    static uint8_t    GetNextDomain();
+    static uint8_t    GetNextResourceType();
+
+
+};
+
+#endif // GrCacheID_DEFINED