Chromium Code Reviews| OLD | NEW |
|---|---|
| 1 | 1 |
| 2 /* | 2 /* |
| 3 * Copyright 2014 Google Inc. | 3 * Copyright 2014 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 #include "GrResourceCache2.h" | 10 #include "GrResourceCache2.h" |
| (...skipping 86 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 97 SkASSERT(!this->isInCache(resource)); | 97 SkASSERT(!this->isInCache(resource)); |
| 98 SkASSERT(!fPurging); | 98 SkASSERT(!fPurging); |
| 99 fResources.addToHead(resource); | 99 fResources.addToHead(resource); |
| 100 resource->ref(); | 100 resource->ref(); |
| 101 | 101 |
| 102 size_t size = resource->gpuMemorySize(); | 102 size_t size = resource->gpuMemorySize(); |
| 103 ++fCount; | 103 ++fCount; |
| 104 SkDEBUGCODE(fHighWaterCount = SkTMax(fCount, fHighWaterCount)); | 104 SkDEBUGCODE(fHighWaterCount = SkTMax(fCount, fHighWaterCount)); |
| 105 fBytes += size; | 105 fBytes += size; |
| 106 SkDEBUGCODE(fHighWaterBytes = SkTMax(fBytes, fHighWaterBytes)); | 106 SkDEBUGCODE(fHighWaterBytes = SkTMax(fBytes, fHighWaterBytes)); |
| 107 if (!resource->cacheAccess().isWrapped()) { | 107 if (resource->cacheAccess().isBudgeted()) { |
|
bsalomon
2014/11/13 19:20:54
Previously isWrapped() controlled whether a resour
| |
| 108 ++fBudgetedCount; | 108 ++fBudgetedCount; |
| 109 SkDEBUGCODE(fBudgetedHighWaterCount = SkTMax(fBudgetedCount, fBudgetedHi ghWaterCount)); | 109 SkDEBUGCODE(fBudgetedHighWaterCount = SkTMax(fBudgetedCount, fBudgetedHi ghWaterCount)); |
| 110 fBudgetedBytes += size; | 110 fBudgetedBytes += size; |
| 111 SkDEBUGCODE(fBudgetedHighWaterBytes = SkTMax(fBudgetedBytes, fBudgetedHi ghWaterBytes)); | 111 SkDEBUGCODE(fBudgetedHighWaterBytes = SkTMax(fBudgetedBytes, fBudgetedHi ghWaterBytes)); |
| 112 } | 112 } |
| 113 if (!resource->cacheAccess().getScratchKey().isNullScratch()) { | 113 if (!resource->cacheAccess().getScratchKey().isNullScratch()) { |
| 114 // TODO(bsalomon): Make this assertion possible. | 114 SkASSERT(!resource->cacheAccess().isWrapped()); |
| 115 // SkASSERT(!resource->isWrapped()); | |
| 116 fScratchMap.insert(resource->cacheAccess().getScratchKey(), resource); | 115 fScratchMap.insert(resource->cacheAccess().getScratchKey(), resource); |
| 117 } | 116 } |
| 118 | 117 |
| 119 this->purgeAsNeeded(); | 118 this->purgeAsNeeded(); |
| 120 } | 119 } |
| 121 | 120 |
| 122 void GrResourceCache2::removeResource(GrGpuResource* resource) { | 121 void GrResourceCache2::removeResource(GrGpuResource* resource) { |
| 123 AutoValidate av(this); | 122 AutoValidate av(this); |
| 124 | 123 |
| 125 SkASSERT(this->isInCache(resource)); | 124 SkASSERT(this->isInCache(resource)); |
| 126 | 125 |
| 127 size_t size = resource->gpuMemorySize(); | 126 size_t size = resource->gpuMemorySize(); |
| 128 --fCount; | 127 --fCount; |
| 129 fBytes -= size; | 128 fBytes -= size; |
| 130 if (!resource->cacheAccess().isWrapped()) { | 129 if (resource->cacheAccess().isBudgeted()) { |
| 131 --fBudgetedCount; | 130 --fBudgetedCount; |
| 132 fBudgetedBytes -= size; | 131 fBudgetedBytes -= size; |
| 133 } | 132 } |
| 134 | 133 |
| 135 fResources.remove(resource); | 134 fResources.remove(resource); |
| 136 if (!resource->cacheAccess().getScratchKey().isNullScratch()) { | 135 if (!resource->cacheAccess().getScratchKey().isNullScratch()) { |
| 137 fScratchMap.remove(resource->cacheAccess().getScratchKey(), resource); | 136 fScratchMap.remove(resource->cacheAccess().getScratchKey(), resource); |
| 138 } | 137 } |
| 139 if (const GrResourceKey* contentKey = resource->cacheAccess().getContentKey( )) { | 138 if (const GrResourceKey* contentKey = resource->cacheAccess().getContentKey( )) { |
| 140 fContentHash.remove(*contentKey); | 139 fContentHash.remove(*contentKey); |
| (...skipping 38 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 179 } | 178 } |
| 180 | 179 |
| 181 class GrResourceCache2::AvailableForScratchUse { | 180 class GrResourceCache2::AvailableForScratchUse { |
| 182 public: | 181 public: |
| 183 AvailableForScratchUse(bool rejectPendingIO) : fRejectPendingIO(rejectPendin gIO) { } | 182 AvailableForScratchUse(bool rejectPendingIO) : fRejectPendingIO(rejectPendin gIO) { } |
| 184 | 183 |
| 185 bool operator()(const GrGpuResource* resource) const { | 184 bool operator()(const GrGpuResource* resource) const { |
| 186 if (!resource->reffedOnlyByCache() || !resource->cacheAccess().isScratch ()) { | 185 if (!resource->reffedOnlyByCache() || !resource->cacheAccess().isScratch ()) { |
| 187 return false; | 186 return false; |
| 188 } | 187 } |
| 189 | |
| 190 return !fRejectPendingIO || !resource->internalHasPendingIO(); | 188 return !fRejectPendingIO || !resource->internalHasPendingIO(); |
| 191 } | 189 } |
| 192 | 190 |
| 193 private: | 191 private: |
| 194 bool fRejectPendingIO; | 192 bool fRejectPendingIO; |
| 195 }; | 193 }; |
| 196 | 194 |
| 197 GrGpuResource* GrResourceCache2::findAndRefScratchResource(const GrResourceKey& scratchKey, | 195 GrGpuResource* GrResourceCache2::findAndRefScratchResource(const GrResourceKey& scratchKey, |
| 198 uint32_t flags) { | 196 uint32_t flags) { |
| 199 AutoValidate av(this); | 197 AutoValidate av(this); |
| (...skipping 93 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 293 | 291 |
| 294 void GrResourceCache2::didChangeGpuMemorySize(const GrGpuResource* resource, siz e_t oldSize) { | 292 void GrResourceCache2::didChangeGpuMemorySize(const GrGpuResource* resource, siz e_t oldSize) { |
| 295 // SkASSERT(!fPurging); GrPathRange increases size during flush. :( | 293 // SkASSERT(!fPurging); GrPathRange increases size during flush. :( |
| 296 SkASSERT(resource); | 294 SkASSERT(resource); |
| 297 SkASSERT(this->isInCache(resource)); | 295 SkASSERT(this->isInCache(resource)); |
| 298 | 296 |
| 299 ptrdiff_t delta = resource->gpuMemorySize() - oldSize; | 297 ptrdiff_t delta = resource->gpuMemorySize() - oldSize; |
| 300 | 298 |
| 301 fBytes += delta; | 299 fBytes += delta; |
| 302 SkDEBUGCODE(fHighWaterBytes = SkTMax(fBytes, fHighWaterBytes)); | 300 SkDEBUGCODE(fHighWaterBytes = SkTMax(fBytes, fHighWaterBytes)); |
| 303 if (!resource->cacheAccess().isWrapped()) { | 301 if (resource->cacheAccess().isBudgeted()) { |
| 304 fBudgetedBytes += delta; | 302 fBudgetedBytes += delta; |
| 305 SkDEBUGCODE(fBudgetedHighWaterBytes = SkTMax(fBudgetedBytes, fBudgetedHi ghWaterBytes)); | 303 SkDEBUGCODE(fBudgetedHighWaterBytes = SkTMax(fBudgetedBytes, fBudgetedHi ghWaterBytes)); |
| 306 } | 304 } |
| 307 | 305 |
| 308 this->purgeAsNeeded(); | 306 this->purgeAsNeeded(); |
| 309 this->validate(); | 307 this->validate(); |
| 310 } | 308 } |
| 311 | 309 |
| 310 void GrResourceCache2::didChangeBudgetStatus(GrGpuResource* resource) { | |
| 311 SkASSERT(!fPurging); | |
| 312 SkASSERT(resource); | |
| 313 SkASSERT(this->isInCache(resource)); | |
| 314 | |
| 315 size_t size = resource->gpuMemorySize(); | |
| 316 | |
| 317 if (resource->cacheAccess().isBudgeted()) { | |
| 318 ++fBudgetedCount; | |
| 319 fBudgetedBytes += size; | |
| 320 this->purgeAsNeeded(); | |
| 321 } else { | |
| 322 --fBudgetedCount; | |
| 323 fBudgetedBytes -= size; | |
| 324 } | |
| 325 | |
| 326 this->validate(); | |
| 327 } | |
| 328 | |
| 329 | |
| 312 void GrResourceCache2::internalPurgeAsNeeded() { | 330 void GrResourceCache2::internalPurgeAsNeeded() { |
| 313 SkASSERT(!fPurging); | 331 SkASSERT(!fPurging); |
| 314 SkASSERT(!fNewlyPurgableResourceWhilePurging); | 332 SkASSERT(!fNewlyPurgableResourceWhilePurging); |
| 315 SkASSERT(fBudgetedCount > fMaxCount || fBudgetedBytes > fMaxBytes); | 333 SkASSERT(fBudgetedCount > fMaxCount || fBudgetedBytes > fMaxBytes); |
| 316 | 334 |
| 317 fPurging = true; | 335 fPurging = true; |
| 318 | 336 |
| 319 AutoValidate av(this); // Put this after setting fPurging so we're allowed t o be over budget. | 337 AutoValidate av(this); // Put this after setting fPurging so we're allowed t o be over budget. |
| 320 | 338 |
| 321 bool overBudget = true; | 339 bool overBudget = true; |
| (...skipping 86 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 408 SkASSERT(fScratchMap.countForKey(resource->cacheAccess().getScratchK ey())); | 426 SkASSERT(fScratchMap.countForKey(resource->cacheAccess().getScratchK ey())); |
| 409 SkASSERT(!resource->cacheAccess().isWrapped()); | 427 SkASSERT(!resource->cacheAccess().isWrapped()); |
| 410 } | 428 } |
| 411 | 429 |
| 412 if (const GrResourceKey* contentKey = resource->cacheAccess().getContent Key()) { | 430 if (const GrResourceKey* contentKey = resource->cacheAccess().getContent Key()) { |
| 413 ++content; | 431 ++content; |
| 414 SkASSERT(fContentHash.find(*contentKey) == resource); | 432 SkASSERT(fContentHash.find(*contentKey) == resource); |
| 415 SkASSERT(!resource->cacheAccess().isWrapped()); | 433 SkASSERT(!resource->cacheAccess().isWrapped()); |
| 416 } | 434 } |
| 417 | 435 |
| 418 if (!resource->cacheAccess().isWrapped()) { | 436 if (resource->cacheAccess().isBudgeted()) { |
| 419 ++budgetedCount; | 437 ++budgetedCount; |
| 420 budgetedBytes += resource->gpuMemorySize(); | 438 budgetedBytes += resource->gpuMemorySize(); |
| 421 } | 439 } |
| 422 } | 440 } |
| 423 | 441 |
| 424 SkASSERT(fBudgetedCount <= fCount); | 442 SkASSERT(fBudgetedCount <= fCount); |
| 425 SkASSERT(fBudgetedBytes <= fBudgetedBytes); | 443 SkASSERT(fBudgetedBytes <= fBudgetedBytes); |
| 426 SkASSERT(bytes == fBytes); | 444 SkASSERT(bytes == fBytes); |
| 427 SkASSERT(count == fCount); | 445 SkASSERT(count == fCount); |
| 428 SkASSERT(budgetedBytes == fBudgetedBytes); | 446 SkASSERT(budgetedBytes == fBudgetedBytes); |
| (...skipping 13 matching lines...) Expand all Loading... | |
| 442 SkASSERT(!overBudget || locked == count || fPurging); | 460 SkASSERT(!overBudget || locked == count || fPurging); |
| 443 } | 461 } |
| 444 #endif | 462 #endif |
| 445 | 463 |
| 446 #if GR_CACHE_STATS | 464 #if GR_CACHE_STATS |
| 447 void GrResourceCache2::printStats() const { | 465 void GrResourceCache2::printStats() const { |
| 448 this->validate(); | 466 this->validate(); |
| 449 | 467 |
| 450 int locked = 0; | 468 int locked = 0; |
| 451 int scratch = 0; | 469 int scratch = 0; |
| 470 int wrapped = 0; | |
| 452 | 471 |
| 453 ResourceList::Iter iter; | 472 ResourceList::Iter iter; |
| 454 GrGpuResource* resource = iter.init(fResources, ResourceList::Iter::kHead_It erStart); | 473 GrGpuResource* resource = iter.init(fResources, ResourceList::Iter::kHead_It erStart); |
| 455 | 474 |
| 456 for ( ; resource; resource = iter.next()) { | 475 for ( ; resource; resource = iter.next()) { |
| 457 if (!resource->isPurgable()) { | 476 if (!resource->isPurgable()) { |
| 458 ++locked; | 477 ++locked; |
| 459 } | 478 } |
| 460 if (resource->cacheAccess().isScratch()) { | 479 if (resource->cacheAccess().isScratch()) { |
| 461 ++scratch; | 480 ++scratch; |
| 462 } | 481 } |
| 482 if (resource->cacheAccess().isWrapped()) { | |
| 483 ++wrapped; | |
| 484 } | |
| 463 } | 485 } |
| 464 | 486 |
| 465 float countUtilization = (100.f * fBudgetedCount) / fMaxCount; | 487 float countUtilization = (100.f * fBudgetedCount) / fMaxCount; |
| 466 float byteUtilization = (100.f * fBudgetedBytes) / fMaxBytes; | 488 float byteUtilization = (100.f * fBudgetedBytes) / fMaxBytes; |
| 467 | 489 |
| 468 SkDebugf("Budget: %d items %d bytes\n", fMaxCount, fMaxBytes); | 490 SkDebugf("Budget: %d items %d bytes\n", fMaxCount, fMaxBytes); |
| 469 SkDebugf( | 491 SkDebugf( |
| 470 "\t\tEntry Count: current %d (%d budgeted, %d locked, %d scratch %.2g%% full), high %d\n", | 492 "\t\tEntry Count: current %d (%d budgeted, %d wrapped, %d locked, %d scr atch %.2g%% full), high %d\n", |
|
egdaniel
2014/11/13 20:47:32
over 100, but not the easiest to make look nice...
bsalomon
2014/11/13 20:53:34
wrapped
| |
| 471 fCount, fBudgetedCount, locked, scratch, countUtilization, fHighWaterCou nt); | 493 fCount, fBudgetedCount, wrapped, locked, scratch, countUtilization, fHig hWaterCount); |
| 472 SkDebugf("\t\tEntry Bytes: current %d (budgeted %d, %.2g%% full) high %d\n", | 494 SkDebugf("\t\tEntry Bytes: current %d (budgeted %d, %.2g%% full) high %d\n", |
| 473 fBytes, fBudgetedBytes, byteUtilization, fHighWaterBytes); | 495 fBytes, fBudgetedBytes, byteUtilization, fHighWaterBytes); |
| 474 } | 496 } |
| 475 | 497 |
| 476 #endif | 498 #endif |
| OLD | NEW |