|
@@ -0,0 +1,52 @@
|
|
|
+From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001
|
|
|
+From: Greg Daniel <[email protected]>
|
|
|
+Date: Wed, 5 Oct 2022 15:28:56 -0400
|
|
|
+Subject: Fix GrDirectContext::fClinetMappedBuffer access in abandoned
|
|
|
+ callbacks.
|
|
|
+
|
|
|
+Bug: chromium:1364604
|
|
|
+Change-Id: I1ca44cab1c762e7f94ac94be94991ec94a7497be
|
|
|
+Reviewed-on: https://skia-review.googlesource.com/c/skia/+/583963
|
|
|
+Commit-Queue: Greg Daniel <[email protected]>
|
|
|
+Reviewed-by: Brian Salomon <[email protected]>
|
|
|
+Reviewed-on: https://skia-review.googlesource.com/c/skia/+/587879
|
|
|
+Auto-Submit: Greg Daniel <[email protected]>
|
|
|
+Commit-Queue: Brian Salomon <[email protected]>
|
|
|
+
|
|
|
+diff --git a/src/gpu/ganesh/GrDirectContext.cpp b/src/gpu/ganesh/GrDirectContext.cpp
|
|
|
+index abec1a933ee2623aa18beb582966df30db8ec9fa..19f162083d506658394347046ada0de45908de81 100644
|
|
|
+--- a/src/gpu/ganesh/GrDirectContext.cpp
|
|
|
++++ b/src/gpu/ganesh/GrDirectContext.cpp
|
|
|
+@@ -142,9 +142,6 @@ void GrDirectContext::abandonContext() {
|
|
|
+
|
|
|
+ fGpu->disconnect(GrGpu::DisconnectType::kAbandon);
|
|
|
+
|
|
|
+- // Must be after GrResourceCache::abandonAll().
|
|
|
+- fMappedBufferManager.reset();
|
|
|
+-
|
|
|
+ if (fSmallPathAtlasMgr) {
|
|
|
+ fSmallPathAtlasMgr->reset();
|
|
|
+ }
|
|
|
+diff --git a/src/gpu/ganesh/GrFinishCallbacks.cpp b/src/gpu/ganesh/GrFinishCallbacks.cpp
|
|
|
+index 5519d2ca639d31f86e33ff0f617246b785fbc779..172f07d4de4554663140fdc2ad30ceab9bf449aa 100644
|
|
|
+--- a/src/gpu/ganesh/GrFinishCallbacks.cpp
|
|
|
++++ b/src/gpu/ganesh/GrFinishCallbacks.cpp
|
|
|
+@@ -35,10 +35,16 @@ void GrFinishCallbacks::check() {
|
|
|
+
|
|
|
+ void GrFinishCallbacks::callAll(bool doDelete) {
|
|
|
+ while (!fCallbacks.empty()) {
|
|
|
+- fCallbacks.front().fCallback(fCallbacks.front().fContext);
|
|
|
++ // While we are processing a proc we need to make sure to remove it from
|
|
|
++ // the callback list before calling it. This is because the client could
|
|
|
++ // trigger a call (e.g. calling flushAndSubmit(/*sync=*/true)) that has
|
|
|
++ // us process the finished callbacks. We also must process deleting the
|
|
|
++ // fence before a client may abandon the context.
|
|
|
++ auto finishCallback = fCallbacks.front();
|
|
|
+ if (doDelete) {
|
|
|
+- fGpu->deleteFence(fCallbacks.front().fFence);
|
|
|
++ fGpu->deleteFence(finishCallback.fFence);
|
|
|
+ }
|
|
|
+ fCallbacks.pop_front();
|
|
|
++ finishCallback.fCallback(finishCallback.fContext);
|
|
|
+ }
|
|
|
+ }
|