Fix vkUpdateDescriptorSetWithTemplate() for inline block descriptors.
Wrap incoming data in VkWriteDescriptorSetInlineUniformBlock
before passing to MVKInlineUniformBlockDescriptor::write().
diff --git a/Docs/Whats_New.md b/Docs/Whats_New.md
index 68086a8..d5fa9a6 100644
--- a/Docs/Whats_New.md
+++ b/Docs/Whats_New.md
@@ -28,6 +28,7 @@
- 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 86a6efd..70f20cd 100644
--- a/MoltenVK/MoltenVK/GPUObjects/MVKDescriptorSet.mm
+++ b/MoltenVK/MoltenVK/GPUObjects/MVKDescriptorSet.mm
@@ -924,6 +924,8 @@
// 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 @@
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);
}
}