From 3d952d5ed4f513845c2f98e1a2d79cfd47a9fc23 Mon Sep 17 00:00:00 2001 From: Bill Hollings Date: Sat, 31 Oct 2020 17:50:08 -0400 Subject: [PATCH] Support setting sizes of SPIR-V unsized arrays. Set SPIRV-Cross MSLResourceBinding::size value from MVKDescriptorSetLayoutBinding descriptor count. --- MoltenVK/MoltenVK/GPUObjects/MVKDescriptor.h | 5 +++++ MoltenVK/MoltenVK/GPUObjects/MVKDescriptor.mm | 3 ++- MoltenVK/MoltenVK/GPUObjects/MVKDescriptorSet.h | 1 + MoltenVK/MoltenVK/GPUObjects/MVKDescriptorSet.mm | 2 ++ MoltenVK/MoltenVK/GPUObjects/MVKPipeline.mm | 2 ++ .../MoltenVKShaderConverter/SPIRVToMSLConverter.cpp | 1 + 6 files changed, 13 insertions(+), 1 deletion(-) diff --git a/MoltenVK/MoltenVK/GPUObjects/MVKDescriptor.h b/MoltenVK/MoltenVK/GPUObjects/MVKDescriptor.h index 75ad990d..0ce732e4 100644 --- a/MoltenVK/MoltenVK/GPUObjects/MVKDescriptor.h +++ b/MoltenVK/MoltenVK/GPUObjects/MVKDescriptor.h @@ -70,6 +70,11 @@ public: /** Returns the binding number of this layout. */ inline uint32_t getBinding() { return _info.binding; } + /** Returns whether this binding has a variable descriptor count. */ + inline bool hasVariableDescriptorCount() { + return mvkIsAnyFlagEnabled(_flags, VK_DESCRIPTOR_BINDING_VARIABLE_DESCRIPTOR_COUNT_BIT_EXT); + } + /** * Returns the number of descriptors in this layout. * diff --git a/MoltenVK/MoltenVK/GPUObjects/MVKDescriptor.mm b/MoltenVK/MoltenVK/GPUObjects/MVKDescriptor.mm index b6d81e1a..e70a7696 100644 --- a/MoltenVK/MoltenVK/GPUObjects/MVKDescriptor.mm +++ b/MoltenVK/MoltenVK/GPUObjects/MVKDescriptor.mm @@ -80,7 +80,7 @@ uint32_t MVKDescriptorSetLayoutBinding::getDescriptorCount(MVKDescriptorSet* des return 1; } - if (descSet && mvkIsAnyFlagEnabled(_flags, VK_DESCRIPTOR_BINDING_VARIABLE_DESCRIPTOR_COUNT_BIT)) { + if (descSet && hasVariableDescriptorCount()) { return descSet->_variableDescriptorCount; } @@ -374,6 +374,7 @@ void MVKDescriptorSetLayoutBinding::populateShaderConverterContext(mvk::SPIRVToM models[i], dslIndex, _info.binding, + getDescriptorCount(nullptr), mvkSamp); } } diff --git a/MoltenVK/MoltenVK/GPUObjects/MVKDescriptorSet.h b/MoltenVK/MoltenVK/GPUObjects/MVKDescriptorSet.h index f40d4845..c31ef357 100644 --- a/MoltenVK/MoltenVK/GPUObjects/MVKDescriptorSet.h +++ b/MoltenVK/MoltenVK/GPUObjects/MVKDescriptorSet.h @@ -317,4 +317,5 @@ void mvkPopulateShaderConverterContext(mvk::SPIRVToMSLConversionConfiguration& c spv::ExecutionModel stage, uint32_t descriptorSetIndex, uint32_t bindingIndex, + uint32_t count, MVKSampler* immutableSampler); diff --git a/MoltenVK/MoltenVK/GPUObjects/MVKDescriptorSet.mm b/MoltenVK/MoltenVK/GPUObjects/MVKDescriptorSet.mm index d3c96267..87c2d831 100644 --- a/MoltenVK/MoltenVK/GPUObjects/MVKDescriptorSet.mm +++ b/MoltenVK/MoltenVK/GPUObjects/MVKDescriptorSet.mm @@ -817,6 +817,7 @@ void mvkPopulateShaderConverterContext(mvk::SPIRVToMSLConversionConfiguration& c spv::ExecutionModel stage, uint32_t descriptorSetIndex, uint32_t bindingIndex, + uint32_t count, MVKSampler* immutableSampler) { mvk::MSLResourceBinding rb; @@ -824,6 +825,7 @@ void mvkPopulateShaderConverterContext(mvk::SPIRVToMSLConversionConfiguration& c rbb.stage = stage; rbb.desc_set = descriptorSetIndex; rbb.binding = bindingIndex; + rbb.size = count; rbb.msl_buffer = ssRB.bufferIndex; rbb.msl_texture = ssRB.textureIndex; rbb.msl_sampler = ssRB.samplerIndex; diff --git a/MoltenVK/MoltenVK/GPUObjects/MVKPipeline.mm b/MoltenVK/MoltenVK/GPUObjects/MVKPipeline.mm index 409217e5..2b85c914 100644 --- a/MoltenVK/MoltenVK/GPUObjects/MVKPipeline.mm +++ b/MoltenVK/MoltenVK/GPUObjects/MVKPipeline.mm @@ -101,6 +101,7 @@ void MVKPipelineLayout::populateShaderConverterContext(SPIRVToMSLConversionConfi models[i], kPushConstDescSet, kPushConstBinding, + 1, nullptr); } } @@ -1996,6 +1997,7 @@ namespace SPIRV_CROSS_NAMESPACE { archive(rb.stage, rb.desc_set, rb.binding, + rb.size, rb.msl_buffer, rb.msl_texture, rb.msl_sampler); diff --git a/MoltenVKShaderConverter/MoltenVKShaderConverter/SPIRVToMSLConverter.cpp b/MoltenVKShaderConverter/MoltenVKShaderConverter/SPIRVToMSLConverter.cpp index 705bb727..ccc8455b 100644 --- a/MoltenVKShaderConverter/MoltenVKShaderConverter/SPIRVToMSLConverter.cpp +++ b/MoltenVKShaderConverter/MoltenVKShaderConverter/SPIRVToMSLConverter.cpp @@ -101,6 +101,7 @@ MVK_PUBLIC_SYMBOL bool mvk::MSLResourceBinding::matches(const MSLResourceBinding if (resourceBinding.stage != other.resourceBinding.stage) { return false; } if (resourceBinding.desc_set != other.resourceBinding.desc_set) { return false; } if (resourceBinding.binding != other.resourceBinding.binding) { return false; } + if (resourceBinding.size != other.resourceBinding.size) { return false; } if (resourceBinding.msl_buffer != other.resourceBinding.msl_buffer) { return false; } if (resourceBinding.msl_texture != other.resourceBinding.msl_texture) { return false; } if (resourceBinding.msl_sampler != other.resourceBinding.msl_sampler) { return false; }