diff options
| author | Simonx22 <simon@oatmealdome.me> | 2026-03-03 09:38:13 -0500 |
|---|---|---|
| committer | Simonx22 <simon@oatmealdome.me> | 2026-03-03 09:49:42 -0500 |
| commit | 03bcd564c5f185a86e20bccd7534d63b832b2203 (patch) | |
| tree | 04796053fcdf2550d07314b0a5026de6efd362dc | |
| parent | f898d75bf3fc83cfc6d2af77653ab108457ca0e1 (diff) | |
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 <julian@oatmealdome.me>
| -rw-r--r-- | Source/Core/VideoBackends/Metal/MTLStateTracker.mm | 17 |
1 files 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<int>(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<int>(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<MTLCommandBuffer> buf) { |
