From 8a6c3a73f70af7b5183c2341e159d5463c136189 Mon Sep 17 00:00:00 2001 From: baldurk Date: Fri, 25 Oct 2024 10:37:25 +0100 Subject: [PATCH] Handle garbage descriptor set in vkCmdPushDescriptorSetKHR. Closes #3461 --- renderdoc/driver/vulkan/wrappers/vk_cmd_funcs.cpp | 11 +++++++++-- util/test/demos/vk/vk_parameter_zoo.cpp | 6 ++++++ 2 files changed, 15 insertions(+), 2 deletions(-) diff --git a/renderdoc/driver/vulkan/wrappers/vk_cmd_funcs.cpp b/renderdoc/driver/vulkan/wrappers/vk_cmd_funcs.cpp index bee67e097..e8918619a 100644 --- a/renderdoc/driver/vulkan/wrappers/vk_cmd_funcs.cpp +++ b/renderdoc/driver/vulkan/wrappers/vk_cmd_funcs.cpp @@ -5643,7 +5643,7 @@ void WrappedVulkan::vkCmdPushDescriptorSetKHR(VkCommandBuffer commandBuffer, for(uint32_t i = 0; i < descriptorWriteCount; i++) { unwrappedWrites[i] = pDescriptorWrites[i]; - unwrappedWrites[i].dstSet = Unwrap(unwrappedWrites[i].dstSet); + unwrappedWrites[i].dstSet = VK_NULL_HANDLE; // ignored, may be invalid VkDescriptorBufferInfo *bufInfos = nextDescriptors; VkDescriptorImageInfo *imInfos = (VkDescriptorImageInfo *)bufInfos; @@ -5716,9 +5716,16 @@ void WrappedVulkan::vkCmdPushDescriptorSetKHR(VkCommandBuffer commandBuffer, CACHE_THREAD_SERIALISER(); + // sanitise the descriptor set writes in case there is an invalid set which must be ignored + VkWriteDescriptorSet *sanitised = + (VkWriteDescriptorSet *)GetTempMemory(sizeof(VkWriteDescriptorSet) * descriptorWriteCount); + memcpy(sanitised, pDescriptorWrites, sizeof(VkWriteDescriptorSet) * descriptorWriteCount); + for(uint32_t i = 0; i < descriptorWriteCount; i++) + sanitised[i].dstSet = VK_NULL_HANDLE; + SCOPED_SERIALISE_CHUNK(VulkanChunk::vkCmdPushDescriptorSetKHR); Serialise_vkCmdPushDescriptorSetKHR(ser, commandBuffer, pipelineBindPoint, layout, set, - descriptorWriteCount, pDescriptorWrites); + descriptorWriteCount, sanitised); record->AddChunk(scope.Get(&record->cmdInfo->alloc)); record->MarkResourceFrameReferenced(GetResID(layout), eFrameRef_Read); diff --git a/util/test/demos/vk/vk_parameter_zoo.cpp b/util/test/demos/vk/vk_parameter_zoo.cpp index 85912656f..bea1e8aa2 100644 --- a/util/test/demos/vk/vk_parameter_zoo.cpp +++ b/util/test/demos/vk/vk_parameter_zoo.cpp @@ -1780,6 +1780,12 @@ void main() vkCmdPushDescriptorSetWithTemplateKHR(cmd, pushtempl, layout, 1, &pushdata); vkCmdDraw(cmd, 3, 1, 0, 0); + if(KHR_push_descriptor) + vkCmdPushDescriptorSetKHR( + cmd, VK_PIPELINE_BIND_POINT_GRAPHICS, layout, 1, 1, + vkh::WriteDescriptorSet((VkDescriptorSet)0x1234, 20, + VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER, validBufInfos)); + vkCmdBindPipeline(cmd, VK_PIPELINE_BIND_POINT_GRAPHICS, immutpipe); vkh::cmdBindDescriptorSets(cmd, VK_PIPELINE_BIND_POINT_GRAPHICS, immutlayout, 0, {immutdescset}, {});