blob: 6a9ff895212c53c81f349701f6139287a50c4fb5 [file] [log] [blame]
bsalomon744998e2014-08-28 09:54:34 -07001
2/*
3 * Copyright 2014 Google Inc.
4 *
5 * Use of this source code is governed by a BSD-style license that can be
6 * found in the LICENSE file.
7 */
8
9#ifndef GrResourceKey_DEFINED
10#define GrResourceKey_DEFINED
11
12#include "GrTypes.h"
13#include "GrBinHashKey.h"
14
15class GrResourceKey {
16public:
bsalomonfe369ee2014-11-10 11:59:06 -080017 static GrCacheID::Domain ScratchDomain();
bsalomon744998e2014-08-28 09:54:34 -070018
19 /** Uniquely identifies the GrGpuResource subclass in the key to avoid collisions
20 across resource types. */
21 typedef uint8_t ResourceType;
22
23 /** Flags set by the GrGpuResource subclass. */
24 typedef uint8_t ResourceFlags;
25
26 /** Generate a unique ResourceType */
27 static ResourceType GenerateResourceType();
28
29 /** Creates a key for resource */
30 GrResourceKey(const GrCacheID& id, ResourceType type, ResourceFlags flags) {
31 this->init(id.getDomain(), id.getKey(), type, flags);
32 };
33
34 GrResourceKey(const GrResourceKey& src) { fKey = src.fKey; }
35
36 GrResourceKey() { fKey.reset(); }
37
38 void reset(const GrCacheID& id, ResourceType type, ResourceFlags flags) {
39 this->init(id.getDomain(), id.getKey(), type, flags);
40 }
41
42 uint32_t getHash() const { return fKey.getHash(); }
43
44 bool isScratch() const {
45 return ScratchDomain() ==
46 *reinterpret_cast<const GrCacheID::Domain*>(fKey.getData() +
47 kCacheIDDomainOffset);
48 }
49
50 ResourceType getResourceType() const {
51 return *reinterpret_cast<const ResourceType*>(fKey.getData() +
52 kResourceTypeOffset);
53 }
54
55 ResourceFlags getResourceFlags() const {
56 return *reinterpret_cast<const ResourceFlags*>(fKey.getData() +
57 kResourceFlagsOffset);
58 }
59
60 bool operator==(const GrResourceKey& other) const { return fKey == other.fKey; }
61
62 // A key indicating that the resource is not usable as a scratch resource.
bsalomonfe369ee2014-11-10 11:59:06 -080063 static GrResourceKey& NullScratchKey();
bsalomon744998e2014-08-28 09:54:34 -070064
65 bool isNullScratch() const {
66 return this->isScratch() && NoneResourceType() == this->getResourceType();
67 }
68
69private:
70 enum {
71 kCacheIDKeyOffset = 0,
72 kCacheIDDomainOffset = kCacheIDKeyOffset + sizeof(GrCacheID::Key),
73 kResourceTypeOffset = kCacheIDDomainOffset + sizeof(GrCacheID::Domain),
74 kResourceFlagsOffset = kResourceTypeOffset + sizeof(ResourceType),
75 kPadOffset = kResourceFlagsOffset + sizeof(ResourceFlags),
76 kKeySize = SkAlign4(kPadOffset),
77 kPadSize = kKeySize - kPadOffset
78 };
79
bsalomonfe369ee2014-11-10 11:59:06 -080080 static ResourceType NoneResourceType();
bsalomon744998e2014-08-28 09:54:34 -070081
82 void init(const GrCacheID::Domain domain,
83 const GrCacheID::Key& key,
84 ResourceType type,
85 ResourceFlags flags) {
86 union {
87 uint8_t fKey8[kKeySize];
88 uint32_t fKey32[kKeySize / 4];
89 } keyData;
90
91 uint8_t* k = keyData.fKey8;
92 memcpy(k + kCacheIDKeyOffset, key.fData8, sizeof(GrCacheID::Key));
93 memcpy(k + kCacheIDDomainOffset, &domain, sizeof(GrCacheID::Domain));
94 memcpy(k + kResourceTypeOffset, &type, sizeof(ResourceType));
95 memcpy(k + kResourceFlagsOffset, &flags, sizeof(ResourceFlags));
96 memset(k + kPadOffset, 0, kPadSize);
97 fKey.setKeyData(keyData.fKey32);
98 }
99 GrBinHashKey<kKeySize> fKey;
100};
101
102#endif