diff options
Diffstat (limited to 'src')
-rw-r--r-- | src/gpu/GrContext.cpp | 5 | ||||
-rw-r--r-- | src/gpu/GrGpuResourceCacheAccess.h | 12 | ||||
-rw-r--r-- | src/gpu/GrResourceCache.cpp | 19 | ||||
-rw-r--r-- | src/gpu/GrResourceCache.h | 8 |
4 files changed, 42 insertions, 2 deletions
diff --git a/src/gpu/GrContext.cpp b/src/gpu/GrContext.cpp index 93fd324962..56d811761b 100644 --- a/src/gpu/GrContext.cpp +++ b/src/gpu/GrContext.cpp @@ -193,6 +193,11 @@ void GrContext::freeGpuResources() { fResourceCache->purgeAllUnlocked(); } +void GrContext::purgeResourcesNotUsedInMs(std::chrono::milliseconds ms) { + ASSERT_SINGLE_OWNER + fResourceCache->purgeResourcesNotUsedSince(GrStdSteadyClock::now() - ms); +} + void GrContext::getResourceCacheUsage(int* resourceCount, size_t* resourceBytes) const { ASSERT_SINGLE_OWNER diff --git a/src/gpu/GrGpuResourceCacheAccess.h b/src/gpu/GrGpuResourceCacheAccess.h index e91f899cf2..cfc18e75ea 100644 --- a/src/gpu/GrGpuResourceCacheAccess.h +++ b/src/gpu/GrGpuResourceCacheAccess.h @@ -63,6 +63,10 @@ private: SkASSERT(fResource->isPurgeable()); fResource->fExternalFlushCntWhenBecamePurgeable = cnt; } + void setTimeWhenResourceBecomePurgeable() { + SkASSERT(fResource->isPurgeable()); + fResource->fTimeWhenBecamePurgeable = GrStdSteadyClock::now(); + } /** * Called by the cache to determine whether this resource has been puregable for more than * a threshold number of external flushes. @@ -71,6 +75,14 @@ private: SkASSERT(fResource->isPurgeable()); return fResource->fExternalFlushCntWhenBecamePurgeable; } + /** + * Called by the cache to determine whether this resource should be purged based on the length + * of time it has been available for purging. + */ + GrStdSteadyClock::time_point timeWhenResourceBecamePurgeable() { + SkASSERT(fResource->isPurgeable()); + return fResource->fTimeWhenBecamePurgeable; + } int* accessCacheIndex() const { return &fResource->fCacheArrayIndex; } diff --git a/src/gpu/GrResourceCache.cpp b/src/gpu/GrResourceCache.cpp index 9462a7384d..596af6d623 100644 --- a/src/gpu/GrResourceCache.cpp +++ b/src/gpu/GrResourceCache.cpp @@ -365,6 +365,7 @@ void GrResourceCache::notifyCntReachedZero(GrGpuResource* resource, uint32_t fla this->removeFromNonpurgeableArray(resource); fPurgeableQueue.insert(resource); resource->cacheAccess().setFlushCntWhenResourceBecamePurgeable(fExternalFlushCnt); + resource->cacheAccess().setTimeWhenResourceBecomePurgeable(); if (SkBudgeted::kNo == resource->resourcePriv().isBudgeted()) { // Check whether this resource could still be used as a scratch resource. @@ -504,6 +505,24 @@ void GrResourceCache::purgeAllUnlocked() { this->validate(); } +void GrResourceCache::purgeResourcesNotUsedSince(GrStdSteadyClock::time_point purgeTime) { + while (fPurgeableQueue.count()) { + const GrStdSteadyClock::time_point resourceTime = + fPurgeableQueue.peek()->cacheAccess().timeWhenResourceBecamePurgeable(); + if (resourceTime >= purgeTime) { + // Resources were given both LRU timestamps and tagged with a frame number when + // they first became purgeable. The LRU timestamp won't change again until the + // resource is made non-purgeable again. So, at this point all the remaining + // resources in the timestamp-sorted queue will have a frame number >= to this + // one. + break; + } + GrGpuResource* resource = fPurgeableQueue.peek(); + SkASSERT(resource->isPurgeable()); + resource->cacheAccess().release(); + } +} + void GrResourceCache::processInvalidUniqueKeys( const SkTArray<GrUniqueKeyInvalidatedMessage>& msgs) { for (int i = 0; i < msgs.count(); ++i) { diff --git a/src/gpu/GrResourceCache.h b/src/gpu/GrResourceCache.h index 5f08a51aa0..d871c9ad13 100644 --- a/src/gpu/GrResourceCache.h +++ b/src/gpu/GrResourceCache.h @@ -50,8 +50,9 @@ public: static const int kDefaultMaxCount = 2 * (1 << 12); // Default maximum number of bytes of gpu memory of budgeted resources in the cache. static const size_t kDefaultMaxSize = 96 * (1 << 20); - // Default number of external flushes a budgeted resources can go unused in the cache before it - // is purged. Using a value <= 0 disables this feature. + // Default number of external flushes a budgeted resources can go unused in the cache before it + // is purged. Using a value <= 0 disables this feature. This will be removed once Chrome + // starts using time-based purging. static const int kDefaultMaxUnusedFlushes = 1 * /* flushes per frame */ 60 * /* fps */ @@ -159,6 +160,9 @@ public: /** Purges all resources that don't have external owners. */ void purgeAllUnlocked(); + /** Purge all resources not used since the passed in time. */ + void purgeResourcesNotUsedSince(GrStdSteadyClock::time_point); + /** Returns true if the cache would like a flush to occur in order to make more resources purgeable. */ bool requestsFlush() const { return fRequestFlush; } |