From 78e84aa544228f5cc302913867ebbeb8f6893f9b Mon Sep 17 00:00:00 2001 From: baldurk Date: Tue, 16 Apr 2024 20:03:54 +0100 Subject: [PATCH] Don't crash on empty descriptor sets with no bindings --- renderdoc/driver/vulkan/vk_replay.cpp | 7 ++++--- renderdoc/driver/vulkan/vk_shaderdebug.cpp | 2 +- util/test/demos/vk/vk_parameter_zoo.cpp | 9 ++++++++- 3 files changed, 13 insertions(+), 5 deletions(-) diff --git a/renderdoc/driver/vulkan/vk_replay.cpp b/renderdoc/driver/vulkan/vk_replay.cpp index 66bbda291..4f5a638f0 100644 --- a/renderdoc/driver/vulkan/vk_replay.cpp +++ b/renderdoc/driver/vulkan/vk_replay.cpp @@ -2044,7 +2044,8 @@ void VulkanReplay::SavePipelineState(uint32_t eventId) const WrappedVulkan::DescriptorSetInfo &descSetState = m_pDriver->m_DescriptorSetState[sourceSet]; - const DescriptorSetSlot *first = descSetState.data.binds[0]; + const DescriptorSetSlot *first = + descSetState.data.binds.empty() ? NULL : descSetState.data.binds[0]; for(size_t b = 0; b < descSetState.data.binds.size(); b++) { const DescSetLayout::Binding &layoutBind = @@ -2435,7 +2436,7 @@ rdcarray VulkanReplay::GetDescriptors(ResourceId descriptorStore, size_t dst = 0; for(const DescriptorRange &r : ranges) { - const DescriptorSetSlot *desc = set.data.binds[0]; + const DescriptorSetSlot *desc = set.data.binds.empty() ? NULL : set.data.binds[0]; const DescriptorSetSlot *end = desc + set.data.totalDescriptorCount(); desc += (r.offset - set.data.inlineBytes.size()); @@ -2508,7 +2509,7 @@ rdcarray VulkanReplay::GetSamplerDescriptors(ResourceId descr size_t dst = 0; for(const DescriptorRange &r : ranges) { - const DescriptorSetSlot *desc = set.data.binds[0]; + const DescriptorSetSlot *desc = set.data.binds.empty() ? NULL : set.data.binds[0]; const DescriptorSetSlot *end = desc + set.data.totalDescriptorCount(); desc += r.offset; diff --git a/renderdoc/driver/vulkan/vk_shaderdebug.cpp b/renderdoc/driver/vulkan/vk_shaderdebug.cpp index 8b780c7d9..6be411165 100644 --- a/renderdoc/driver/vulkan/vk_shaderdebug.cpp +++ b/renderdoc/driver/vulkan/vk_shaderdebug.cpp @@ -209,7 +209,7 @@ public: const BindingStorage &bindStorage = m_pDriver->GetCurrentDescSetBindingStorage(srcData.descSet); - const DescriptorSetSlot *first = bindStorage.binds[0]; + const DescriptorSetSlot *first = bindStorage.binds.empty() ? NULL : bindStorage.binds[0]; for(size_t b = 0; b < bindStorage.binds.size(); b++) { const DescSetLayout::Binding &layoutBind = diff --git a/util/test/demos/vk/vk_parameter_zoo.cpp b/util/test/demos/vk/vk_parameter_zoo.cpp index c63b8defa..85912656f 100644 --- a/util/test/demos/vk/vk_parameter_zoo.cpp +++ b/util/test/demos/vk/vk_parameter_zoo.cpp @@ -581,8 +581,13 @@ void main() VkDescriptorSet asm_descset = allocateDescriptorSet(asm_setlayout); + VkDescriptorSetLayout empty_setlayout = + createDescriptorSetLayout(vkh::DescriptorSetLayoutCreateInfo({})); + + VkDescriptorSet empty_descset = allocateDescriptorSet(empty_setlayout); + VkPipelineLayout asm_layout = createPipelineLayout(vkh::PipelineLayoutCreateInfo( - {asm_setlayout}, {vkh::PushConstantRange(VK_SHADER_STAGE_VERTEX_BIT, 0, 4)})); + {asm_setlayout, empty_setlayout}, {vkh::PushConstantRange(VK_SHADER_STAGE_VERTEX_BIT, 0, 4)})); vkh::RenderPassCreator renderPassCreateInfo; @@ -1755,6 +1760,8 @@ void main() vkCmdPushConstants(cmd, asm_layout, VK_SHADER_STAGE_VERTEX_BIT, 0, 4, &idx); vkh::cmdBindDescriptorSets(cmd, VK_PIPELINE_BIND_POINT_GRAPHICS, asm_layout, 0, {asm_descset}, {}); + vkh::cmdBindDescriptorSets(cmd, VK_PIPELINE_BIND_POINT_GRAPHICS, asm_layout, 1, + {empty_descset}, {}); setMarker(cmd, "ASM Draw"); vkCmdDraw(cmd, 4, 1, 0, 0);