Index: src/gpu/GrResourceCache.h |
diff --git a/src/gpu/GrResourceCache.h b/src/gpu/GrResourceCache.h |
index 880a0a98b5b5fc9811d480e1d08b7e74a9a7c12a..83337805a42f1c3a021f9ff61f4276b3cfe32316 100644 |
--- a/src/gpu/GrResourceCache.h |
+++ b/src/gpu/GrResourceCache.h |
@@ -141,13 +141,26 @@ |
*/ |
int getCachedResourceCount() const { return fEntryCount; } |
+ // For a found or added resource to be completely exclusive to the caller |
+ // both the kNoOtherOwners and kHide flags need to be specified |
+ enum OwnershipFlags { |
+ kNoOtherOwners_OwnershipFlag = 0x1, // found/added resource has no other owners |
+ kHide_OwnershipFlag = 0x2 // found/added resource is hidden from future 'find's |
+ }; |
+ |
/** |
* Search for an entry with the same Key. If found, return it. |
* If not found, return null. |
- */ |
- GrGpuResource* find(const GrResourceKey& key); |
- |
- void makeResourceMRU(GrGpuResource*); |
+ * If ownershipFlags includes kNoOtherOwners and a resource is returned |
+ * then that resource has no other refs to it. |
+ * If ownershipFlags includes kHide and a resource is returned then that |
+ * resource will not be returned from future 'find' calls until it is |
+ * 'freed' (and recycled) or makeNonExclusive is called. |
+ * For a resource to be completely exclusive to a caller both kNoOtherOwners |
+ * and kHide must be specified. |
+ */ |
+ GrGpuResource* find(const GrResourceKey& key, |
+ uint32_t ownershipFlags = 0); |
/** |
* Add the new resource to the cache (by creating a new cache entry based |
@@ -155,14 +168,34 @@ |
* |
* Ownership of the resource is transferred to the resource cache, |
* which will unref() it when it is purged or deleted. |
- */ |
- void addResource(const GrResourceKey& key, GrGpuResource* resource); |
+ * |
+ * If ownershipFlags includes kHide, subsequent calls to 'find' will not |
+ * return 'resource' until it is 'freed' (and recycled) or makeNonExclusive |
+ * is called. |
+ */ |
+ void addResource(const GrResourceKey& key, |
+ GrGpuResource* resource, |
+ uint32_t ownershipFlags = 0); |
/** |
* Determines if the cache contains an entry matching a key. If a matching |
* entry exists but was detached then it will not be found. |
*/ |
bool hasKey(const GrResourceKey& key) const { return SkToBool(fCache.find(key)); } |
+ |
+ /** |
+ * Hide 'entry' so that future searches will not find it. Such |
+ * hidden entries will not be purged. The entry still counts against |
+ * the cache's budget and should be made non-exclusive when exclusive access |
+ * is no longer needed. |
+ */ |
+ void makeExclusive(GrResourceCacheEntry* entry); |
+ |
+ /** |
+ * Restore 'entry' so that it can be found by future searches. 'entry' |
+ * will also be purgeable (provided its lock count is now 0.) |
+ */ |
+ void makeNonExclusive(GrResourceCacheEntry* entry); |
/** |
* Notify the cache that the size of a resource has changed. |
@@ -204,14 +237,26 @@ |
#endif |
private: |
- void internalDetach(GrResourceCacheEntry*); |
- void attachToHead(GrResourceCacheEntry*); |
+ enum BudgetBehaviors { |
+ kAccountFor_BudgetBehavior, |
+ kIgnore_BudgetBehavior |
+ }; |
+ |
+ void internalDetach(GrResourceCacheEntry*, BudgetBehaviors behavior = kAccountFor_BudgetBehavior); |
+ void attachToHead(GrResourceCacheEntry*, BudgetBehaviors behavior = kAccountFor_BudgetBehavior); |
+ |
+ void removeInvalidResource(GrResourceCacheEntry* entry); |
SkTMultiMap<GrResourceCacheEntry, GrResourceKey> fCache; |
// We're an internal doubly linked list |
typedef SkTInternalLList<GrResourceCacheEntry> EntryList; |
EntryList fList; |
+ |
+#ifdef SK_DEBUG |
+ // These objects cannot be returned by a search |
+ EntryList fExclusiveList; |
+#endif |
// our budget, used in purgeAsNeeded() |
int fMaxCount; |
@@ -221,10 +266,14 @@ |
#if GR_CACHE_STATS |
int fHighWaterEntryCount; |
size_t fHighWaterEntryBytes; |
+ int fHighWaterClientDetachedCount; |
+ size_t fHighWaterClientDetachedBytes; |
#endif |
int fEntryCount; |
size_t fEntryBytes; |
+ int fClientDetachedCount; |
+ size_t fClientDetachedBytes; |
// prevents recursive purging |
bool fPurging; |