From 85c4b5c680b5a00204a56c02ad054a6d7b296954 Mon Sep 17 00:00:00 2001 From: Bill Hollings Date: Tue, 26 Jul 2022 16:57:47 -0400 Subject: [PATCH] Fix vkUpdateDescriptorSetWithTemplate() for inline block descriptors. Wrap incoming data in VkWriteDescriptorSetInlineUniformBlock before passing to MVKInlineUniformBlockDescriptor::write(). --- Docs/Whats_New.md | 1 + MoltenVK/MoltenVK/GPUObjects/MVKDescriptorSet.mm | 12 ++++++++++++ 2 files changed, 13 insertions(+) diff --git a/Docs/Whats_New.md b/Docs/Whats_New.md index 68086a8a..d5fa9a6d 100644 --- a/Docs/Whats_New.md +++ b/Docs/Whats_New.md @@ -28,6 +28,7 @@ Released TBD - Check `MTLDevice` to enable support for `VK_KHR_fragment_shader_barycentric` and `VK_NV_fragment_shader_barycentric` extensions. - Fix query pool wait block when query is not encoded to be written to. +- Fix `vkUpdateDescriptorSetWithTemplate()` for inline block descriptors. - Ignore sampler update in descriptor set bindings that use immutable samplers. - Update `VK_MVK_MOLTENVK_SPEC_VERSION` to version `35`. diff --git a/MoltenVK/MoltenVK/GPUObjects/MVKDescriptorSet.mm b/MoltenVK/MoltenVK/GPUObjects/MVKDescriptorSet.mm index 86a6efd1..70f20cd3 100644 --- a/MoltenVK/MoltenVK/GPUObjects/MVKDescriptorSet.mm +++ b/MoltenVK/MoltenVK/GPUObjects/MVKDescriptorSet.mm @@ -924,6 +924,8 @@ void mvkUpdateDescriptorSets(uint32_t writeCount, // For inline block create a temp buffer of descCnt bytes to hold data during copy. uint8_t dstBuffer[descCnt]; VkWriteDescriptorSetInlineUniformBlockEXT inlineUniformBlock; + inlineUniformBlock.sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET_INLINE_UNIFORM_BLOCK; + inlineUniformBlock.pNext = nullptr; inlineUniformBlock.pData = dstBuffer; inlineUniformBlock.dataSize = descCnt; @@ -953,6 +955,16 @@ void mvkUpdateDescriptorSetWithTemplate(VkDescriptorSet descriptorSet, for (uint32_t i = 0; i < pTemplate->getNumberOfEntries(); i++) { const VkDescriptorUpdateTemplateEntryKHR* pEntry = pTemplate->getEntry(i); const void* pCurData = (const char*)pData + pEntry->offset; + + // For inline block, wrap the raw data in in inline update struct. + VkWriteDescriptorSetInlineUniformBlockEXT inlineUniformBlock; + if (pEntry->descriptorType == VK_DESCRIPTOR_TYPE_INLINE_UNIFORM_BLOCK_EXT) { + inlineUniformBlock.sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET_INLINE_UNIFORM_BLOCK; + inlineUniformBlock.pNext = nullptr; + inlineUniformBlock.pData = pCurData; + inlineUniformBlock.dataSize = pEntry->descriptorCount; + pCurData = &inlineUniformBlock; + } dstSet->write(pEntry, pEntry->stride, pCurData); } }