aboutsummaryrefslogtreecommitdiffhomepage
diff options
context:
space:
mode:
-rw-r--r--src/gpu/GrContext.cpp8
-rw-r--r--src/gpu/GrDrawTarget.cpp5
-rw-r--r--src/gpu/GrDrawTarget.h5
-rw-r--r--src/gpu/GrDrawingManager.cpp11
-rw-r--r--src/gpu/GrDrawingManager.h3
-rw-r--r--tests/ResourceCacheTest.cpp16
6 files changed, 36 insertions, 12 deletions
diff --git a/src/gpu/GrContext.cpp b/src/gpu/GrContext.cpp
index 5f4e663580..6221fea3c6 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 d8b44b8cba..45ec9acb9c 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 682dd2de33..dfc1489d35 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 df6bffdaa0..6c75c0d147 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<GrDrawTarget, GrDrawTarget::TopoSortTraits>(&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 3e9f956994..745820f439 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 2af2d69e8e..14705cbb03 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) {