Add specialized content key class for resources.

Review URL: https://codereview.chromium.org/858123002
diff --git a/src/gpu/GrResourceCache2.cpp b/src/gpu/GrResourceCache2.cpp
index ba9d4d1..a63bda8 100644
--- a/src/gpu/GrResourceCache2.cpp
+++ b/src/gpu/GrResourceCache2.cpp
@@ -19,7 +19,7 @@
 //////////////////////////////////////////////////////////////////////////////
 
 GrScratchKey::ResourceType GrScratchKey::GenerateResourceType() {
-    static int32_t gType = kInvalidResourceType + 1;
+    static int32_t gType = INHERITED::kInvalidDomain + 1;
 
     int32_t type = sk_atomic_inc(&gType);
     if (type > SK_MaxU16) {
@@ -29,15 +29,18 @@
     return static_cast<ResourceType>(type);
 }
 
+GrContentKey::Domain GrContentKey::GenerateDomain() {
+    static int32_t gDomain = INHERITED::kInvalidDomain + 1;
 
-void GrScratchKey::Builder::finish() {
-    if (NULL == fKey) {
-        return;
+    int32_t domain = sk_atomic_inc(&gDomain);
+    if (kInvalidDomain == gDomain) {
+        SkFAIL("Too many Content Key Domains");
     }
-    GR_STATIC_ASSERT(0 == kHash_MetaDataIdx);
-    fKey->fKey[kHash_MetaDataIdx] = 
-        SkChecksum::Compute(&fKey->fKey[kHash_MetaDataIdx + 1], fKey->size() - sizeof(uint32_t));
-    fKey = NULL;
+
+    return static_cast<Domain>(domain);
+}
+uint32_t GrResourceKeyHash(const uint32_t* data, size_t size) {
+    return SkChecksum::Compute(data, size);
 }
 
 //////////////////////////////////////////////////////////////////////////////
@@ -129,8 +132,8 @@
     if (resource->cacheAccess().getScratchKey().isValid()) {
         fScratchMap.remove(resource->cacheAccess().getScratchKey(), resource);
     }
-    if (const GrResourceKey* contentKey = resource->cacheAccess().getContentKey()) {
-        fContentHash.remove(*contentKey);
+    if (resource->cacheAccess().getContentKey().isValid()) {
+        fContentHash.remove(resource->cacheAccess().getContentKey());
     }
     this->validate();
 }
@@ -222,9 +225,9 @@
     SkASSERT(!fPurging);
     SkASSERT(resource);
     SkASSERT(this->isInCache(resource));
-    SkASSERT(resource->cacheAccess().getContentKey());
+    SkASSERT(resource->cacheAccess().getContentKey().isValid());
 
-    GrGpuResource* res = fContentHash.find(*resource->cacheAccess().getContentKey());
+    GrGpuResource* res = fContentHash.find(resource->cacheAccess().getContentKey());
     if (NULL != res) {
         return false;
     }
@@ -258,8 +261,8 @@
     bool overBudget = fBudgetedCount > fMaxCount || fBudgetedBytes > fMaxBytes;
 
     // Also purge if the resource has neither a valid scratch key nor a content key.
-    bool noKey = !resource->cacheAccess().isScratch() &&
-                 (NULL == resource->cacheAccess().getContentKey());
+    bool noKey = !resource->cacheAccess().getScratchKey().isValid() &&
+                 !resource->cacheAccess().getContentKey().isValid();
 
     // Only cached resources should ever have a key.
     SkASSERT(noKey || resource->cacheAccess().isBudgeted());
@@ -406,20 +409,20 @@
         }
 
         if (resource->cacheAccess().isScratch()) {
-            SkASSERT(NULL == resource->cacheAccess().getContentKey());
+            SkASSERT(!resource->cacheAccess().getContentKey().isValid());
             ++scratch;
             SkASSERT(fScratchMap.countForKey(resource->cacheAccess().getScratchKey()));
             SkASSERT(!resource->cacheAccess().isWrapped());
         } else if (resource->cacheAccess().getScratchKey().isValid()) {
-            SkASSERT(NULL != resource->cacheAccess().getContentKey());
+            SkASSERT(resource->cacheAccess().getContentKey().isValid());
             ++couldBeScratch;
             SkASSERT(fScratchMap.countForKey(resource->cacheAccess().getScratchKey()));
             SkASSERT(!resource->cacheAccess().isWrapped());
         }
-
-        if (const GrResourceKey* contentKey = resource->cacheAccess().getContentKey()) {
+        const GrContentKey& contentKey = resource->cacheAccess().getContentKey();
+        if (contentKey.isValid()) {
             ++content;
-            SkASSERT(fContentHash.find(*contentKey) == resource);
+            SkASSERT(fContentHash.find(contentKey) == resource);
             SkASSERT(!resource->cacheAccess().isWrapped());
         }