From c4b319703c28b60f72f27ad468e1b82ac0661ea0 Mon Sep 17 00:00:00 2001 From: jonahwilliams Date: Mon, 18 Sep 2023 22:01:04 -0700 Subject: [PATCH 1/3] [Impeller] use final cmd buffer to present drawable. --- impeller/renderer/backend/metal/surface_mtl.mm | 12 ++++++++---- 1 file changed, 8 insertions(+), 4 deletions(-) diff --git a/impeller/renderer/backend/metal/surface_mtl.mm b/impeller/renderer/backend/metal/surface_mtl.mm index 526e66f4c5ff5..18edffe82225d 100644 --- a/impeller/renderer/backend/metal/surface_mtl.mm +++ b/impeller/renderer/backend/metal/surface_mtl.mm @@ -248,13 +248,17 @@ } if (drawable_) { - TRACE_EVENT0("flutter", "waitUntilScheduled"); id command_buffer = ContextMTL::Cast(context.get()) ->CreateMTLCommandBuffer("Present Waiter Command Buffer"); - [command_buffer commit]; - [command_buffer waitUntilScheduled]; - [drawable_ present]; + if ([[NSThread currentThread] isMainThread]) { + [command_buffer commit]; + [command_buffer waitUntilScheduled]; + [drawable_ present]; + } else { + [command_buffer presentDrawable:drawable_]; + [command_buffer commit]; + } } return true; From 061c72002e10339f99eb0cc5a00c1b0238c15d72 Mon Sep 17 00:00:00 2001 From: jonahwilliams Date: Tue, 19 Sep 2023 17:04:16 -0700 Subject: [PATCH 2/3] ++ --- impeller/renderer/backend/metal/surface_mtl.mm | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/impeller/renderer/backend/metal/surface_mtl.mm b/impeller/renderer/backend/metal/surface_mtl.mm index 18edffe82225d..6d52bdc7d8289 100644 --- a/impeller/renderer/backend/metal/surface_mtl.mm +++ b/impeller/renderer/backend/metal/surface_mtl.mm @@ -251,7 +251,11 @@ id command_buffer = ContextMTL::Cast(context.get()) ->CreateMTLCommandBuffer("Present Waiter Command Buffer"); - if ([[NSThread currentThread] isMainThread]) { + // If the threads have been merged, or there is a pending frame capture, + // then block on cmd buffer scheduling to ensure that the + // transaction/capture work correctly. + if ([[NSThread currentThread] isMainThread] || + [[MTLCaptureManager sharedCaptureManager] isCapturing]) { [command_buffer commit]; [command_buffer waitUntilScheduled]; [drawable_ present]; From b1840f78cff9aad464293f0e598d9f8663664ccf Mon Sep 17 00:00:00 2001 From: Jonah Williams Date: Thu, 21 Sep 2023 13:25:34 -0700 Subject: [PATCH 3/3] Update surface_mtl.mm --- impeller/renderer/backend/metal/surface_mtl.mm | 1 + 1 file changed, 1 insertion(+) diff --git a/impeller/renderer/backend/metal/surface_mtl.mm b/impeller/renderer/backend/metal/surface_mtl.mm index 6d52bdc7d8289..7244fc3b2a72a 100644 --- a/impeller/renderer/backend/metal/surface_mtl.mm +++ b/impeller/renderer/backend/metal/surface_mtl.mm @@ -256,6 +256,7 @@ // transaction/capture work correctly. if ([[NSThread currentThread] isMainThread] || [[MTLCaptureManager sharedCaptureManager] isCapturing]) { + TRACE_EVENT0("flutter", "waitUntilScheduled"); [command_buffer commit]; [command_buffer waitUntilScheduled]; [drawable_ present];