From bd24db8553be8529a85bfa7a4ee280d8d0cf6755 Mon Sep 17 00:00:00 2001 From: Aitor Camacho Date: Wed, 1 May 2024 15:57:16 +0200 Subject: [PATCH 1/3] 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 11ce6165c..fd7ae7690 100644 --- a/MoltenVK/MoltenVK/GPUObjects/MVKPipeline.h +++ b/MoltenVK/MoltenVK/GPUObjects/MVKPipeline.h @@ -430,6 +430,8 @@ class MVKGraphicsPipeline : public MVKPipeline { 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 021703591..486575d2b 100644 --- a/MoltenVK/MoltenVK/GPUObjects/MVKPipeline.mm +++ b/MoltenVK/MoltenVK/GPUObjects/MVKPipeline.mm @@ -1414,6 +1414,7 @@ static MTLVertexFormat mvkAdjustFormatVectorToSize(MTLVertexFormat format, uint3 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 @@ static MTLVertexFormat mvkAdjustFormatVectorToSize(MTLVertexFormat format, uint3 } 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. From 5649fb3fd3d8efea7bd6c249fab9a8e2fd572b11 Mon Sep 17 00:00:00 2001 From: Bill Hollings Date: Sat, 4 May 2024 15:33:44 -0400 Subject: [PATCH 2/3] Update MoltenVK/MoltenVK/GPUObjects/MVKPipeline.h Renamed _maxVertexInputBindingBufferCount to kMVKMaxVertexInputBindingBufferCount. --- MoltenVK/MoltenVK/GPUObjects/MVKPipeline.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/MoltenVK/MoltenVK/GPUObjects/MVKPipeline.h b/MoltenVK/MoltenVK/GPUObjects/MVKPipeline.h index fd7ae7690..65d709e05 100644 --- a/MoltenVK/MoltenVK/GPUObjects/MVKPipeline.h +++ b/MoltenVK/MoltenVK/GPUObjects/MVKPipeline.h @@ -430,7 +430,7 @@ class MVKGraphicsPipeline : public MVKPipeline { 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 + static constexpr uint32_t kMVKMaxVertexInputBindingBufferCount = 31u; // Taken from Metal Feature Set Table. Highest value out of all present GPUs bool _isVertexInputBindingUsed[_maxVertexInputBindingBufferCount] = { false }; bool _primitiveRestartEnable = true; bool _hasRasterInfo = false; From 2eea02df5632013620817ecc6950b2533c3ad640 Mon Sep 17 00:00:00 2001 From: Bill Hollings Date: Sat, 4 May 2024 15:33:53 -0400 Subject: [PATCH 3/3] Update MoltenVK/MoltenVK/GPUObjects/MVKPipeline.h Renamed _maxVertexInputBindingBufferCount to kMVKMaxVertexInputBindingBufferCount. --- MoltenVK/MoltenVK/GPUObjects/MVKPipeline.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/MoltenVK/MoltenVK/GPUObjects/MVKPipeline.h b/MoltenVK/MoltenVK/GPUObjects/MVKPipeline.h index 65d709e05..3fc9e00ce 100644 --- a/MoltenVK/MoltenVK/GPUObjects/MVKPipeline.h +++ b/MoltenVK/MoltenVK/GPUObjects/MVKPipeline.h @@ -431,7 +431,7 @@ class MVKGraphicsPipeline : public MVKPipeline { uint32_t _tessCtlLevelBufferIndex = 0; static constexpr uint32_t kMVKMaxVertexInputBindingBufferCount = 31u; // Taken from Metal Feature Set Table. Highest value out of all present GPUs - bool _isVertexInputBindingUsed[_maxVertexInputBindingBufferCount] = { false }; + bool _isVertexInputBindingUsed[kMVKMaxVertexInputBindingBufferCount] = { false }; bool _primitiveRestartEnable = true; bool _hasRasterInfo = false; bool _needsVertexSwizzleBuffer = false;