| 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 | 9 |
| 10 | 10 |
| (...skipping 70 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 81 fCache.remove(entry->fKey, entry); | 81 fCache.remove(entry->fKey, entry); |
| 82 | 82 |
| 83 // remove from our llist | 83 // remove from our llist |
| 84 this->internalDetach(entry); | 84 this->internalDetach(entry); |
| 85 | 85 |
| 86 delete entry; | 86 delete entry; |
| 87 } | 87 } |
| 88 } | 88 } |
| 89 | 89 |
| 90 void GrResourceCache::getLimits(int* maxResources, size_t* maxResourceBytes) con
st{ | 90 void GrResourceCache::getLimits(int* maxResources, size_t* maxResourceBytes) con
st{ |
| 91 if (maxResources) { | 91 if (NULL != maxResources) { |
| 92 *maxResources = fMaxCount; | 92 *maxResources = fMaxCount; |
| 93 } | 93 } |
| 94 if (maxResourceBytes) { | 94 if (NULL != maxResourceBytes) { |
| 95 *maxResourceBytes = fMaxBytes; | 95 *maxResourceBytes = fMaxBytes; |
| 96 } | 96 } |
| 97 } | 97 } |
| 98 | 98 |
| 99 void GrResourceCache::setLimits(int maxResources, size_t maxResourceBytes) { | 99 void GrResourceCache::setLimits(int maxResources, size_t maxResourceBytes) { |
| 100 bool smaller = (maxResources < fMaxCount) || (maxResourceBytes < fMaxBytes); | 100 bool smaller = (maxResources < fMaxCount) || (maxResourceBytes < fMaxBytes); |
| 101 | 101 |
| 102 fMaxCount = maxResources; | 102 fMaxCount = maxResources; |
| 103 fMaxBytes = maxResourceBytes; | 103 fMaxBytes = maxResourceBytes; |
| 104 | 104 |
| (...skipping 84 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 189 this->makeExclusive(entry); | 189 this->makeExclusive(entry); |
| 190 } else { | 190 } else { |
| 191 // Make this resource MRU | 191 // Make this resource MRU |
| 192 this->internalDetach(entry); | 192 this->internalDetach(entry); |
| 193 this->attachToHead(entry); | 193 this->attachToHead(entry); |
| 194 } | 194 } |
| 195 | 195 |
| 196 return entry->fResource; | 196 return entry->fResource; |
| 197 } | 197 } |
| 198 | 198 |
| 199 bool GrResourceCache::hasKey(const GrResourceKey& key) const { | |
| 200 return NULL != fCache.find(key); | |
| 201 } | |
| 202 | |
| 203 void GrResourceCache::addResource(const GrResourceKey& key, | 199 void GrResourceCache::addResource(const GrResourceKey& key, |
| 204 GrResource* resource, | 200 GrResource* resource, |
| 205 uint32_t ownershipFlags) { | 201 uint32_t ownershipFlags) { |
| 206 GrAssert(NULL == resource->getCacheEntry()); | 202 GrAssert(NULL == resource->getCacheEntry()); |
| 207 // we don't expect to create new resources during a purge. In theory | 203 // we don't expect to create new resources during a purge. In theory |
| 208 // this could cause purgeAsNeeded() into an infinite loop (e.g. | 204 // this could cause purgeAsNeeded() into an infinite loop (e.g. |
| 209 // each resource destroyed creates and locks 2 resources and | 205 // each resource destroyed creates and locks 2 resources and |
| 210 // unlocks 1 thereby causing a new purge). | 206 // unlocks 1 thereby causing a new purge). |
| 211 GrAssert(!fPurging); | 207 GrAssert(!fPurging); |
| 212 GrAutoResourceCacheValidate atcv(this); | 208 GrAutoResourceCacheValidate atcv(this); |
| (...skipping 82 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 295 // Despite the purge we're still over budget. See if Ganesh can | 291 // Despite the purge we're still over budget. See if Ganesh can |
| 296 // release some resources and purge again. | 292 // release some resources and purge again. |
| 297 if ((*fOverbudgetCB)(fOverbudgetData)) { | 293 if ((*fOverbudgetCB)(fOverbudgetData)) { |
| 298 this->internalPurge(extraCount, extraBytes); | 294 this->internalPurge(extraCount, extraBytes); |
| 299 } | 295 } |
| 300 } | 296 } |
| 301 | 297 |
| 302 fPurging = false; | 298 fPurging = false; |
| 303 } | 299 } |
| 304 | 300 |
| 301 void GrResourceCache::deleteResource(GrResourceEntry* entry) { |
| 302 GrAssert(1 == entry->fResource->getRefCnt()); |
| 303 |
| 304 // remove from our cache |
| 305 fCache.remove(entry->key(), entry); |
| 306 |
| 307 // remove from our llist |
| 308 this->internalDetach(entry); |
| 309 delete entry; |
| 310 } |
| 311 |
| 305 void GrResourceCache::internalPurge(int extraCount, size_t extraBytes) { | 312 void GrResourceCache::internalPurge(int extraCount, size_t extraBytes) { |
| 306 SkASSERT(fPurging); | 313 SkASSERT(fPurging); |
| 307 | 314 |
| 308 bool withinBudget = false; | 315 bool withinBudget = false; |
| 309 bool changed = false; | 316 bool changed = false; |
| 310 | 317 |
| 311 // The purging process is repeated several times since one pass | 318 // The purging process is repeated several times since one pass |
| 312 // may free up other resources | 319 // may free up other resources |
| 313 do { | 320 do { |
| 314 EntryList::Iter iter; | 321 EntryList::Iter iter; |
| (...skipping 11 matching lines...) Expand all Loading... |
| 326 | 333 |
| 327 if ((fEntryCount+extraCount) <= fMaxCount && | 334 if ((fEntryCount+extraCount) <= fMaxCount && |
| 328 (fEntryBytes+extraBytes) <= fMaxBytes) { | 335 (fEntryBytes+extraBytes) <= fMaxBytes) { |
| 329 withinBudget = true; | 336 withinBudget = true; |
| 330 break; | 337 break; |
| 331 } | 338 } |
| 332 | 339 |
| 333 GrResourceEntry* prev = iter.prev(); | 340 GrResourceEntry* prev = iter.prev(); |
| 334 if (1 == entry->fResource->getRefCnt()) { | 341 if (1 == entry->fResource->getRefCnt()) { |
| 335 changed = true; | 342 changed = true; |
| 336 | 343 this->deleteResource(entry); |
| 337 // remove from our cache | |
| 338 fCache.remove(entry->key(), entry); | |
| 339 | |
| 340 // remove from our llist | |
| 341 this->internalDetach(entry); | |
| 342 delete entry; | |
| 343 } | 344 } |
| 344 entry = prev; | 345 entry = prev; |
| 345 } | 346 } |
| 346 } while (!withinBudget && changed); | 347 } while (!withinBudget && changed); |
| 347 } | 348 } |
| 348 | 349 |
| 349 void GrResourceCache::purgeAllUnlocked() { | 350 void GrResourceCache::purgeAllUnlocked() { |
| 350 GrAutoResourceCacheValidate atcv(this); | 351 GrAutoResourceCacheValidate atcv(this); |
| 351 | 352 |
| 352 // we can have one GrResource holding a lock on another | 353 // we can have one GrResource holding a lock on another |
| (...skipping 111 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 464 fEntryBytes, fHighWaterEntryBytes); | 465 fEntryBytes, fHighWaterEntryBytes); |
| 465 SkDebugf("\t\tDetached Entry Count: current %d high %d\n", | 466 SkDebugf("\t\tDetached Entry Count: current %d high %d\n", |
| 466 fClientDetachedCount, fHighWaterClientDetachedCount); | 467 fClientDetachedCount, fHighWaterClientDetachedCount); |
| 467 SkDebugf("\t\tDetached Bytes: current %d high %d\n", | 468 SkDebugf("\t\tDetached Bytes: current %d high %d\n", |
| 468 fClientDetachedBytes, fHighWaterClientDetachedBytes); | 469 fClientDetachedBytes, fHighWaterClientDetachedBytes); |
| 469 } | 470 } |
| 470 | 471 |
| 471 #endif | 472 #endif |
| 472 | 473 |
| 473 /////////////////////////////////////////////////////////////////////////////// | 474 /////////////////////////////////////////////////////////////////////////////// |
| OLD | NEW |