From 03bcd564c5f185a86e20bccd7534d63b832b2203 Mon Sep 17 00:00:00 2001 From: Simonx22 Date: Tue, 3 Mar 2026 09:38:13 -0500 Subject: [PATCH] Metal: Always run endEncoding on command encoders Fixes a macOS Metal crash when stopping immediately after boot starts. m_upload_encoder and m_texture_upload_encoder could be dealloc'd during shutdown before endEncoding could be called, which causes a Metal assertion failure. Co-authored-by: OatmealDome --- .../Core/VideoBackends/Metal/MTLStateTracker.mm | 17 ++++++++++++----- 1 file changed, 12 insertions(+), 5 deletions(-) diff --git a/Source/Core/VideoBackends/Metal/MTLStateTracker.mm b/Source/Core/VideoBackends/Metal/MTLStateTracker.mm index f4d5634636..a9fb4e63fb 100644 --- a/Source/Core/VideoBackends/Metal/MTLStateTracker.mm +++ b/Source/Core/VideoBackends/Metal/MTLStateTracker.mm @@ -383,11 +383,14 @@ void Metal::StateTracker::EndRenderPass() void Metal::StateTracker::FlushEncoders() { - if (!m_current_render_cmdbuf) - return; - EndRenderPass(); - for (int i = 0; i <= static_cast(UploadBuffer::Last); ++i) - Sync(m_upload_buffers[i]); + const bool needs_submit = m_current_render_cmdbuf; + if (needs_submit) + { + EndRenderPass(); + for (int i = 0; i <= static_cast(UploadBuffer::Last); ++i) + Sync(m_upload_buffers[i]); + } + if (!m_manual_buffer_upload) { ASSERT(!m_upload_cmdbuf && "Should never be used!"); @@ -407,6 +410,10 @@ void Metal::StateTracker::FlushEncoders() m_texture_upload_encoder = nullptr; m_texture_upload_cmdbuf = nullptr; } + + if (!needs_submit) + return; + [m_current_render_cmdbuf addCompletedHandler:[backref = m_backref, draw = m_current_draw, q = std::move(m_current_perf_query)](id buf) {