From 5a1b2bbc9ecd0b8414e2eb06654e6942e0281611 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Branimir=20Karad=C5=BEi=C4=87?= Date: Tue, 2 Jun 2026 10:20:57 -0700 Subject: [PATCH] Metal: Fix null deref in render encoder and processArguments. (#3725) --- src/renderer_d3d11.cpp | 1 + src/renderer_mtl.cpp | 35 +++++++++++++++++++++++++++++++++-- 2 files changed, 34 insertions(+), 2 deletions(-) diff --git a/src/renderer_d3d11.cpp b/src/renderer_d3d11.cpp index 4045c057c..c46333935 100644 --- a/src/renderer_d3d11.cpp +++ b/src/renderer_d3d11.cpp @@ -5596,6 +5596,7 @@ namespace bgfx { namespace d3d11 } updateNativeWindow(); + if (updateResolution(_render->m_resolution) ) { return; diff --git a/src/renderer_mtl.cpp b/src/renderer_mtl.cpp index 30b378b47..457aaac19 100644 --- a/src/renderer_mtl.cpp +++ b/src/renderer_mtl.cpp @@ -2443,9 +2443,12 @@ static_assert(BX_COUNTOF(s_accessNames) == Access::Count, "Invalid s_accessNames ps->m_fshConstantBufferAlignment = uint32_t(arg->bufferAlignment() ); } - NS::Array* members = arg->bufferStructType()->members(); + NS::Array* members = NULL != arg->bufferStructType() + ? arg->bufferStructType()->members() + : NULL + ; - for (NS::UInteger mi = 0, mc = members->count(); mi < mc; ++mi) + for (NS::UInteger mi = 0, mc = NULL != members ? members->count() : 0; mi < mc; ++mi) { MTL::StructMember* uniform = (MTL::StructMember*)members->object(mi); const char* name = utf8String(uniform->name() ); @@ -2988,6 +2991,33 @@ static_assert(BX_COUNTOF(s_accessNames) == Access::Count, "Invalid s_accessNames return m_blitCommandEncoder; } + MTL::RenderCommandEncoder* getRenderCommandEncoder() + { + if (NULL == m_renderCommandEncoder) + { + MTL::RenderPassDescriptor* renderPassDescriptor = newRenderPassDescriptor(); + + setFrameBuffer(renderPassDescriptor, m_renderCommandEncoderFrameBufferHandle); + + renderPassDescriptor->colorAttachments()->object(0)->setLoadAction(MTL::LoadActionLoad); + renderPassDescriptor->colorAttachments()->object(0)->setStoreAction( + NULL != renderPassDescriptor->colorAttachments()->object(0)->resolveTexture() + ? MTL::StoreActionMultisampleResolve + : MTL::StoreActionStore + ); + + m_renderCommandEncoder = m_commandBuffer->renderCommandEncoder(renderPassDescriptor); + MTL_RELEASE(renderPassDescriptor, 0); + + if (m_depthClamp) + { + m_renderCommandEncoder->setDepthClipMode(MTL::DepthClipModeClamp); + } + } + + return m_renderCommandEncoder; + } + void endEncoding() { if (NULL != m_renderCommandEncoder) @@ -5702,6 +5732,7 @@ static_assert(BX_COUNTOF(s_accessNames) == Access::Count, "Invalid s_accessNames perfStats.gpuMemoryMax = -INT64_MAX; perfStats.gpuMemoryUsed = -INT64_MAX; + rce = getRenderCommandEncoder(); rce->setTriangleFillMode(MTL::TriangleFillModeFill); if (_render->m_debug & (BGFX_DEBUG_IFH|BGFX_DEBUG_STATS) )