Allow GPU resources to not be counted against the cache budget.
BUG=skia:2889
Review URL: https://codereview.chromium.org/721353002
diff --git a/src/gpu/GrResourceCache2.cpp b/src/gpu/GrResourceCache2.cpp
index d5590d0..9764e62 100644
--- a/src/gpu/GrResourceCache2.cpp
+++ b/src/gpu/GrResourceCache2.cpp
@@ -100,12 +100,12 @@
size_t size = resource->gpuMemorySize();
++fCount;
- fBytes += resource->gpuMemorySize();
+ fBytes += size;
#if GR_CACHE_STATS
fHighWaterCount = SkTMax(fCount, fHighWaterCount);
fHighWaterBytes = SkTMax(fBytes, fHighWaterBytes);
#endif
- if (!resource->cacheAccess().isWrapped()) {
+ if (resource->cacheAccess().isBudgeted()) {
++fBudgetedCount;
fBudgetedBytes += size;
#if GR_CACHE_STATS
@@ -114,8 +114,7 @@
#endif
}
if (!resource->cacheAccess().getScratchKey().isNullScratch()) {
- // TODO(bsalomon): Make this assertion possible.
- // SkASSERT(!resource->isWrapped());
+ SkASSERT(!resource->cacheAccess().isWrapped());
fScratchMap.insert(resource->cacheAccess().getScratchKey(), resource);
}
@@ -130,7 +129,7 @@
size_t size = resource->gpuMemorySize();
--fCount;
fBytes -= size;
- if (!resource->cacheAccess().isWrapped()) {
+ if (resource->cacheAccess().isBudgeted()) {
--fBudgetedCount;
fBudgetedBytes -= size;
}
@@ -187,7 +186,6 @@
if (resource->internalHasRef() || !resource->cacheAccess().isScratch()) {
return false;
}
-
return !fRejectPendingIO || !resource->internalHasPendingIO();
}
@@ -293,7 +291,7 @@
#if GR_CACHE_STATS
fHighWaterBytes = SkTMax(fBytes, fHighWaterBytes);
#endif
- if (!resource->cacheAccess().isWrapped()) {
+ if (resource->cacheAccess().isBudgeted()) {
fBudgetedBytes += delta;
#if GR_CACHE_STATS
fBudgetedHighWaterBytes = SkTMax(fBudgetedBytes, fBudgetedHighWaterBytes);
@@ -304,6 +302,26 @@
this->validate();
}
+void GrResourceCache2::didChangeBudgetStatus(GrGpuResource* resource) {
+ SkASSERT(!fPurging);
+ SkASSERT(resource);
+ SkASSERT(this->isInCache(resource));
+
+ size_t size = resource->gpuMemorySize();
+
+ if (resource->cacheAccess().isBudgeted()) {
+ ++fBudgetedCount;
+ fBudgetedBytes += size;
+ this->purgeAsNeeded();
+ } else {
+ --fBudgetedCount;
+ fBudgetedBytes -= size;
+ }
+
+ this->validate();
+}
+
+
void GrResourceCache2::internalPurgeAsNeeded() {
SkASSERT(!fPurging);
SkASSERT(!fNewlyPurgableResourceWhilePurging);
@@ -410,7 +428,7 @@
SkASSERT(!resource->cacheAccess().isWrapped());
}
- if (!resource->cacheAccess().isWrapped()) {
+ if (resource->cacheAccess().isBudgeted()) {
++budgetedCount;
budgetedBytes += resource->gpuMemorySize();
}
@@ -446,6 +464,8 @@
int locked = 0;
int scratch = 0;
+ int wrapped = 0;
+ size_t unbudgetedSize = 0;
ResourceList::Iter iter;
GrGpuResource* resource = iter.init(fResources, ResourceList::Iter::kHead_IterStart);
@@ -457,17 +477,23 @@
if (resource->cacheAccess().isScratch()) {
++scratch;
}
+ if (resource->cacheAccess().isWrapped()) {
+ ++wrapped;
+ }
+ if (!resource->cacheAccess().isBudgeted()) {
+ unbudgetedSize += resource->gpuMemorySize();
+ }
}
float countUtilization = (100.f * fBudgetedCount) / fMaxCount;
float byteUtilization = (100.f * fBudgetedBytes) / fMaxBytes;
SkDebugf("Budget: %d items %d bytes\n", fMaxCount, fMaxBytes);
- SkDebugf(
- "\t\tEntry Count: current %d (%d budgeted, %d locked, %d scratch %.2g%% full), high %d\n",
- fCount, fBudgetedCount, locked, scratch, countUtilization, fHighWaterCount);
- SkDebugf("\t\tEntry Bytes: current %d (budgeted %d, %.2g%% full) high %d\n",
- fBytes, fBudgetedBytes, byteUtilization, fHighWaterBytes);
+ SkDebugf("\t\tEntry Count: current %d"
+ " (%d budgeted, %d wrapped, %d locked, %d scratch %.2g%% full), high %d\n",
+ fCount, fBudgetedCount, wrapped, locked, scratch, countUtilization, fHighWaterCount);
+ SkDebugf("\t\tEntry Bytes: current %d (budgeted %d, %.2g%% full, %d unbudgeted) high %d\n",
+ fBytes, fBudgetedBytes, byteUtilization, unbudgetedSize, fHighWaterBytes);
}
#endif