From 4ebfded137df1fd6b4b76bc63f29d87d439e7265 Mon Sep 17 00:00:00 2001 From: baldurk Date: Thu, 22 May 2025 16:40:33 +0100 Subject: [PATCH] Track ASs by address when descriptor buffers are enabled * They are written into descriptors via address not object with descriptor buffer --- .../driver/vulkan/vk_acceleration_structure.h | 2 + renderdoc/driver/vulkan/vk_core.h | 3 ++ .../driver/vulkan/wrappers/vk_misc_funcs.cpp | 38 ++++++++++--------- .../vulkan/wrappers/vk_resource_funcs.cpp | 19 ++++++++++ 4 files changed, 44 insertions(+), 18 deletions(-) diff --git a/renderdoc/driver/vulkan/vk_acceleration_structure.h b/renderdoc/driver/vulkan/vk_acceleration_structure.h index 3c17ece95..ff0139db6 100644 --- a/renderdoc/driver/vulkan/vk_acceleration_structure.h +++ b/renderdoc/driver/vulkan/vk_acceleration_structure.h @@ -66,6 +66,8 @@ struct VkAccelerationStructureInfo void convertGeometryData(rdcarray &geometry) const; rdcarray getBuildRanges() const; + VkDeviceAddress address; + VkAccelerationStructureTypeKHR type = VkAccelerationStructureTypeKHR::VK_ACCELERATION_STRUCTURE_TYPE_GENERIC_KHR; VkBuildAccelerationStructureFlagsKHR flags = 0; diff --git a/renderdoc/driver/vulkan/vk_core.h b/renderdoc/driver/vulkan/vk_core.h index ccf23189b..707a01fcf 100644 --- a/renderdoc/driver/vulkan/vk_core.h +++ b/renderdoc/driver/vulkan/vk_core.h @@ -447,6 +447,9 @@ private: VkQueueFamilyProperties queueProps[16] = {}; }; + Threading::CriticalSection m_ASLookupByAddrLock; + rdcflatmap m_ASLookupByAddr; + bool m_SeparateDepthStencil = false; bool m_NULLDescriptorsAllowed = false; bool m_ExtendedDynState = false; diff --git a/renderdoc/driver/vulkan/wrappers/vk_misc_funcs.cpp b/renderdoc/driver/vulkan/wrappers/vk_misc_funcs.cpp index 674f1286d..48c0f5d35 100644 --- a/renderdoc/driver/vulkan/wrappers/vk_misc_funcs.cpp +++ b/renderdoc/driver/vulkan/wrappers/vk_misc_funcs.cpp @@ -156,18 +156,6 @@ static void MakeSubpassLoadRP(RPCreateInfo &info, const RPCreateInfo *origInfo, } } -template -bool RemoveForcedRef() -{ - return false; -} - -template <> -bool RemoveForcedRef() -{ - return true; -} - // note, for threading reasons we ensure to release the wrappers before // releasing the underlying object. Otherwise after releasing the vulkan object // that same handle could be returned by create on another thread, and we @@ -178,11 +166,6 @@ bool RemoveForcedRef() if(obj == VK_NULL_HANDLE) \ return; \ type unwrappedObj = Unwrap(obj); \ - if(RemoveForcedRef()) \ - { \ - SCOPED_LOCK(m_ForcedReferencesLock); \ - m_ForcedReferences.removeOne(GetRecord(obj)); \ - } \ if(IsReplayMode(m_State)) \ m_CreationInfo.erase(GetResID(obj)); \ GetResourceManager()->ReleaseWrappedResource(obj, true); \ @@ -205,11 +188,30 @@ DESTROY_IMPL(VkCommandPool, DestroyCommandPool) DESTROY_IMPL(VkQueryPool, DestroyQueryPool) DESTROY_IMPL(VkDescriptorUpdateTemplate, DestroyDescriptorUpdateTemplate) DESTROY_IMPL(VkSamplerYcbcrConversion, DestroySamplerYcbcrConversion) -DESTROY_IMPL(VkAccelerationStructureKHR, DestroyAccelerationStructureKHR) DESTROY_IMPL(VkShaderEXT, DestroyShaderEXT) #undef DESTROY_IMPL +void WrappedVulkan::vkDestroyAccelerationStructureKHR(VkDevice device, VkAccelerationStructureKHR obj, + const VkAllocationCallbacks *) +{ + if(obj == VK_NULL_HANDLE) + return; + VkAccelerationStructureKHR unwrappedObj = Unwrap(obj); + { + SCOPED_LOCK(m_ASLookupByAddrLock); + m_ASLookupByAddr.erase(GetRecord(obj)->accelerationStructureInfo->address); + } + { + SCOPED_LOCK(m_ForcedReferencesLock); + m_ForcedReferences.removeOne(GetRecord(obj)); + } + if(IsReplayMode(m_State)) + m_CreationInfo.erase(GetResID(obj)); + GetResourceManager()->ReleaseWrappedResource(obj, true); + ObjDisp(device)->DestroyAccelerationStructureKHR(Unwrap(device), unwrappedObj, NULL); +} + void WrappedVulkan::vkDestroyFramebuffer(VkDevice device, VkFramebuffer obj, const VkAllocationCallbacks *) { diff --git a/renderdoc/driver/vulkan/wrappers/vk_resource_funcs.cpp b/renderdoc/driver/vulkan/wrappers/vk_resource_funcs.cpp index fc4dcf966..74b6437f0 100644 --- a/renderdoc/driver/vulkan/wrappers/vk_resource_funcs.cpp +++ b/renderdoc/driver/vulkan/wrappers/vk_resource_funcs.cpp @@ -3567,6 +3567,16 @@ bool WrappedVulkan::Serialise_vkCreateAccelerationStructureKHR( m_CreationInfo.m_AccelerationStructure[live].Init(GetResourceManager(), m_CreationInfo, &CreateInfo); + + const VkAccelerationStructureDeviceAddressInfoKHR getInfo = { + VK_STRUCTURE_TYPE_ACCELERATION_STRUCTURE_DEVICE_ADDRESS_INFO_KHR, + NULL, + Unwrap(acc), + }; + const VkDeviceAddress addr = + ObjDisp(device)->GetAccelerationStructureDeviceAddressKHR(Unwrap(device), &getInfo); + + m_ASLookupByAddr[addr] = live; } } @@ -3638,6 +3648,7 @@ VkResult WrappedVulkan::vkCreateAccelerationStructureKHR( record->AddParent(bufferRecord); record->accelerationStructureInfo = new VkAccelerationStructureInfo(); + record->accelerationStructureInfo->address = addr; // store the base resource record->baseResource = bufferRecord->GetResourceID(); @@ -3659,6 +3670,14 @@ VkResult WrappedVulkan::vkCreateAccelerationStructureKHR( // in case we're currently capturing, immediately consider the AS as referenced GetResourceManager()->MarkResourceFrameReferenced(record->GetResourceID(), eFrameRef_Read); } + + if(m_DescriptorBuffers) + { + { + SCOPED_LOCK(m_ASLookupByAddrLock); + m_ASLookupByAddr[addr] = id; + } + } } else {