From d64eeba25c94ea81f03e71a7a91df186828408ae Mon Sep 17 00:00:00 2001 From: Hans-Kristian Arntzen Date: Sat, 30 Aug 2025 16:32:01 +0200 Subject: [PATCH] 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 2914616f8..db844db1d 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 4d91f4ae6..17657d323 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))