| OLD | NEW |
| 1 | 1 |
| 2 /* | 2 /* |
| 3 * Copyright 2010 Google Inc. | 3 * Copyright 2010 Google Inc. |
| 4 * | 4 * |
| 5 * Use of this source code is governed by a BSD-style license that can be | 5 * Use of this source code is governed by a BSD-style license that can be |
| 6 * found in the LICENSE file. | 6 * found in the LICENSE file. |
| 7 */ | 7 */ |
| 8 | 8 |
| 9 #include "GrResourceCache.h" | 9 #include "GrResourceCache.h" |
| 10 #include "GrGpuResource.h" | 10 #include "GrGpuResource.h" |
| (...skipping 31 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 42 fKey(key), | 42 fKey(key), |
| 43 fResource(resource), | 43 fResource(resource), |
| 44 fCachedSize(resource->gpuMemorySize()), | 44 fCachedSize(resource->gpuMemorySize()), |
| 45 fIsExclusive(false) { | 45 fIsExclusive(false) { |
| 46 // we assume ownership of the resource, and will unref it when we die | 46 // we assume ownership of the resource, and will unref it when we die |
| 47 SkASSERT(resource); | 47 SkASSERT(resource); |
| 48 resource->ref(); | 48 resource->ref(); |
| 49 } | 49 } |
| 50 | 50 |
| 51 GrResourceCacheEntry::~GrResourceCacheEntry() { | 51 GrResourceCacheEntry::~GrResourceCacheEntry() { |
| 52 fResource->setCacheEntry(NULL); | 52 // We're relying on having the cache entry to remove this from GrResourceCac
he2's content hash. |
| 53 // fResource->setCacheEntry(NULL); |
| 53 fResource->unref(); | 54 fResource->unref(); |
| 54 } | 55 } |
| 55 | 56 |
| 56 #ifdef SK_DEBUG | 57 #ifdef SK_DEBUG |
| 57 void GrResourceCacheEntry::validate() const { | 58 void GrResourceCacheEntry::validate() const { |
| 58 SkASSERT(fResourceCache); | 59 SkASSERT(fResourceCache); |
| 59 SkASSERT(fResource); | 60 SkASSERT(fResource); |
| 60 SkASSERT(fResource->getCacheEntry() == this); | 61 SkASSERT(fResource->getCacheEntry() == this); |
| 61 SkASSERT(fResource->gpuMemorySize() == fCachedSize); | 62 SkASSERT(fResource->gpuMemorySize() == fCachedSize); |
| 62 fResource->validate(); | 63 fResource->validate(); |
| (...skipping 115 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 178 // scratch texture reuse is turned off. | 179 // scratch texture reuse is turned off. |
| 179 SkASSERT(resource->getCacheEntry()); | 180 SkASSERT(resource->getCacheEntry()); |
| 180 if (resource->getCacheEntry()->key().getResourceType() == GrTexturePriv::Res
ourceType() && | 181 if (resource->getCacheEntry()->key().getResourceType() == GrTexturePriv::Res
ourceType() && |
| 181 resource->getCacheEntry()->key().isScratch() && | 182 resource->getCacheEntry()->key().isScratch() && |
| 182 !fCaps->reuseScratchTextures() && | 183 !fCaps->reuseScratchTextures() && |
| 183 !(static_cast<const GrSurface*>(resource)->desc().fFlags & kRenderTarget
_GrSurfaceFlag)) { | 184 !(static_cast<const GrSurface*>(resource)->desc().fFlags & kRenderTarget
_GrSurfaceFlag)) { |
| 184 this->deleteResource(resource->getCacheEntry()); | 185 this->deleteResource(resource->getCacheEntry()); |
| 185 } | 186 } |
| 186 } | 187 } |
| 187 | 188 |
| 188 GrGpuResource* GrResourceCache::find(const GrResourceKey& key) { | 189 bool GrResourceCache::addResource(const GrResourceKey& key, GrGpuResource* resou
rce) { |
| 189 // GrResourceCache2 is responsible for scratch resources. | 190 if (NULL != resource->getCacheEntry()) { |
| 190 SkASSERT(!key.isScratch()); | 191 return false; |
| 191 | |
| 192 GrAutoResourceCacheValidate atcv(this); | |
| 193 | |
| 194 GrResourceCacheEntry* entry = fCache.find(key); | |
| 195 if (NULL == entry) { | |
| 196 return NULL; | |
| 197 } | 192 } |
| 198 | 193 |
| 199 // Make this resource MRU | |
| 200 this->internalDetach(entry); | |
| 201 this->attachToHead(entry); | |
| 202 | |
| 203 return entry->fResource; | |
| 204 } | |
| 205 | |
| 206 void GrResourceCache::addResource(const GrResourceKey& key, GrGpuResource* resou
rce) { | |
| 207 SkASSERT(NULL == resource->getCacheEntry()); | |
| 208 // we don't expect to create new resources during a purge. In theory | 194 // we don't expect to create new resources during a purge. In theory |
| 209 // this could cause purgeAsNeeded() into an infinite loop (e.g. | 195 // this could cause purgeAsNeeded() into an infinite loop (e.g. |
| 210 // each resource destroyed creates and locks 2 resources and | 196 // each resource destroyed creates and locks 2 resources and |
| 211 // unlocks 1 thereby causing a new purge). | 197 // unlocks 1 thereby causing a new purge). |
| 212 SkASSERT(!fPurging); | 198 SkASSERT(!fPurging); |
| 213 GrAutoResourceCacheValidate atcv(this); | 199 GrAutoResourceCacheValidate atcv(this); |
| 214 | 200 |
| 215 GrResourceCacheEntry* entry = SkNEW_ARGS(GrResourceCacheEntry, (this, key, r
esource)); | 201 GrResourceCacheEntry* entry = SkNEW_ARGS(GrResourceCacheEntry, (this, key, r
esource)); |
| 216 resource->setCacheEntry(entry); | 202 if (!resource->setCacheEntry(entry)) { |
| 203 SkDELETE(entry); |
| 204 this->purgeAsNeeded(); |
| 205 return false; |
| 206 } |
| 217 | 207 |
| 218 this->attachToHead(entry); | 208 this->attachToHead(entry); |
| 219 fCache.insert(key, entry); | 209 fCache.insert(key, entry); |
| 220 | |
| 221 this->purgeAsNeeded(); | 210 this->purgeAsNeeded(); |
| 211 return true; |
| 222 } | 212 } |
| 223 | 213 |
| 224 void GrResourceCache::didIncreaseResourceSize(const GrResourceCacheEntry* entry,
size_t amountInc) { | 214 void GrResourceCache::didIncreaseResourceSize(const GrResourceCacheEntry* entry,
size_t amountInc) { |
| 225 fEntryBytes += amountInc; | 215 fEntryBytes += amountInc; |
| 226 this->purgeAsNeeded(); | 216 this->purgeAsNeeded(); |
| 227 } | 217 } |
| 228 | 218 |
| 229 void GrResourceCache::didDecreaseResourceSize(const GrResourceCacheEntry* entry,
size_t amountDec) { | 219 void GrResourceCache::didDecreaseResourceSize(const GrResourceCacheEntry* entry,
size_t amountDec) { |
| 230 fEntryBytes -= amountDec; | 220 fEntryBytes -= amountDec; |
| 231 #ifdef SK_DEBUG | 221 #ifdef SK_DEBUG |
| (...skipping 192 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 424 SkDebugf("Budget: %d items %d bytes\n", fMaxCount, fMaxBytes); | 414 SkDebugf("Budget: %d items %d bytes\n", fMaxCount, fMaxBytes); |
| 425 SkDebugf("\t\tEntry Count: current %d (%d locked, %d scratch %.2g%% full), h
igh %d\n", | 415 SkDebugf("\t\tEntry Count: current %d (%d locked, %d scratch %.2g%% full), h
igh %d\n", |
| 426 fEntryCount, locked, scratch, countUtilization, fHighWaterEntryC
ount); | 416 fEntryCount, locked, scratch, countUtilization, fHighWaterEntryC
ount); |
| 427 SkDebugf("\t\tEntry Bytes: current %d (%.2g%% full) high %d\n", | 417 SkDebugf("\t\tEntry Bytes: current %d (%.2g%% full) high %d\n", |
| 428 fEntryBytes, byteUtilization, fHighWaterEntryBytes); | 418 fEntryBytes, byteUtilization, fHighWaterEntryBytes); |
| 429 } | 419 } |
| 430 | 420 |
| 431 #endif | 421 #endif |
| 432 | 422 |
| 433 /////////////////////////////////////////////////////////////////////////////// | 423 /////////////////////////////////////////////////////////////////////////////// |
| OLD | NEW |