OLD | NEW |
1 | 1 |
2 /* | 2 /* |
3 * Copyright 2014 Google Inc. | 3 * Copyright 2014 Google Inc. |
4 * | 4 * |
5 * Use of this source code is governed by a BSD-style license that can be | 5 * Use of this source code is governed by a BSD-style license that can be |
6 * found in the LICENSE file. | 6 * found in the LICENSE file. |
7 */ | 7 */ |
8 | 8 |
9 #ifndef GrResourceKey_DEFINED | 9 #ifndef GrResourceKey_DEFINED |
10 #define GrResourceKey_DEFINED | 10 #define GrResourceKey_DEFINED |
11 | 11 |
12 #include "GrTypes.h" | 12 #include "GrTypes.h" |
13 #include "SkOnce.h" | |
14 #include "SkTemplates.h" | 13 #include "SkTemplates.h" |
15 | 14 |
16 uint32_t GrResourceKeyHash(const uint32_t* data, size_t size); | 15 uint32_t GrResourceKeyHash(const uint32_t* data, size_t size); |
17 | 16 |
18 /** | 17 /** |
19 * Base class for all GrGpuResource cache keys. There are two types of cache key
s. Refer to the | 18 * Base class for all GrGpuResource cache keys. There are two types of cache key
s. Refer to the |
20 * comments for each key type below. | 19 * comments for each key type below. |
21 */ | 20 */ |
22 class GrResourceKey { | 21 class GrResourceKey { |
23 public: | 22 public: |
(...skipping 236 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
260 } | 259 } |
261 | 260 |
262 private: | 261 private: |
263 static int Data32CntForInnerKey(const GrUniqueKey& innerKey) { | 262 static int Data32CntForInnerKey(const GrUniqueKey& innerKey) { |
264 // key data + domain | 263 // key data + domain |
265 return SkToInt((innerKey.dataSize() >> 2) + 1); | 264 return SkToInt((innerKey.dataSize() >> 2) + 1); |
266 } | 265 } |
267 }; | 266 }; |
268 }; | 267 }; |
269 | 268 |
270 /** | |
271 * It is common to need a frequently reused GrUniqueKey where the only requireme
nt is that the key | |
272 * is unique. These macros create such a key in a thread safe manner so the key
can be truly global | |
273 * and only constructed once. | |
274 */ | |
275 | |
276 /** Place outside of function/class definitions. */ | |
277 #define GR_DECLARE_STATIC_UNIQUE_KEY(name) SK_DECLARE_STATIC_ONCE(name##_once) | |
278 | |
279 /** Place inside function where the key is used. */ | |
280 #define GR_DEFINE_STATIC_UNIQUE_KEY(name) \ | |
281 static GrUniqueKey name; \ | |
282 SkOnce(&name##_once, gr_init_static_unique_key_once, &name) | |
283 | |
284 static inline void gr_init_static_unique_key_once(GrUniqueKey* key) { | |
285 GrUniqueKey::Builder builder(key, GrUniqueKey::GenerateDomain(), 0); | |
286 } | |
287 | |
288 // The cache listens for these messages to purge junk resources proactively. | 269 // The cache listens for these messages to purge junk resources proactively. |
289 class GrUniqueKeyInvalidatedMessage { | 270 class GrUniqueKeyInvalidatedMessage { |
290 public: | 271 public: |
291 explicit GrUniqueKeyInvalidatedMessage(const GrUniqueKey& key) : fKey(key) {
} | 272 explicit GrUniqueKeyInvalidatedMessage(const GrUniqueKey& key) : fKey(key) {
} |
292 | 273 |
293 GrUniqueKeyInvalidatedMessage(const GrUniqueKeyInvalidatedMessage& that) : f
Key(that.fKey) {} | 274 GrUniqueKeyInvalidatedMessage(const GrUniqueKeyInvalidatedMessage& that) : f
Key(that.fKey) {} |
294 | 275 |
295 GrUniqueKeyInvalidatedMessage& operator=(const GrUniqueKeyInvalidatedMessage
& that) { | 276 GrUniqueKeyInvalidatedMessage& operator=(const GrUniqueKeyInvalidatedMessage
& that) { |
296 fKey = that.fKey; | 277 fKey = that.fKey; |
297 return *this; | 278 return *this; |
298 } | 279 } |
299 | 280 |
300 const GrUniqueKey& key() const { return fKey; } | 281 const GrUniqueKey& key() const { return fKey; } |
301 | 282 |
302 private: | 283 private: |
303 GrUniqueKey fKey; | 284 GrUniqueKey fKey; |
304 }; | 285 }; |
305 #endif | 286 #endif |
OLD | NEW |