summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorSimonx22 <simon@oatmealdome.me>2026-03-03 09:38:13 -0500
committerSimonx22 <simon@oatmealdome.me>2026-03-03 09:49:42 -0500
commit03bcd564c5f185a86e20bccd7534d63b832b2203 (patch)
tree04796053fcdf2550d07314b0a5026de6efd362dc
parentf898d75bf3fc83cfc6d2af77653ab108457ca0e1 (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.mm17
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) {