| Index: src/gpu/GrResourceCache.cpp
|
| ===================================================================
|
| --- src/gpu/GrResourceCache.cpp (revision 10123)
|
| +++ src/gpu/GrResourceCache.cpp (working copy)
|
| @@ -276,28 +276,33 @@
|
| * resource's destructor inserting new resources into the cache. If these
|
| * new resources were unlocked before purgeAsNeeded completed it could
|
| * potentially make purgeAsNeeded loop infinitely.
|
| + *
|
| + * extraCount and extraBytes are added to the current resource totals to account
|
| + * for incoming resources (e.g., GrContext is about to add 10MB split between
|
| + * 10 textures).
|
| */
|
| -void GrResourceCache::purgeAsNeeded() {
|
| +void GrResourceCache::purgeAsNeeded(int extraCount, size_t extraBytes) {
|
| if (fPurging) {
|
| return;
|
| }
|
|
|
| fPurging = true;
|
|
|
| - this->internalPurge();
|
| - if ((fEntryCount > fMaxCount || fEntryBytes > fMaxBytes) &&
|
| + this->internalPurge(extraCount, extraBytes);
|
| + if (((fEntryCount+extraCount) > fMaxCount ||
|
| + (fEntryBytes+extraBytes) > fMaxBytes) &&
|
| NULL != fOverbudgetCB) {
|
| // Despite the purge we're still over budget. See if Ganesh can
|
| // release some resources and purge again.
|
| if ((*fOverbudgetCB)(fOverbudgetData)) {
|
| - this->internalPurge();
|
| + this->internalPurge(extraCount, extraBytes);
|
| }
|
| }
|
|
|
| fPurging = false;
|
| }
|
|
|
| -void GrResourceCache::internalPurge() {
|
| +void GrResourceCache::internalPurge(int extraCount, size_t extraBytes) {
|
| SkASSERT(fPurging);
|
|
|
| bool withinBudget = false;
|
| @@ -319,7 +324,8 @@
|
| while (NULL != entry) {
|
| GrAutoResourceCacheValidate atcv(this);
|
|
|
| - if (fEntryCount <= fMaxCount && fEntryBytes <= fMaxBytes) {
|
| + if ((fEntryCount+extraCount) <= fMaxCount &&
|
| + (fEntryBytes+extraBytes) <= fMaxBytes) {
|
| withinBudget = true;
|
| break;
|
| }
|
|
|