aboutsummaryrefslogtreecommitdiffhomepage
path: root/src
diff options
context:
space:
mode:
authorGravatar Greg Daniel <egdaniel@google.com>2017-10-03 16:23:13 -0400
committerGravatar Skia Commit-Bot <skia-commit-bot@chromium.org>2017-10-04 12:02:12 +0000
commit78bdee200c26520eb065728ae7c094b76ecaae66 (patch)
tree4150c750e2ffb7e3d36492fbc45e12af10caf15e /src
parenta02fe096a89c63180496406010640131cbab9911 (diff)
When flushing, reset flush state before op lists
When we reset the flush state after executing the ops in a flush, we reset the stored pipelines which may be holding refs to resources in their processors. We want the resources that we wrote to in the op list to be freed last for caching LRU purposes. Thus we make sure to free all the pipeline resources first before resetting and freeing the op lists Bug: skia: Change-Id: I5b02e9b7532007b5854e906bf4d64e901e7e7e53 Reviewed-on: https://skia-review.googlesource.com/54760 Reviewed-by: Robert Phillips <robertphillips@google.com> Commit-Queue: Greg Daniel <egdaniel@google.com>
Diffstat (limited to 'src')
-rw-r--r--src/gpu/GrDrawingManager.cpp16
1 files changed, 13 insertions, 3 deletions
diff --git a/src/gpu/GrDrawingManager.cpp b/src/gpu/GrDrawingManager.cpp
index 5deacbb5ca..48540e00df 100644
--- a/src/gpu/GrDrawingManager.cpp
+++ b/src/gpu/GrDrawingManager.cpp
@@ -211,16 +211,26 @@ GrSemaphoresSubmitted GrDrawingManager::internalFlush(GrSurfaceProxy*,
if (fOpLists[i]->execute(&fFlushState)) {
flushed = true;
}
- fOpLists[i]->reset();
}
- fOpLists.reset();
SkASSERT(fFlushState.nextDrawToken() == fFlushState.nextTokenToFlush());
+ // We reset the flush state before the OpLists so that the last resources to be freed are those
+ // that are written to in the OpLists. This helps to make sure the most recently used resources
+ // are the last to be purged by the resource cache.
+ fFlushState.reset();
+
+ for (int i = 0; i < fOpLists.count(); ++i) {
+ if (!fOpLists[i]) {
+ continue;
+ }
+ fOpLists[i]->reset();
+ }
+ fOpLists.reset();
+
GrSemaphoresSubmitted result = fContext->getGpu()->finishFlush(numSemaphores,
backendSemaphores);
- fFlushState.reset();
// We always have to notify the cache when it requested a flush so it can reset its state.
if (flushed || type == GrResourceCache::FlushType::kCacheRequested) {
fContext->getResourceCache()->notifyFlushOccurred(type);