Chromium Code Reviews| Index: src/gpu/GrResourceCache.cpp |
| diff --git a/src/gpu/GrResourceCache.cpp b/src/gpu/GrResourceCache.cpp |
| index 8eed4d4b7d5f36f0855af7f5d64a4f318d0ffcbc..20b82eceae5e707e84163740394985b5ec0d6f8e 100644 |
| --- a/src/gpu/GrResourceCache.cpp |
| +++ b/src/gpu/GrResourceCache.cpp |
| @@ -35,14 +35,10 @@ GrResourceKey::ResourceType GrResourceKey::GenerateResourceType() { |
| /////////////////////////////////////////////////////////////////////////////// |
| -GrResourceCacheEntry::GrResourceCacheEntry(GrResourceCache* resourceCache, |
| - const GrResourceKey& key, |
| - GrGpuResource* resource) |
| +GrResourceCacheEntry::GrResourceCacheEntry(GrResourceCache* resourceCache, GrGpuResource* resource) |
| : fResourceCache(resourceCache), |
| - fKey(key), |
| fResource(resource), |
| - fCachedSize(resource->gpuMemorySize()), |
| - fIsExclusive(false) { |
| + fCachedSize(resource->gpuMemorySize()) { |
| // we assume ownership of the resource, and will unref it when we die |
| SkASSERT(resource); |
| resource->ref(); |
| @@ -103,9 +99,6 @@ GrResourceCache::~GrResourceCache() { |
| while (GrResourceCacheEntry* entry = fList.head()) { |
| GrAutoResourceCacheValidate atcv(this); |
| - // remove from our cache |
| - fCache.remove(entry->fKey, entry); |
| - |
| // remove from our llist |
| this->internalDetach(entry); |
| @@ -155,16 +148,6 @@ void GrResourceCache::attachToHead(GrResourceCacheEntry* entry) { |
| #endif |
| } |
| -// This functor just searches for an entry with only a single ref (from |
| -// the texture cache itself). Presumably in this situation no one else |
| -// is relying on the texture. |
| -class GrTFindUnreffedFunctor { |
| -public: |
| - bool operator()(const GrResourceCacheEntry* entry) const { |
| - return entry->resource()->isPurgable(); |
| - } |
| -}; |
| - |
| void GrResourceCache::makeResourceMRU(GrGpuResource* resource) { |
| GrResourceCacheEntry* entry = resource->getCacheEntry(); |
| @@ -178,11 +161,13 @@ void GrResourceCache::notifyPurgable(const GrGpuResource* resource) { |
| // Remove scratch textures from the cache the moment they become purgeable if |
| // scratch texture reuse is turned off. |
| SkASSERT(resource->getCacheEntry()); |
| - if (resource->getCacheEntry()->key().getResourceType() == GrTexturePriv::ResourceType() && |
| - resource->getCacheEntry()->key().isScratch() && |
| - !fCaps->reuseScratchTextures() && |
| - !(static_cast<const GrSurface*>(resource)->desc().fFlags & kRenderTarget_GrSurfaceFlag)) { |
| - this->deleteResource(resource->getCacheEntry()); |
| + if (resource->isScratch()) { |
| + const GrResourceKey& key = resource->getScratchKey(); |
| + if (key.getResourceType() == GrTexturePriv::ResourceType() && |
| + !fCaps->reuseScratchTextures() && |
| + !(static_cast<const GrSurface*>(resource)->desc().fFlags & kRenderTarget_GrSurfaceFlag)) { |
| + this->deleteResource(resource->getCacheEntry()); |
| + } |
| } |
| } |
| @@ -190,6 +175,14 @@ bool GrResourceCache::addResource(const GrResourceKey& key, GrGpuResource* resou |
| if (NULL != resource->getCacheEntry()) { |
| return false; |
| } |
| + |
| + if (key.isScratch()) { |
| + SkASSERT(resource->isScratch() && key == resource->getScratchKey()); |
| + } else { |
| + if (!resource->setContentKey(key)) { |
| + return false; |
| + } |
| + } |
| // we don't expect to create new resources during a purge. In theory |
| // this could cause purgeAsNeeded() into an infinite loop (e.g. |
| @@ -198,15 +191,10 @@ bool GrResourceCache::addResource(const GrResourceKey& key, GrGpuResource* resou |
| SkASSERT(!fPurging); |
| GrAutoResourceCacheValidate atcv(this); |
| - GrResourceCacheEntry* entry = SkNEW_ARGS(GrResourceCacheEntry, (this, key, resource)); |
| - if (!resource->setCacheEntry(entry)) { |
| - SkDELETE(entry); |
| - this->purgeAsNeeded(); |
| - return false; |
| - } |
| + GrResourceCacheEntry* entry = SkNEW_ARGS(GrResourceCacheEntry, (this, resource)); |
| + resource->setCacheEntry(entry); |
| this->attachToHead(entry); |
| - fCache.insert(key, entry); |
| this->purgeAsNeeded(); |
| return true; |
| } |
| @@ -244,8 +232,6 @@ void GrResourceCache::purgeAsNeeded(int extraCount, size_t extraBytes) { |
| fPurging = true; |
| - this->purgeInvalidated(); |
| - |
| this->internalPurge(extraCount, extraBytes); |
| if (((fEntryCount+extraCount) > fMaxCount || |
| (fEntryBytes+extraBytes) > fMaxBytes) && |
| @@ -261,22 +247,11 @@ void GrResourceCache::purgeAsNeeded(int extraCount, size_t extraBytes) { |
| } |
| void GrResourceCache::purgeInvalidated() { |
| - SkTDArray<GrResourceInvalidatedMessage> invalidated; |
| - fInvalidationInbox.poll(&invalidated); |
| - |
| - for (int i = 0; i < invalidated.count(); i++) { |
| - while (GrResourceCacheEntry* entry = fCache.find(invalidated[i].key, GrTFindUnreffedFunctor())) { |
| - this->deleteResource(entry); |
| - } |
| - } |
| + // TODO: Implement this in GrResourceCache2. |
|
bsalomon
2014/11/10 18:38:51
I won't land this until there is a follow up CL re
|
| } |
| void GrResourceCache::deleteResource(GrResourceCacheEntry* entry) { |
| SkASSERT(entry->fResource->isPurgable()); |
| - |
| - // remove from our cache |
| - fCache.remove(entry->key(), entry); |
| - |
| // remove from our llist |
| this->internalDetach(entry); |
| delete entry; |
| @@ -333,12 +308,6 @@ void GrResourceCache::purgeAllUnlocked() { |
| fMaxCount = 0; |
| this->purgeAsNeeded(); |
| -#ifdef SK_DEBUG |
| - if (!fCache.count()) { |
| - SkASSERT(fList.isEmpty()); |
| - } |
| -#endif |
| - |
| fMaxBytes = savedMaxBytes; |
| fMaxCount = savedMaxCount; |
| } |
| @@ -367,7 +336,6 @@ static bool both_zero_or_nonzero(int count, size_t bytes) { |
| void GrResourceCache::validate() const { |
| fList.validate(); |
| SkASSERT(both_zero_or_nonzero(fEntryCount, fEntryBytes)); |
| - SkASSERT(fEntryCount == fCache.count()); |
| EntryList::Iter iter; |
| @@ -378,7 +346,6 @@ void GrResourceCache::validate() const { |
| int count = 0; |
| for ( ; entry; entry = iter.next()) { |
| entry->validate(); |
| - SkASSERT(fCache.find(entry->key())); |
| count += 1; |
| } |
| SkASSERT(count == fEntryCount); |