9 #ifndef GrResourceKey_DEFINED
10 #define GrResourceKey_DEFINED
12 #include "../private/SkOnce.h"
13 #include "../private/SkTemplates.h"
18 uint32_t GrResourceKeyHash(
const uint32_t* data,
size_t size);
26 uint32_t hash()
const {
28 return fKey[kHash_MetaDataIdx];
33 SkASSERT(this->isValid());
34 return this->internalSize();
38 static const uint32_t kInvalidDomain = 0;
44 GR_STATIC_ASSERT((uint16_t)kInvalidDomain == kInvalidDomain);
45 fKey.reset(kMetaDataCnt);
46 fKey[kHash_MetaDataIdx] = 0;
47 fKey[kDomainAndSize_MetaDataIdx] = kInvalidDomain;
51 return this->hash() == that.hash() &&
52 0 == memcmp(&fKey[kHash_MetaDataIdx + 1],
53 &that.fKey[kHash_MetaDataIdx + 1],
54 this->internalSize() -
sizeof(uint32_t));
58 SkASSERT(that.isValid());
60 size_t bytes = that.size();
61 SkASSERT(SkIsAlign4(bytes));
62 fKey.reset(SkToInt(bytes /
sizeof(uint32_t)));
63 memcpy(fKey.get(), that.fKey.get(), bytes);
69 bool isValid()
const {
return kInvalidDomain != this->domain(); }
71 uint32_t domain()
const {
return fKey[kDomainAndSize_MetaDataIdx] & 0xffff; }
74 size_t dataSize()
const {
return this->size() - 4 * kMetaDataCnt; }
77 const uint32_t*
data()
const {
79 return &fKey[kMetaDataCnt];
86 SkASSERT(data32Count >= 0);
87 SkASSERT(domain != kInvalidDomain);
88 key->fKey.reset(kMetaDataCnt + data32Count);
89 int size = (data32Count + kMetaDataCnt) *
sizeof(uint32_t);
90 SkASSERT(SkToU16(size) == size);
91 SkASSERT(SkToU16(domain) == domain);
92 key->fKey[kDomainAndSize_MetaDataIdx] = domain | (size << 16);
101 GR_STATIC_ASSERT(0 == kHash_MetaDataIdx);
102 uint32_t* hash = &fKey->fKey[kHash_MetaDataIdx];
103 *hash = GrResourceKeyHash(hash + 1, fKey->internalSize() -
sizeof(uint32_t));
108 uint32_t& operator[](
int dataIdx) {
110 SkDEBUGCODE(
size_t dataCount = fKey->internalSize() /
sizeof(uint32_t) - kMetaDataCnt;)
111 SkASSERT(SkToU32(dataIdx) < dataCount);
112 return fKey->fKey[kMetaDataCnt + dataIdx];
123 kDomainAndSize_MetaDataIdx,
125 kLastMetaDataIdx = kDomainAndSize_MetaDataIdx
127 static const uint32_t kMetaDataCnt = kLastMetaDataIdx + 1;
129 size_t internalSize()
const {
130 return fKey[kDomainAndSize_MetaDataIdx] >> 16;
133 void validate()
const {
134 SkASSERT(fKey[kHash_MetaDataIdx] ==
135 GrResourceKeyHash(&fKey[kHash_MetaDataIdx] + 1,
136 this->internalSize() -
sizeof(uint32_t)));
137 SkASSERT(SkIsAlign4(this->internalSize()));
140 friend class TestResource;
144 SkAutoSTMalloc<kMetaDataCnt + 7, uint32_t> fKey;
187 using INHERITED::isValid;
189 ResourceType resourceType()
const {
return this->domain(); }
192 this->INHERITED::operator=(that);
197 return this->INHERITED::operator==(that);
199 bool operator!=(
const GrScratchKey& that)
const {
return !(*
this == that); }
227 typedef uint32_t Domain;
239 using INHERITED::isValid;
242 this->INHERITED::operator=(that);
243 this->setCustomData(sk_ref_sp(that.getCustomData()));
244 SkDEBUGCODE(fTag = that.fTag;)
249 return this->INHERITED::operator==(that);
251 bool operator!=(
const GrUniqueKey& that)
const {
return !(*
this == that); }
254 fData = std::move(data);
256 SkData* getCustomData()
const {
260 SkDEBUGCODE(
const char* tag()
const {
return fTag.c_str(); })
262 class Builder :
public INHERITED::Builder {
265 : INHERITED::
Builder(key, type, data32Count) {
266 SkDEBUGCODE(key->fTag = tag;)
272 const char* tag =
nullptr)
273 :
INHERITED::
Builder(key, domain, Data32CntForInnerKey(innerKey) + extraData32Cnt) {
274 SkASSERT(&innerKey != key);
276 uint32_t* innerKeyData = &this->operator[](extraData32Cnt);
277 const uint32_t* srcData = innerKey.
data();
278 (*innerKeyData++) = innerKey.domain();
279 memcpy(innerKeyData, srcData, innerKey.
dataSize());
280 SkDEBUGCODE(key->fTag = tag;)
285 static int Data32CntForInnerKey(
const GrUniqueKey& innerKey) {
287 return SkToInt((innerKey.
dataSize() >> 2) + 1);
303 #define GR_DECLARE_STATIC_UNIQUE_KEY(name) static SkOnce name##_once
306 #define GR_DEFINE_STATIC_UNIQUE_KEY(name) \
307 static SkAlignedSTStorage<1, GrUniqueKey> name##_storage; \
308 name##_once(gr_init_static_unique_key_once, &name##_storage); \
309 static const GrUniqueKey& name = *reinterpret_cast<GrUniqueKey*>(name##_storage.get());
311 static inline void gr_init_static_unique_key_once(SkAlignedSTStorage<1,GrUniqueKey>* keyStorage) {
GrUniqueKey()
Creates an invalid unique key.
Definition: GrResourceKey.h:232
A key that allows for exclusive use of a resource for a use case (AKA "domain").
Definition: GrResourceKey.h:222
Used to initialize a key.
Definition: GrResourceKey.h:83
const uint32_t * data() const
ptr to the key data, excluding meta-data (hash, domain, etc).
Definition: GrResourceKey.h:77
size_t dataSize() const
size of the key data, excluding meta-data (hash, domain, etc).
Definition: GrResourceKey.h:74
SkData holds an immutable data buffer.
Definition: SkData.h:22
Builder(GrUniqueKey *key, const GrUniqueKey &innerKey, Domain domain, int extraData32Cnt, const char *tag=nullptr)
Used to build a key that wraps another key and adds additional data.
Definition: GrResourceKey.h:271
static ResourceType GenerateResourceType()
Generate a unique ResourceType.
A key used for scratch resources.
Definition: GrResourceKey.h:168
void reset()
Reset to an invalid key.
Definition: GrResourceKey.h:43
Definition: GrResourceKey.h:317
Base class for all GrGpuResource cache keys.
Definition: GrResourceKey.h:24
uint32_t ResourceType
Uniquely identifies the type of resource that is cached as scratch.
Definition: GrResourceKey.h:174
static Domain GenerateDomain()
Generate a Domain for unique keys.
GrScratchKey()
Creates an invalid scratch key.
Definition: GrResourceKey.h:180
Definition: GrResourceKey.h:201
Light weight class for managing strings.
Definition: SkString.h:121