Index: src/gpu/GrResourceCache2.h |
diff --git a/src/gpu/GrResourceCache2.h b/src/gpu/GrResourceCache2.h |
deleted file mode 100644 |
index e844f11e6a17be6ccd99bd8db63919dd7e0c7908..0000000000000000000000000000000000000000 |
--- a/src/gpu/GrResourceCache2.h |
+++ /dev/null |
@@ -1,328 +0,0 @@ |
- |
-/* |
- * Copyright 2014 Google Inc. |
- * |
- * Use of this source code is governed by a BSD-style license that can be |
- * found in the LICENSE file. |
- */ |
- |
-#ifndef GrResourceCache2_DEFINED |
-#define GrResourceCache2_DEFINED |
- |
-#include "GrGpuResource.h" |
-#include "GrGpuResourceCacheAccess.h" |
-#include "GrResourceKey.h" |
-#include "SkMessageBus.h" |
-#include "SkRefCnt.h" |
-#include "SkTArray.h" |
-#include "SkTInternalLList.h" |
-#include "SkTMultiMap.h" |
- |
-class SkString; |
- |
-/** |
- * Manages the lifetime of all GrGpuResource instances. |
- * |
- * Resources may have optionally have two types of keys: |
- * 1) A scratch key. This is for resources whose allocations are cached but not their contents. |
- * Multiple resources can share the same scratch key. This is so a caller can have two |
- * resource instances with the same properties (e.g. multipass rendering that ping-pongs |
- * between two temporary surfaces. The scratch key is set at resource creation time and |
- * should never change. Resources need not have a scratch key. |
- * 2) A content key. This key represents the contents of the resource rather than just its |
- * allocation properties. They may not collide. The content key can be set after resource |
- * creation. Currently it may only be set once and cannot be cleared. This restriction will |
- * be removed. |
- * If a resource has neither key type then it will be deleted as soon as the last reference to it |
- * is dropped. If a key has both keys the content key takes precedence. |
- */ |
-class GrResourceCache2 { |
-public: |
- GrResourceCache2(); |
- ~GrResourceCache2(); |
- |
- /** Used to access functionality needed by GrGpuResource for lifetime management. */ |
- class ResourceAccess; |
- ResourceAccess resourceAccess(); |
- |
- /** |
- * Sets the cache limits in terms of number of resources and max gpu memory byte size. |
- */ |
- void setLimits(int count, size_t bytes); |
- |
- /** |
- * Returns the number of resources. |
- */ |
- int getResourceCount() const { return fCount; } |
- |
- /** |
- * Returns the number of resources that count against the budget. |
- */ |
- int getBudgetedResourceCount() const { return fBudgetedCount; } |
- |
- /** |
- * Returns the number of bytes consumed by resources. |
- */ |
- size_t getResourceBytes() const { return fBytes; } |
- |
- /** |
- * Returns the number of bytes consumed by budgeted resources. |
- */ |
- size_t getBudgetedResourceBytes() const { return fBudgetedBytes; } |
- |
- /** |
- * Returns the cached resources count budget. |
- */ |
- int getMaxResourceCount() const { return fMaxCount; } |
- |
- /** |
- * Returns the number of bytes consumed by cached resources. |
- */ |
- size_t getMaxResourceBytes() const { return fMaxBytes; } |
- |
- /** |
- * Abandons the backend API resources owned by all GrGpuResource objects and removes them from |
- * the cache. |
- */ |
- void abandonAll(); |
- |
- /** |
- * Releases the backend API resources owned by all GrGpuResource objects and removes them from |
- * the cache. |
- */ |
- void releaseAll(); |
- |
- enum { |
- /** Preferentially returns scratch resources with no pending IO. */ |
- kPreferNoPendingIO_ScratchFlag = 0x1, |
- /** Will not return any resources that match but have pending IO. */ |
- kRequireNoPendingIO_ScratchFlag = 0x2, |
- }; |
- |
- /** |
- * Find a resource that matches a scratch key. |
- */ |
- GrGpuResource* findAndRefScratchResource(const GrScratchKey& scratchKey, uint32_t flags = 0); |
- |
-#ifdef SK_DEBUG |
- // This is not particularly fast and only used for validation, so debug only. |
- int countScratchEntriesForKey(const GrScratchKey& scratchKey) const { |
- return fScratchMap.countForKey(scratchKey); |
- } |
-#endif |
- |
- /** |
- * Find a resource that matches a content key. |
- */ |
- GrGpuResource* findAndRefContentResource(const GrContentKey& contentKey) { |
- GrGpuResource* resource = fContentHash.find(contentKey); |
- if (resource) { |
- resource->ref(); |
- this->makeResourceMRU(resource); |
- } |
- return resource; |
- } |
- |
- /** |
- * Query whether a content key exists in the cache. |
- */ |
- bool hasContentKey(const GrContentKey& contentKey) const { |
- return SkToBool(fContentHash.find(contentKey)); |
- } |
- |
- /** Purges resources to become under budget and processes resources with invalidated content |
- keys. */ |
- void purgeAsNeeded() { |
- SkTArray<GrContentKeyInvalidatedMessage> invalidKeyMsgs; |
- fInvalidContentKeyInbox.poll(&invalidKeyMsgs); |
- if (invalidKeyMsgs.count()) { |
- this->processInvalidContentKeys(invalidKeyMsgs); |
- } |
- if (fPurging || (fBudgetedCount <= fMaxCount && fBudgetedBytes <= fMaxBytes)) { |
- return; |
- } |
- this->internalPurgeAsNeeded(); |
- } |
- |
- /** Purges all resources that don't have external owners. */ |
- void purgeAllUnlocked(); |
- |
- /** |
- * The callback function used by the cache when it is still over budget after a purge. The |
- * passed in 'data' is the same 'data' handed to setOverbudgetCallback. |
- */ |
- typedef void (*PFOverBudgetCB)(void* data); |
- |
- /** |
- * Set the callback the cache should use when it is still over budget after a purge. The 'data' |
- * provided here will be passed back to the callback. Note that the cache will attempt to purge |
- * any resources newly freed by the callback. |
- */ |
- void setOverBudgetCallback(PFOverBudgetCB overBudgetCB, void* data) { |
- fOverBudgetCB = overBudgetCB; |
- fOverBudgetData = data; |
- } |
- |
-#if GR_GPU_STATS |
- void dumpStats(SkString*) const; |
-#endif |
- |
-private: |
- /////////////////////////////////////////////////////////////////////////// |
- /// @name Methods accessible via ResourceAccess |
- //// |
- void insertResource(GrGpuResource*); |
- void removeResource(GrGpuResource*); |
- void notifyPurgeable(GrGpuResource*); |
- void didChangeGpuMemorySize(const GrGpuResource*, size_t oldSize); |
- bool didSetContentKey(GrGpuResource*); |
- void willRemoveScratchKey(const GrGpuResource*); |
- void willRemoveContentKey(const GrGpuResource*); |
- void didChangeBudgetStatus(GrGpuResource*); |
- void makeResourceMRU(GrGpuResource*); |
- /// @} |
- |
- void internalPurgeAsNeeded(); |
- void processInvalidContentKeys(const SkTArray<GrContentKeyInvalidatedMessage>&); |
- |
-#ifdef SK_DEBUG |
- bool isInCache(const GrGpuResource* r) const { return fResources.isInList(r); } |
- void validate() const; |
-#else |
- void validate() const {} |
-#endif |
- |
- class AutoValidate; |
- |
- class AvailableForScratchUse; |
- |
- struct ScratchMapTraits { |
- static const GrScratchKey& GetKey(const GrGpuResource& r) { |
- return r.cacheAccess().getScratchKey(); |
- } |
- |
- static uint32_t Hash(const GrScratchKey& key) { return key.hash(); } |
- }; |
- typedef SkTMultiMap<GrGpuResource, GrScratchKey, ScratchMapTraits> ScratchMap; |
- |
- struct ContentHashTraits { |
- static const GrContentKey& GetKey(const GrGpuResource& r) { |
- return r.getContentKey(); |
- } |
- |
- static uint32_t Hash(const GrContentKey& key) { return key.hash(); } |
- }; |
- typedef SkTDynamicHash<GrGpuResource, GrContentKey, ContentHashTraits> ContentHash; |
- |
- typedef SkTInternalLList<GrGpuResource> ResourceList; |
- |
- typedef SkMessageBus<GrContentKeyInvalidatedMessage>::Inbox InvalidContentKeyInbox; |
- |
- ResourceList fResources; |
- // This map holds all resources that can be used as scratch resources. |
- ScratchMap fScratchMap; |
- // This holds all resources that have content keys. |
- ContentHash fContentHash; |
- |
- // our budget, used in purgeAsNeeded() |
- int fMaxCount; |
- size_t fMaxBytes; |
- |
-#if GR_CACHE_STATS |
- int fHighWaterCount; |
- size_t fHighWaterBytes; |
- int fBudgetedHighWaterCount; |
- size_t fBudgetedHighWaterBytes; |
-#endif |
- |
- // our current stats for all resources |
- int fCount; |
- size_t fBytes; |
- |
- // our current stats for resources that count against the budget |
- int fBudgetedCount; |
- size_t fBudgetedBytes; |
- |
- // prevents recursive purging |
- bool fPurging; |
- bool fNewlyPurgeableResourceWhilePurging; |
- |
- PFOverBudgetCB fOverBudgetCB; |
- void* fOverBudgetData; |
- |
- InvalidContentKeyInbox fInvalidContentKeyInbox; |
- |
-}; |
- |
-class GrResourceCache2::ResourceAccess { |
-private: |
- ResourceAccess(GrResourceCache2* cache) : fCache(cache) { } |
- ResourceAccess(const ResourceAccess& that) : fCache(that.fCache) { } |
- ResourceAccess& operator=(const ResourceAccess&); // unimpl |
- |
- /** |
- * Insert a resource into the cache. |
- */ |
- void insertResource(GrGpuResource* resource) { fCache->insertResource(resource); } |
- |
- /** |
- * Removes a resource from the cache. |
- */ |
- void removeResource(GrGpuResource* resource) { fCache->removeResource(resource); } |
- |
- /** |
- * Called by GrGpuResources when they detects that they are newly purgeable. |
- */ |
- void notifyPurgeable(GrGpuResource* resource) { fCache->notifyPurgeable(resource); } |
- |
- /** |
- * Called by GrGpuResources when their sizes change. |
- */ |
- void didChangeGpuMemorySize(const GrGpuResource* resource, size_t oldSize) { |
- fCache->didChangeGpuMemorySize(resource, oldSize); |
- } |
- |
- /** |
- * Called by GrGpuResources when their content keys change. |
- * |
- * This currently returns a bool and fails when an existing resource has a key that collides |
- * with the new content key. In the future it will null out the content key for the existing |
- * resource. The failure is a temporary measure taken because duties are split between two |
- * cache objects currently. |
- */ |
- bool didSetContentKey(GrGpuResource* resource) { return fCache->didSetContentKey(resource); } |
- |
- /** |
- * Called by a GrGpuResource when it removes its content key. |
- */ |
- void willRemoveContentKey(GrGpuResource* resource) { |
- return fCache->willRemoveContentKey(resource); |
- } |
- |
- /** |
- * Called by a GrGpuResource when it removes its scratch key. |
- */ |
- void willRemoveScratchKey(const GrGpuResource* resource) { |
- fCache->willRemoveScratchKey(resource); |
- } |
- |
- /** |
- * Called by GrGpuResources when they change from budgeted to unbudgeted or vice versa. |
- */ |
- void didChangeBudgetStatus(GrGpuResource* resource) { fCache->didChangeBudgetStatus(resource); } |
- |
- // No taking addresses of this type. |
- const ResourceAccess* operator&() const; |
- ResourceAccess* operator&(); |
- |
- GrResourceCache2* fCache; |
- |
- friend class GrGpuResource; // To access all the proxy inline methods. |
- friend class GrResourceCache2; // To create this type. |
-}; |
- |
-inline GrResourceCache2::ResourceAccess GrResourceCache2::resourceAccess() { |
- return ResourceAccess(this); |
-} |
- |
-#endif |