From bd24db8553be8529a85bfa7a4ee280d8d0cf6755 Mon Sep 17 00:00:00 2001 From: Aitor Camacho Date: Wed, 1 May 2024 15:57:16 +0200 Subject: [PATCH] Allow vertex buffer binding when they are used disregarding implicit index Due to how MoltenVK decides when a buffer can be bound based on its requirements for the implicit buffer, if the application uses all bindings, implicit buffer index will be uint max. This lead to used buffers not being bound. --- MoltenVK/MoltenVK/GPUObjects/MVKPipeline.h | 2 ++ MoltenVK/MoltenVK/GPUObjects/MVKPipeline.mm | 3 ++- 2 files changed, 4 insertions(+), 1 deletion(-) diff --git a/MoltenVK/MoltenVK/GPUObjects/MVKPipeline.h b/MoltenVK/MoltenVK/GPUObjects/MVKPipeline.h index 11ce6165..fd7ae769 100644 --- a/MoltenVK/MoltenVK/GPUObjects/MVKPipeline.h +++ b/MoltenVK/MoltenVK/GPUObjects/MVKPipeline.h @@ -430,6 +430,8 @@ protected: uint32_t _tessCtlPatchOutputBufferIndex = 0; uint32_t _tessCtlLevelBufferIndex = 0; + static constexpr uint32_t _maxVertexInputBindingBufferCount = 31u; // Taken from Metal Feature Set Table. Highest value out of all present GPUs + bool _isVertexInputBindingUsed[_maxVertexInputBindingBufferCount] = { false }; bool _primitiveRestartEnable = true; bool _hasRasterInfo = false; bool _needsVertexSwizzleBuffer = false; diff --git a/MoltenVK/MoltenVK/GPUObjects/MVKPipeline.mm b/MoltenVK/MoltenVK/GPUObjects/MVKPipeline.mm index 02170359..486575d2 100644 --- a/MoltenVK/MoltenVK/GPUObjects/MVKPipeline.mm +++ b/MoltenVK/MoltenVK/GPUObjects/MVKPipeline.mm @@ -1414,6 +1414,7 @@ bool MVKGraphicsPipeline::addVertexInputToPipeline(T* inputDesc, maxBinding = max(pVKVB->binding, maxBinding); uint32_t vbIdx = getMetalBufferIndexForVertexAttributeBinding(pVKVB->binding); + _isVertexInputBindingUsed[vbIdx] = true; auto vbDesc = inputDesc.layouts[vbIdx]; if (isVtxStrideStatic && pVKVB->stride == 0) { // Stride can't be 0, it will be set later to attributes' maximum offset + size @@ -1840,7 +1841,7 @@ void MVKGraphicsPipeline::initReservedVertexAttributeBufferCount(const VkGraphic } bool MVKGraphicsPipeline::isValidVertexBufferIndex(MVKShaderStage stage, uint32_t mtlBufferIndex) { - return mtlBufferIndex < _descriptorBufferCounts.stages[stage] || mtlBufferIndex > getImplicitBufferIndex(stage, 0); + return _isVertexInputBindingUsed[mtlBufferIndex] || mtlBufferIndex < _descriptorBufferCounts.stages[stage] || mtlBufferIndex > getImplicitBufferIndex(stage, 0); } // Initializes the vertex attributes in a shader conversion configuration.