From 4e6b6f0264c171b532aabc2d39caf3b5e4fb0867 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Branimir=20Karad=C5=BEi=C4=87?= Date: Fri, 20 Mar 2026 22:28:35 -0700 Subject: [PATCH] Metal: Fix validation when instancing data is provided, but shaders doesn't use it. (#3634) --- src/renderer_mtl.cpp | 11 ++++++++--- 1 file changed, 8 insertions(+), 3 deletions(-) diff --git a/src/renderer_mtl.cpp b/src/renderer_mtl.cpp index c0ca0fbea..2ea539851 100644 --- a/src/renderer_mtl.cpp +++ b/src/renderer_mtl.cpp @@ -2520,17 +2520,22 @@ static_assert(BX_COUNTOF(s_accessNames) == Access::Count, "Invalid s_accessNames if (0 < _numInstanceData) { + uint32_t numAttribs = 0; for (uint32_t ii = 0; UINT16_MAX != program.m_instanceData[ii]; ++ii) { const uint32_t loc = program.m_instanceData[ii]; vertexDesc->attributes()->object(loc)->setFormat(MTL::VertexFormatFloat4); vertexDesc->attributes()->object(loc)->setBufferIndex(stream+1); vertexDesc->attributes()->object(loc)->setOffset(ii*16); + ++numAttribs; } - vertexDesc->layouts()->object(stream+1)->setStride(_numInstanceData * 16); - vertexDesc->layouts()->object(stream+1)->setStepFunction(MTL::VertexStepFunctionPerInstance); - vertexDesc->layouts()->object(stream+1)->setStepRate(1); + if (0 < numAttribs) + { + vertexDesc->layouts()->object(stream+1)->setStride(_numInstanceData * 16); + vertexDesc->layouts()->object(stream+1)->setStepFunction(MTL::VertexStepFunctionPerInstance); + vertexDesc->layouts()->object(stream+1)->setStepRate(1); + } } pd->setVertexDescriptor(vertexDesc);