| Index: src/gpu/GrResourceCache.h
|
| diff --git a/src/gpu/GrResourceCache.h b/src/gpu/GrResourceCache.h
|
| index 83337805a42f1c3a021f9ff61f4276b3cfe32316..f6d064af395be1f44691c4d326efc676ca70db88 100644
|
| --- a/src/gpu/GrResourceCache.h
|
| +++ b/src/gpu/GrResourceCache.h
|
| @@ -6,11 +6,10 @@
|
| * found in the LICENSE file.
|
| */
|
|
|
| -
|
| -
|
| #ifndef GrResourceCache_DEFINED
|
| #define GrResourceCache_DEFINED
|
|
|
| +#include "GrDrawTargetCaps.h"
|
| #include "GrResourceKey.h"
|
| #include "SkTMultiMap.h"
|
| #include "SkMessageBus.h"
|
| @@ -88,7 +87,7 @@ private:
|
| */
|
| class GrResourceCache {
|
| public:
|
| - GrResourceCache(int maxCount, size_t maxBytes);
|
| + GrResourceCache(const GrDrawTargetCaps*, int maxCount, size_t maxBytes);
|
| ~GrResourceCache();
|
|
|
| /**
|
| @@ -141,26 +140,16 @@ public:
|
| */
|
| 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.
|
| - * 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);
|
| + GrGpuResource* find(const GrResourceKey& key);
|
| +
|
| + void makeResourceMRU(GrGpuResource*);
|
| +
|
| + /** Called by GrGpuResources when they detects that they are newly purgable. */
|
| + void notifyPurgable(const GrGpuResource*);
|
|
|
| /**
|
| * Add the new resource to the cache (by creating a new cache entry based
|
| @@ -168,14 +157,8 @@ public:
|
| *
|
| * Ownership of the resource is transferred to the resource cache,
|
| * which will unref() it when it is purged or deleted.
|
| - *
|
| - * 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);
|
| + void addResource(const GrResourceKey& key, GrGpuResource* resource);
|
|
|
| /**
|
| * Determines if the cache contains an entry matching a key. If a matching
|
| @@ -184,20 +167,6 @@ public:
|
| 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.
|
| */
|
| void didIncreaseResourceSize(const GrResourceCacheEntry*, size_t amountInc);
|
| @@ -237,59 +206,45 @@ public:
|
| #endif
|
|
|
| private:
|
| - enum BudgetBehaviors {
|
| - kAccountFor_BudgetBehavior,
|
| - kIgnore_BudgetBehavior
|
| - };
|
| -
|
| - void internalDetach(GrResourceCacheEntry*, BudgetBehaviors behavior = kAccountFor_BudgetBehavior);
|
| - void attachToHead(GrResourceCacheEntry*, BudgetBehaviors behavior = kAccountFor_BudgetBehavior);
|
| -
|
| - void removeInvalidResource(GrResourceCacheEntry* entry);
|
| + void internalDetach(GrResourceCacheEntry*);
|
| + void attachToHead(GrResourceCacheEntry*);
|
| + void purgeInvalidated();
|
| + void internalPurge(int extraCount, size_t extraBytes);
|
| +#ifdef SK_DEBUG
|
| + static size_t countBytes(const SkTInternalLList<GrResourceCacheEntry>& list);
|
| +#endif
|
|
|
| - SkTMultiMap<GrResourceCacheEntry, GrResourceKey> fCache;
|
| + typedef SkTMultiMap<GrResourceCacheEntry, GrResourceKey> CacheMap;
|
| + CacheMap 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
|
| + EntryList fList;
|
|
|
| // our budget, used in purgeAsNeeded()
|
| - int fMaxCount;
|
| - size_t fMaxBytes;
|
| + int fMaxCount;
|
| + size_t fMaxBytes;
|
|
|
| // our current stats, related to our budget
|
| #if GR_CACHE_STATS
|
| - int fHighWaterEntryCount;
|
| - size_t fHighWaterEntryBytes;
|
| - int fHighWaterClientDetachedCount;
|
| - size_t fHighWaterClientDetachedBytes;
|
| + int fHighWaterEntryCount;
|
| + size_t fHighWaterEntryBytes;
|
| #endif
|
|
|
| - int fEntryCount;
|
| - size_t fEntryBytes;
|
| - int fClientDetachedCount;
|
| - size_t fClientDetachedBytes;
|
| + int fEntryCount;
|
| + size_t fEntryBytes;
|
|
|
| // prevents recursive purging
|
| - bool fPurging;
|
| + bool fPurging;
|
|
|
| - PFOverbudgetCB fOverbudgetCB;
|
| - void* fOverbudgetData;
|
| + PFOverbudgetCB fOverbudgetCB;
|
| + void* fOverbudgetData;
|
|
|
| - void internalPurge(int extraCount, size_t extraBytes);
|
| + SkAutoTUnref<const GrDrawTargetCaps> fCaps;
|
|
|
| // Listen for messages that a resource has been invalidated and purge cached junk proactively.
|
| - SkMessageBus<GrResourceInvalidatedMessage>::Inbox fInvalidationInbox;
|
| - void purgeInvalidated();
|
| -
|
| -#ifdef SK_DEBUG
|
| - static size_t countBytes(const SkTInternalLList<GrResourceCacheEntry>& list);
|
| -#endif
|
| + typedef SkMessageBus<GrResourceInvalidatedMessage>::Inbox Inbox;
|
| + Inbox fInvalidationInbox;
|
| };
|
|
|
| ///////////////////////////////////////////////////////////////////////////////
|
|
|