From b70254174fcbda5244eff06dff0255775e580552 Mon Sep 17 00:00:00 2001 From: baldurk Date: Mon, 7 Apr 2025 10:47:57 +0100 Subject: [PATCH] Handle marking sparse BDA buffers as referenced. Closes #3572 --- renderdoc/driver/vulkan/vk_core.cpp | 2 ++ .../vulkan/wrappers/vk_resource_funcs.cpp | 34 +++++++++++++++---- 2 files changed, 30 insertions(+), 6 deletions(-) diff --git a/renderdoc/driver/vulkan/vk_core.cpp b/renderdoc/driver/vulkan/vk_core.cpp index 14b3930b9..ff9c9e8a9 100644 --- a/renderdoc/driver/vulkan/vk_core.cpp +++ b/renderdoc/driver/vulkan/vk_core.cpp @@ -2414,6 +2414,8 @@ void WrappedVulkan::StartFrameCapture(DeviceOwnedWindow devWnd) // and its backing memory GetResourceManager()->MarkMemoryFrameReferenced((*it)->baseResourceMem, (*it)->memOffset, (*it)->memSize, eFrameRef_ReadBeforeWrite); + // and sparse memory (yuck yuck yuck) + GetResourceManager()->MarkSparseMapReferenced((*it)->resInfo); } } diff --git a/renderdoc/driver/vulkan/wrappers/vk_resource_funcs.cpp b/renderdoc/driver/vulkan/wrappers/vk_resource_funcs.cpp index 3ac954ffd..807599076 100644 --- a/renderdoc/driver/vulkan/wrappers/vk_resource_funcs.cpp +++ b/renderdoc/driver/vulkan/wrappers/vk_resource_funcs.cpp @@ -1788,12 +1788,6 @@ bool WrappedVulkan::Serialise_vkCreateBuffer(SerialiserType &ser, VkDevice devic VkResult ret = ObjDisp(device)->CreateBuffer(Unwrap(device), &patched, NULL, &buf); - if(CreateInfo.flags & - (VK_BUFFER_CREATE_SPARSE_BINDING_BIT | VK_BUFFER_CREATE_SPARSE_RESIDENCY_BIT)) - { - APIProps.SparseResources = true; - } - SetBufferUsageFlags(&CreateInfo, origusage); if(ret != VK_SUCCESS) @@ -1811,6 +1805,34 @@ bool WrappedVulkan::Serialise_vkCreateBuffer(SerialiserType &ser, VkDevice devic memoryRequirements); } + if(CreateInfo.flags & + (VK_BUFFER_CREATE_SPARSE_BINDING_BIT | VK_BUFFER_CREATE_SPARSE_RESIDENCY_BIT)) + { + APIProps.SparseResources = true; + + // for sparse BDA buffers we can and must request the address now since it won't be queried on memory bind + if(CreateInfo.usage & VK_BUFFER_USAGE_SHADER_DEVICE_ADDRESS_BIT) + { + VulkanCreationInfo::Buffer &bufInfo = m_CreationInfo.m_Buffer[GetResID(buf)]; + + VkBufferDeviceAddressInfo getInfo = { + VK_STRUCTURE_TYPE_BUFFER_DEVICE_ADDRESS_INFO, + NULL, + Unwrap(buf), + }; + + RDCCOMPILE_ASSERT(VK_STRUCTURE_TYPE_BUFFER_DEVICE_ADDRESS_INFO == + VK_STRUCTURE_TYPE_BUFFER_DEVICE_ADDRESS_INFO_EXT, + "KHR and EXT buffer_device_address should be interchangeable here."); + + if(GetExtensions(GetRecord(device)).ext_KHR_buffer_device_address) + bufInfo.gpuAddress = ObjDisp(device)->GetBufferDeviceAddress(Unwrap(device), &getInfo); + else if(GetExtensions(GetRecord(device)).ext_EXT_buffer_device_address) + bufInfo.gpuAddress = ObjDisp(device)->GetBufferDeviceAddressEXT(Unwrap(device), &getInfo); + m_CreationInfo.m_BufferAddresses[bufInfo.gpuAddress] = GetResID(buf); + } + } + AddResource(Buffer, ResourceType::Buffer, "Buffer"); DerivedResource(device, Buffer); }