From abb0b9d843fd8e56b28b2ba26e844893783b7269 Mon Sep 17 00:00:00 2001 From: baldurk Date: Wed, 16 Apr 2025 12:15:53 +0100 Subject: [PATCH] Fix validation issue with ASs as memory can't be used without buffer --- .../driver/vulkan/vk_acceleration_structure.cpp | 14 +++++++++++--- .../driver/vulkan/vk_acceleration_structure.h | 2 ++ .../driver/vulkan/wrappers/vk_device_funcs.cpp | 4 ++++ 3 files changed, 17 insertions(+), 3 deletions(-) diff --git a/renderdoc/driver/vulkan/vk_acceleration_structure.cpp b/renderdoc/driver/vulkan/vk_acceleration_structure.cpp index d04b424d9..f0b2fe48c 100644 --- a/renderdoc/driver/vulkan/vk_acceleration_structure.cpp +++ b/renderdoc/driver/vulkan/vk_acceleration_structure.cpp @@ -173,6 +173,16 @@ VulkanAccelerationStructureManager::VulkanAccelerationStructureManager(WrappedVu { } +void VulkanAccelerationStructureManager::Cleanup() +{ + if(!scratchBuffers.empty()) + { + const VkDevice d = m_pDriver->GetDev(); + for(VkBuffer buf : scratchBuffers) + ObjDisp(d)->DestroyBuffer(Unwrap(d), buf, NULL); + } +} + RDResult VulkanAccelerationStructureManager::CopyInputBuffers( VkCommandBuffer commandBuffer, const VkAccelerationStructureBuildGeometryInfoKHR &info, const VkAccelerationStructureBuildRangeInfoKHR *buildRange) @@ -966,9 +976,7 @@ void VulkanAccelerationStructureManager::UpdateScratch(VkDeviceSize requiredSize scratchAddressUnion.deviceAddress = ObjDisp(d)->GetBufferDeviceAddressKHR(Unwrap(d), &scratchAddressInfo); - // We do not need the buffer object, only the mem address - m_pDriver->AddPendingObjectCleanup( - [d, buf = scratch.buf]() { ObjDisp(d)->DestroyBuffer(Unwrap(d), buf, NULL); }); + scratchBuffers.push_back(scratch.buf); } } diff --git a/renderdoc/driver/vulkan/vk_acceleration_structure.h b/renderdoc/driver/vulkan/vk_acceleration_structure.h index 56b63d5f7..3c17ece95 100644 --- a/renderdoc/driver/vulkan/vk_acceleration_structure.h +++ b/renderdoc/driver/vulkan/vk_acceleration_structure.h @@ -94,6 +94,7 @@ class VulkanAccelerationStructureManager { public: explicit VulkanAccelerationStructureManager(WrappedVulkan *driver); + void Cleanup(); // Allocates readback mem and injects commands into the command buffer so that the input buffers // are copied. @@ -148,4 +149,5 @@ private: Allocation scratch; VkDeviceOrHostAddressKHR scratchAddressUnion; + rdcarray scratchBuffers; }; diff --git a/renderdoc/driver/vulkan/wrappers/vk_device_funcs.cpp b/renderdoc/driver/vulkan/wrappers/vk_device_funcs.cpp index ff428d49a..836657c02 100644 --- a/renderdoc/driver/vulkan/wrappers/vk_device_funcs.cpp +++ b/renderdoc/driver/vulkan/wrappers/vk_device_funcs.cpp @@ -1044,6 +1044,8 @@ void WrappedVulkan::Shutdown() for(size_t i = 0; i < m_ReplayPhysicalDevices.size(); i++) GetResourceManager()->ReleaseWrappedResource(m_ReplayPhysicalDevices[i]); + m_ASManager->Cleanup(); + m_Replay->DestroyResources(); m_IndirectBuffer.Destroy(); @@ -4840,6 +4842,8 @@ void WrappedVulkan::vkDestroyDevice(VkDevice device, const VkAllocationCallbacks SAFE_DELETE(m_ShaderCache); SAFE_DELETE(m_TextRenderer); + m_ASManager->Cleanup(); + // since we didn't create proper registered resources for our command buffers, // they won't be taken down properly with the pool. So we release them (just our // data) here.