From c25161a759e5bee7d4c29fd36e98d487fa65dfd6 Mon Sep 17 00:00:00 2001 From: baldurk Date: Wed, 3 Sep 2025 17:17:26 +0100 Subject: [PATCH] Allow aliasing between different descriptor types silently * Also make the error about duplicate keys less severe - this can happen in practice as different views boil down to the same descriptor bytes and applications don't use only one view. --- renderdoc/core/rdcbytetrie.h | 17 +++++++++++++--- renderdoc/driver/vulkan/vk_core.cpp | 27 ++++++++++++++++++++++++-- renderdoc/replay/basic_types_tests.cpp | 2 ++ 3 files changed, 41 insertions(+), 5 deletions(-) diff --git a/renderdoc/core/rdcbytetrie.h b/renderdoc/core/rdcbytetrie.h index 57e631c45..9ebfd955d 100644 --- a/renderdoc/core/rdcbytetrie.h +++ b/renderdoc/core/rdcbytetrie.h @@ -99,9 +99,17 @@ struct rdcbytetrie return true; // used only so the tests can EXPECT_ERROR() - RDResult err; - SET_ERROR_RESULT(err, ResultCode::InternalError, "Duplicate key with differing value located"); - (void)err; + if(m_StrictErrorChecking) + { + RDResult err; + SET_ERROR_RESULT(err, ResultCode::InternalError, + "Duplicate key with differing value located"); + (void)err; + } + else + { + RDCWARN("Duplicate key with differing value located"); + } return false; } @@ -110,6 +118,8 @@ struct rdcbytetrie return true; } + void SetStrictErrorChecking(bool check) { m_StrictErrorChecking = check; } + private: /////////////////////////////// // nodes @@ -615,4 +625,5 @@ private: /////////////////////////////// NodeOrLeaf *m_Root = NULL; + bool m_StrictErrorChecking = false; }; diff --git a/renderdoc/driver/vulkan/vk_core.cpp b/renderdoc/driver/vulkan/vk_core.cpp index be1039941..d1246d1cd 100644 --- a/renderdoc/driver/vulkan/vk_core.cpp +++ b/renderdoc/driver/vulkan/vk_core.cpp @@ -123,7 +123,7 @@ bool DescriptorTrieNode::operator==(const DescriptorTrieNode &o) const return true; } - if(type != o.type || resource != o.resource || sampler != o.sampler || offset != o.offset) + if(resource != o.resource || sampler != o.sampler || offset != o.offset) return false; // deliberately allow imageLayout differences to be considered equal still - some drivers are @@ -132,7 +132,30 @@ bool DescriptorTrieNode::operator==(const DescriptorTrieNode &o) const if((range & rangeToleranceMask) != (o.range & rangeToleranceMask)) return false; - return true; + if(type == o.type) + return true; + + // allow similar types alias based on usage if they're otherwise identical since not all descriptors + // vary this way and the type is provided on lookup so this won't cause any problems in practice + DescriptorSlotType aType = RDCMIN(type, o.type); + DescriptorSlotType bType = RDCMAX(type, o.type); + + if(aType == DescriptorSlotType::SampledImage && bType == DescriptorSlotType::StorageImage) + return true; + if(aType == DescriptorSlotType::SampledImage && bType == DescriptorSlotType::InputAttachment) + return true; + if(aType == DescriptorSlotType::StorageImage && bType == DescriptorSlotType::InputAttachment) + return true; + + if(aType == DescriptorSlotType::UniformBuffer && bType == DescriptorSlotType::StorageBuffer) + return true; + if(aType == DescriptorSlotType::UniformTexelBuffer && + bType == DescriptorSlotType::StorageTexelBuffer) + return true; + + // could maybe allow all buffer types to alias but we'll stick to this for now + + return false; } uint64_t DescriptorTrieNode::rangeToleranceMask = ~0ULL; diff --git a/renderdoc/replay/basic_types_tests.cpp b/renderdoc/replay/basic_types_tests.cpp index 6c9d03322..394eb3835 100644 --- a/renderdoc/replay/basic_types_tests.cpp +++ b/renderdoc/replay/basic_types_tests.cpp @@ -2585,6 +2585,8 @@ TEST_CASE("Test rdcbytetrie type", "[basictypes][rdcbytetrie]") { rdcbytetrie trie; + trie.SetStrictErrorChecking(true); + SECTION("Simple lookups") { KV keyVals[] = {