| 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 {
|
|
|