From c8b7cd2df439b5bdcbd996c4f0629ae04bd0df55 Mon Sep 17 00:00:00 2001 From: Hans-Kristian Arntzen Date: Sat, 30 Aug 2025 16:32:01 +0200 Subject: [PATCH 1/2] Add descriptor type descriptor uniqueness key. Avoids problem when storage image and sampled image are extracted from the same view object. --- renderdoc/driver/vulkan/vk_resources.h | 13 ++++++++----- .../driver/vulkan/wrappers/vk_descriptor_funcs.cpp | 9 +++++---- 2 files changed, 13 insertions(+), 9 deletions(-) diff --git a/renderdoc/driver/vulkan/vk_resources.h b/renderdoc/driver/vulkan/vk_resources.h index 2914616f81..db844db1d8 100644 --- a/renderdoc/driver/vulkan/vk_resources.h +++ b/renderdoc/driver/vulkan/vk_resources.h @@ -1028,23 +1028,25 @@ DECLARE_REFLECTION_STRUCT(AspectSparseTable); struct DescriptorUniquenessKey { - DescriptorUniquenessKey(VkImageLayout layout) - : layout(layout), offset(0), size(0), fmt(VK_FORMAT_UNDEFINED) + DescriptorUniquenessKey(VkImageLayout layout, VkDescriptorType type) + : layout(layout), offset(0), size(0), fmt(VK_FORMAT_UNDEFINED), type(type) { } - DescriptorUniquenessKey(uint64_t offset, uint64_t size, VkFormat fmt) - : layout(VK_IMAGE_LAYOUT_UNDEFINED), offset(offset), size(size), fmt(fmt) + DescriptorUniquenessKey(uint64_t offset, uint64_t size, VkFormat fmt, VkDescriptorType type) + : layout(VK_IMAGE_LAYOUT_UNDEFINED), offset(offset), size(size), fmt(fmt), type(type) { } bool operator==(const DescriptorUniquenessKey &key) const { - return layout == key.layout && offset == key.offset && size == key.size && fmt == key.fmt; + return layout == key.layout && offset == key.offset && size == key.size && fmt == key.fmt && + type == key.type; } VkImageLayout layout; uint64_t offset, size; VkFormat fmt; + VkDescriptorType type; }; namespace std @@ -1058,6 +1060,7 @@ struct hash hash ^= std::hash()(key.offset) + 0x9e3779b9 + (hash << 6) + (hash >> 2); hash ^= std::hash()(key.size) + 0x9e3779b9 + (hash << 6) + (hash >> 2); hash ^= std::hash()(key.fmt) + 0x9e3779b9 + (hash << 6) + (hash >> 2); + hash ^= std::hash()(key.type) + 0x9e3779b9 + (hash << 6) + (hash >> 2); return hash; } }; diff --git a/renderdoc/driver/vulkan/wrappers/vk_descriptor_funcs.cpp b/renderdoc/driver/vulkan/wrappers/vk_descriptor_funcs.cpp index 4d91f4ae63..17657d3233 100644 --- a/renderdoc/driver/vulkan/wrappers/vk_descriptor_funcs.cpp +++ b/renderdoc/driver/vulkan/wrappers/vk_descriptor_funcs.cpp @@ -3452,9 +3452,9 @@ void WrappedVulkan::vkGetDescriptorEXT(VkDevice device, const VkDescriptorGetInf dstRecord = GetRecord(pDescriptorInfo->data.pSampledImage->imageView); DescriptorUniquenessKey descKey( - m_IgnoreLayoutForDescriptors - ? VK_IMAGE_LAYOUT_UNDEFINED - : pDescriptorInfo->data.pCombinedImageSampler->imageLayout); + m_IgnoreLayoutForDescriptors ? VK_IMAGE_LAYOUT_UNDEFINED + : pDescriptorInfo->data.pCombinedImageSampler->imageLayout, + pDescriptorInfo->type); // this is internally locked if(!dstRecord->resInfo->AddDescriptor(descKey)) @@ -3523,7 +3523,8 @@ void WrappedVulkan::vkGetDescriptorEXT(VkDevice device, const VkDescriptorGetInf dstRecord = GetResourceManager()->GetResourceRecord(id); - DescriptorUniquenessKey descKey(offs, pDescriptorInfo->data.pUniformBuffer->range, fmt); + DescriptorUniquenessKey descKey(offs, pDescriptorInfo->data.pUniformBuffer->range, fmt, + pDescriptorInfo->type); // this is internally locked if(!dstRecord->resInfo->AddDescriptor(descKey)) From d394696e46953dbb4a7140d9aaeb9347f4b1f569 Mon Sep 17 00:00:00 2001 From: Hans-Kristian Arntzen Date: Sat, 30 Aug 2025 17:13:55 +0200 Subject: [PATCH 2/2] Fix bad merge for aliased descriptors. --- renderdoc/replay/replay_controller.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/renderdoc/replay/replay_controller.cpp b/renderdoc/replay/replay_controller.cpp index f8e28b208c..552d229ffd 100644 --- a/renderdoc/replay/replay_controller.cpp +++ b/renderdoc/replay/replay_controller.cpp @@ -2327,7 +2327,7 @@ void ReplayController::FetchPipelineState(uint32_t eventId) // if the last range is contiguous with this access, append this access as a new range to query if(!ranges.empty() && ranges.back().descriptorSize == acc.byteSize && - ranges.back().offset + ranges.back().descriptorSize == acc.byteOffset && + ranges.back().offset + ranges.back().count * ranges.back().descriptorSize == acc.byteOffset && ranges.back().type == acc.type) { ranges.back().count++;