Index: src/gpu/GrResourceCache.cpp |
diff --git a/src/gpu/GrResourceCache.cpp b/src/gpu/GrResourceCache.cpp |
index 62360ed5358fb21f7e8c547310e314af05f749d2..529f87c124880bbefd0c724bd2e48016841d4cd9 100644 |
--- a/src/gpu/GrResourceCache.cpp |
+++ b/src/gpu/GrResourceCache.cpp |
@@ -73,8 +73,7 @@ GrResourceCache::GrResourceCache(const GrCaps* caps) |
, fBytes(0) |
, fBudgetedCount(0) |
, fBudgetedBytes(0) |
- , fOverBudgetCB(nullptr) |
- , fOverBudgetData(nullptr) |
+ , fRequestFlush(false) |
, fFlushTimestamps(nullptr) |
, fLastFlushTimestampIndex(0) |
, fPreferVRAMUseOverFlushes(caps->preferVRAMUseOverFlushes()) { |
@@ -503,10 +502,9 @@ void GrResourceCache::purgeAsNeeded() { |
this->validate(); |
if (stillOverbudget) { |
- // Despite the purge we're still over budget. Call our over budget callback. If this frees |
- // any resources then we'll get notified and take appropriate action. |
- (*fOverBudgetCB)(fOverBudgetData); |
- this->validate(); |
+ // Set this so that GrDrawingManager will issue a flush to free up resources with pending |
+ // IO that we were unable to purge in this pass. |
+ fRequestFlush = true; |
} |
} |
@@ -621,16 +619,26 @@ uint32_t GrResourceCache::getNextTimestamp() { |
return fTimestamp++; |
} |
-void GrResourceCache::notifyFlushOccurred() { |
- if (fFlushTimestamps) { |
- SkASSERT(SkIsPow2(fMaxUnusedFlushes)); |
- fLastFlushTimestampIndex = (fLastFlushTimestampIndex + 1) & (fMaxUnusedFlushes - 1); |
- // get the timestamp before accessing fFlushTimestamps because getNextTimestamp will |
- // reallocate fFlushTimestamps on timestamp overflow. |
- uint32_t timestamp = this->getNextTimestamp(); |
- fFlushTimestamps[fLastFlushTimestampIndex] = timestamp; |
- this->purgeAsNeeded(); |
+void GrResourceCache::notifyFlushOccurred(FlushType type) { |
+ switch (type) { |
+ case FlushType::kImmediateMode: |
+ break; |
+ case FlushType::kCacheRequested: |
+ SkASSERT(fRequestFlush); |
+ fRequestFlush = false; |
+ break; |
+ case FlushType::kExternal: |
+ if (fFlushTimestamps) { |
+ SkASSERT(SkIsPow2(fMaxUnusedFlushes)); |
+ fLastFlushTimestampIndex = (fLastFlushTimestampIndex + 1) & (fMaxUnusedFlushes - 1); |
+ // get the timestamp before accessing fFlushTimestamps because getNextTimestamp will |
+ // reallocate fFlushTimestamps on timestamp overflow. |
+ uint32_t timestamp = this->getNextTimestamp(); |
+ fFlushTimestamps[fLastFlushTimestampIndex] = timestamp; |
+ } |
+ break; |
} |
+ this->purgeAsNeeded(); |
} |
void GrResourceCache::dumpMemoryStatistics(SkTraceMemoryDump* traceMemoryDump) const { |