From dc43898bbbd06202562514ae785116e0cc40f825 Mon Sep 17 00:00:00 2001 From: bsalomon Date: Wed, 31 Aug 2016 11:53:49 -0700 Subject: [PATCH] Don't purge resources for trivial GrContext flushes GOLD_TRYBOT_URL= https://gold.skia.org/search?issue=2298003003 Review-Url: https://codereview.chromium.org/2298003003 --- src/gpu/GrContext.cpp | 8 +++++--- src/gpu/GrDrawTarget.cpp | 5 +++-- src/gpu/GrDrawTarget.h | 5 +++-- src/gpu/GrDrawingManager.cpp | 11 +++++++---- src/gpu/GrDrawingManager.h | 3 ++- tests/ResourceCacheTest.cpp | 16 ++++++++++++++++ 6 files changed, 36 insertions(+), 12 deletions(-) diff --git a/src/gpu/GrContext.cpp b/src/gpu/GrContext.cpp index 5f4e663..6221fea 100644 --- a/src/gpu/GrContext.cpp +++ b/src/gpu/GrContext.cpp @@ -228,13 +228,15 @@ void GrContext::TextBlobCacheOverBudgetCB(void* data) { void GrContext::flush(int flagsBitfield) { ASSERT_SINGLE_OWNER RETURN_IF_ABANDONED - + bool flushed = false; if (kDiscard_FlushBit & flagsBitfield) { fDrawingManager->reset(); } else { - fDrawingManager->flush(); + flushed = fDrawingManager->flush(); + } + if (flushed) { + fResourceCache->notifyFlushOccurred(); } - fResourceCache->notifyFlushOccurred(); fFlushToReduceCacheSize = false; } diff --git a/src/gpu/GrDrawTarget.cpp b/src/gpu/GrDrawTarget.cpp index d8b44b8..45ec9ac 100644 --- a/src/gpu/GrDrawTarget.cpp +++ b/src/gpu/GrDrawTarget.cpp @@ -221,9 +221,9 @@ void GrDrawTarget::prepareBatches(GrBatchFlushState* flushState) { } } -void GrDrawTarget::drawBatches(GrBatchFlushState* flushState) { +bool GrDrawTarget::drawBatches(GrBatchFlushState* flushState) { if (0 == fRecordedBatches.count()) { - return; + return false; } // Draw all the generated geometry. SkRandom random; @@ -286,6 +286,7 @@ void GrDrawTarget::drawBatches(GrBatchFlushState* flushState) { } fGpu->finishDrawTarget(); + return true; } void GrDrawTarget::reset() { diff --git a/src/gpu/GrDrawTarget.h b/src/gpu/GrDrawTarget.h index 682dd2d..dfc1489 100644 --- a/src/gpu/GrDrawTarget.h +++ b/src/gpu/GrDrawTarget.h @@ -96,10 +96,11 @@ public: void reset(); /** - * Together these two functions flush all queued up draws to the Gpu. + * Together these two functions flush all queued up draws to GrCommandBuffer. The return value + * of drawBatches() indicates whether any commands were actually issued to the GPU. */ void prepareBatches(GrBatchFlushState* flushState); - void drawBatches(GrBatchFlushState* flushState); + bool drawBatches(GrBatchFlushState* flushState); /** * Gets the capabilities of the draw target. diff --git a/src/gpu/GrDrawingManager.cpp b/src/gpu/GrDrawingManager.cpp index df6bffd..6c75c0d 100644 --- a/src/gpu/GrDrawingManager.cpp +++ b/src/gpu/GrDrawingManager.cpp @@ -74,12 +74,12 @@ void GrDrawingManager::reset() { fFlushState.reset(); } -void GrDrawingManager::flush() { +bool GrDrawingManager::flush() { if (fFlushing || this->wasAbandoned()) { - return; + return false; } fFlushing = true; - + bool flushed = false; SkDEBUGCODE(bool result =) SkTTopoSort(&fDrawTargets); SkASSERT(result); @@ -99,7 +99,9 @@ void GrDrawingManager::flush() { fFlushState.preIssueDraws(); for (int i = 0; i < fDrawTargets.count(); ++i) { - fDrawTargets[i]->drawBatches(&fFlushState); + if (fDrawTargets[i]->drawBatches(&fFlushState)) { + flushed = true; + } } SkASSERT(fFlushState.nextDrawToken() == fFlushState.nextTokenToFlush()); @@ -125,6 +127,7 @@ void GrDrawingManager::flush() { fFlushState.reset(); fFlushing = false; + return flushed; } GrDrawTarget* GrDrawingManager::newDrawTarget(GrRenderTarget* rt) { diff --git a/src/gpu/GrDrawingManager.h b/src/gpu/GrDrawingManager.h index 3e9f956..745820f 100644 --- a/src/gpu/GrDrawingManager.h +++ b/src/gpu/GrDrawingManager.h @@ -68,7 +68,8 @@ private: void abandon(); void cleanup(); void reset(); - void flush(); + /** Returns true if there was anything to flush and false otherwise */ + bool flush(); friend class GrContext; // for access to: ctor, abandon, reset & flush diff --git a/tests/ResourceCacheTest.cpp b/tests/ResourceCacheTest.cpp index 2af2d69..14705cb 100644 --- a/tests/ResourceCacheTest.cpp +++ b/tests/ResourceCacheTest.cpp @@ -1195,6 +1195,22 @@ static void test_flush(skiatest::Reporter* reporter) { } REPORTER_ASSERT(reporter, 0 == cache->getResourceCount()); + + // Verify that calling flush() on a GrContext with nothing to do will not trigger resource + // eviction. + context->flush(); + for (int i = 0; i < 10; ++i) { + TestResource* r = new TestResource(context->getGpu()); + GrUniqueKey k; + make_unique_key<1>(&k, i); + r->resourcePriv().setUniqueKey(k); + r->unref(); + } + REPORTER_ASSERT(reporter, 10 == cache->getResourceCount()); + for (int i = 0; i < 10 * kFlushCount; ++i) { + context->flush(); + } + REPORTER_ASSERT(reporter, 10 == cache->getResourceCount()); } static void test_large_resource_count(skiatest::Reporter* reporter) { -- 2.7.4