Index: src/gpu/GrResourceCache.h |
diff --git a/src/gpu/GrResourceCache.h b/src/gpu/GrResourceCache.h |
index d6cdf81612205235060502b17f2e13f06b308f47..ae9a4e7ee7e3bae513b5503083209b96e1d8fb74 100644 |
--- a/src/gpu/GrResourceCache.h |
+++ b/src/gpu/GrResourceCache.h |
@@ -13,9 +13,7 @@ |
#include "GrGpuResourcePriv.h" |
#include "GrResourceCache.h" |
#include "GrResourceKey.h" |
-#include "SkChunkAlloc.h" |
#include "SkMessageBus.h" |
-#include "SkRandom.h" |
#include "SkRefCnt.h" |
#include "SkTArray.h" |
#include "SkTDPQueue.h" |
@@ -139,7 +137,13 @@ |
/** |
* Find a resource that matches a unique key. |
*/ |
- GrGpuResource* findAndRefUniqueResource(const GrUniqueKey& key); |
+ GrGpuResource* findAndRefUniqueResource(const GrUniqueKey& key) { |
+ GrGpuResource* resource = fUniqueHash.find(key); |
+ if (resource) { |
+ this->refAndMakeResourceMRU(resource); |
+ } |
+ return resource; |
+ } |
/** |
* Query whether a unique key exists in the cache. |
@@ -150,19 +154,14 @@ |
/** Purges resources to become under budget and processes resources with invalidated unique |
keys. */ |
- void purgeAsNeeded() { this->internalPurgeAsNeeded(false); } |
+ void purgeAsNeeded(); |
/** Purges all resources that don't have external owners. */ |
void purgeAllUnlocked(); |
/** Returns true if the cache would like a flush to occur in order to make more resources |
purgeable. */ |
- bool requestsFlush() const { |
- // When in random replacement mode we request a flush in order to make as many resources |
- // as possible subject to replacement. |
- return this->overBudget() && (ReplacementStrategy::kRandom == fStrategy || |
- 0 == fPurgeableQueue.count()); |
- } |
+ bool requestsFlush() const { return fRequestFlush; } |
enum FlushType { |
kExternal, |
@@ -233,14 +232,10 @@ |
void refAndMakeResourceMRU(GrGpuResource*); |
/// @} |
- void internalPurgeAsNeeded(bool fromFlushNotification); |
void processInvalidUniqueKeys(const SkTArray<GrUniqueKeyInvalidatedMessage>&); |
void addToNonpurgeableArray(GrGpuResource*); |
void removeFromNonpurgeableArray(GrGpuResource*); |
bool overBudget() const { return fBudgetedBytes > fMaxBytes || fBudgetedCount > fMaxCount; } |
- GrGpuResource* selectResourceUsingStrategy(); |
- void recordPurgedKey(GrGpuResource*); |
- void recordKeyMiss(const GrUniqueKey&); |
bool wouldFit(size_t bytes) { |
return fBudgetedBytes+bytes <= fMaxBytes && fBudgetedCount+1 <= fMaxCount; |
@@ -259,26 +254,21 @@ |
class AvailableForScratchUse; |
- struct HashTraitsBase { |
- static uint32_t Hash(const GrResourceKey& key) { return key.hash(); } |
- }; |
- |
- struct ScratchMapTraits : public HashTraitsBase { |
+ struct ScratchMapTraits { |
static const GrScratchKey& GetKey(const GrGpuResource& r) { |
return r.resourcePriv().getScratchKey(); |
} |
+ |
+ static uint32_t Hash(const GrScratchKey& key) { return key.hash(); } |
}; |
typedef SkTMultiMap<GrGpuResource, GrScratchKey, ScratchMapTraits> ScratchMap; |
- struct UniqueHashTraits : public HashTraitsBase { |
+ struct UniqueHashTraits { |
static const GrUniqueKey& GetKey(const GrGpuResource& r) { return r.getUniqueKey(); } |
+ |
+ static uint32_t Hash(const GrUniqueKey& key) { return key.hash(); } |
}; |
typedef SkTDynamicHash<GrGpuResource, GrUniqueKey, UniqueHashTraits> UniqueHash; |
- |
- struct UniqueSetTraits : public HashTraitsBase { |
- static const GrUniqueKey& GetKey(const GrUniqueKey& key) { return key; } |
- }; |
- typedef SkTDynamicHash<GrUniqueKey, GrUniqueKey, UniqueSetTraits> UniqueKeySet; |
static bool CompareTimestamp(GrGpuResource* const& a, GrGpuResource* const& b) { |
return a->cacheAccess().timestamp() < b->cacheAccess().timestamp(); |
@@ -287,22 +277,6 @@ |
static int* AccessResourceIndex(GrGpuResource* const& res) { |
return res->cacheAccess().accessCacheIndex(); |
} |
- |
- /** |
- * The resource cache chooses one of these replacement strategies based on a "strategy score" |
- * updated after each external flush based on unique key cache misses. |
- */ |
- enum class ReplacementStrategy { |
- kLRU, |
- kRandom |
- }; |
- /** |
- * When the current strategy score is >=0 LRU is chosen, when it is < 0 random is chosen. The |
- * absolute value of the score moves by 1 each flush. |
- */ |
- static constexpr int kStrategyScoreMin = -5; |
- static constexpr int kStrategyScoreMax = 4; |
- static constexpr int kInitialStrategyScore = 2; |
typedef SkMessageBus<GrUniqueKeyInvalidatedMessage>::Inbox InvalidUniqueKeyInbox; |
typedef SkTDPQueue<GrGpuResource*, CompareTimestamp, AccessResourceIndex> PurgeableQueue; |
@@ -325,17 +299,6 @@ |
size_t fMaxBytes; |
int fMaxUnusedFlushes; |
- // Data related to replacement strategy. |
- SkRandom fRandom; |
- ReplacementStrategy fStrategy; |
- int fStrategyScore; |
- int fTotalMissesThisFlush; |
- int fMissesThisFlushPurgedRecently; |
- UniqueKeySet fUniqueKeysPurgedThisFlush[2]; |
- // These are pointers to SkChunckAlloc because of gcc bug 63707 |
- SkChunkAlloc* fUniqueKeysPurgedThisFlushStorage[2]; |
- int fFlushParity; |
- |
#if GR_CACHE_STATS |
int fHighWaterCount; |
size_t fHighWaterBytes; |
@@ -351,9 +314,8 @@ |
int fBudgetedCount; |
size_t fBudgetedBytes; |
+ bool fRequestFlush; |
uint32_t fExternalFlushCnt; |
- |
- bool fIsPurging; |
InvalidUniqueKeyInbox fInvalidUniqueKeyInbox; |