Add check for incorrect opList splits
authorRobert Phillips <robertphillips@google.com>
Thu, 18 May 2017 15:40:04 +0000 (11:40 -0400)
committerSkia Commit-Bot <skia-commit-bot@chromium.org>
Thu, 18 May 2017 16:30:25 +0000 (16:30 +0000)
This CL relies on: https://skia-review.googlesource.com/c/14186/ (Split up opLists (take 3))

We can't/don't want to close the opList in the GrSurfaceContext dtor because we, semi-often, wrap a proxy in a utility SurfaceContext in order to upload data to it (e.g., when creating a proxy w/ data or in the texture strip atlas).

In the current set up, the "temporary fixes" in newRTOpList and newTextureOpList should prevent any out of order execution.

Change-Id: I8189db6ed59096d7b8c1704028df395f84e4a681
Reviewed-on: https://skia-review.googlesource.com/14187
Reviewed-by: Greg Daniel <egdaniel@google.com>
Commit-Queue: Robert Phillips <robertphillips@google.com>

src/gpu/GrDrawingManager.cpp
src/gpu/GrRenderTargetContext.cpp

index b177a43..09e43c8 100644 (file)
@@ -95,6 +95,23 @@ void GrDrawingManager::internalFlush(GrSurfaceProxy*, GrResourceCache::FlushType
         fOpLists[i]->makeClosed(*fContext->caps());
     }
 
+#ifdef SK_DEBUG
+    // This block checks for any unnecessary splits in the opLists. If two sequential opLists
+    // share the same backing GrSurfaceProxy it means the opList was artificially split.
+    if (fOpLists.count()) {
+        GrRenderTargetOpList* prevOpList = fOpLists[0]->asRenderTargetOpList();
+        for (int i = 1; i < fOpLists.count(); ++i) {
+            GrRenderTargetOpList* curOpList = fOpLists[i]->asRenderTargetOpList();
+
+            if (prevOpList && curOpList) {
+                SkASSERT(prevOpList->fTarget.get() != curOpList->fTarget.get());
+            }
+
+            prevOpList = curOpList;
+        }
+    }
+#endif
+
 #ifdef ENABLE_MDB
     SkDEBUGCODE(bool result =)
                         SkTTopoSort<GrOpList, GrOpList::TopoSortTraits>(&fOpLists);
index e58b4bb..ffcd480 100644 (file)
@@ -105,9 +105,6 @@ void GrRenderTargetContext::validate() const {
 #endif
 
 GrRenderTargetContext::~GrRenderTargetContext() {
-    if (fOpList) {
-        fOpList->makeClosed(*this->caps());
-    }
     ASSERT_SINGLE_OWNER
 }