From 3b326abf7bc3d0b751fdcaf1eb6b3405c5f995cc Mon Sep 17 00:00:00 2001 From: Samuel Pitoiset Date: Thu, 5 Jun 2025 12:53:58 +0200 Subject: [PATCH] radv: add capture/replay for sparse buffers and descriptor buffer Shouldn't be super useful in practice because the normal capture/replay BDA path should also work. Signed-off-by: Samuel Pitoiset Part-of: --- src/amd/vulkan/radv_buffer.c | 19 +++++++++++++++++++ src/amd/vulkan/radv_physical_device.c | 6 +++--- 2 files changed, 22 insertions(+), 3 deletions(-) diff --git a/src/amd/vulkan/radv_buffer.c b/src/amd/vulkan/radv_buffer.c index 06aff2f056d..04614e7b389 100644 --- a/src/amd/vulkan/radv_buffer.c +++ b/src/amd/vulkan/radv_buffer.c @@ -76,6 +76,15 @@ radv_create_buffer(struct radv_device *device, const VkBufferCreateInfo *pCreate replay_address = opaque_addr_info->opaqueCaptureAddress; } + if (buffer->vk.create_flags & VK_BUFFER_CREATE_DESCRIPTOR_BUFFER_CAPTURE_REPLAY_BIT_EXT) { + flags |= RADEON_FLAG_REPLAYABLE; + + const VkOpaqueCaptureDescriptorDataCreateInfoEXT *opaque_info = + vk_find_struct_const(pCreateInfo->pNext, OPAQUE_CAPTURE_DESCRIPTOR_DATA_CREATE_INFO_EXT); + if (opaque_info) + replay_address = *((const uint64_t *)opaque_info->opaqueCaptureDescriptorData); + } + if (buffer->vk.usage & (VK_BUFFER_USAGE_2_RESOURCE_DESCRIPTOR_BUFFER_BIT_EXT | VK_BUFFER_USAGE_2_SAMPLER_DESCRIPTOR_BUFFER_BIT_EXT)) flags |= RADEON_FLAG_32BIT; @@ -240,6 +249,16 @@ radv_GetBufferOpaqueCaptureAddress(VkDevice device, const VkBufferDeviceAddressI return buffer->vk.device_address; } +VKAPI_ATTR VkResult VKAPI_CALL +radv_GetBufferOpaqueCaptureDescriptorDataEXT(VkDevice device, const VkBufferCaptureDescriptorDataInfoEXT *pInfo, + void *pData) +{ + VK_FROM_HANDLE(radv_buffer, buffer, pInfo->buffer); + + *((uint64_t *)pData) = buffer->vk.device_address; + return VK_SUCCESS; +} + VkResult radv_bo_create(struct radv_device *device, struct vk_object_base *object, uint64_t size, unsigned alignment, enum radeon_bo_domain domain, enum radeon_bo_flag flags, unsigned priority, uint64_t address, diff --git a/src/amd/vulkan/radv_physical_device.c b/src/amd/vulkan/radv_physical_device.c index 223551b8f1c..cc5498200c1 100644 --- a/src/amd/vulkan/radv_physical_device.c +++ b/src/amd/vulkan/radv_physical_device.c @@ -1868,10 +1868,10 @@ radv_get_physical_device_properties(struct radv_physical_device *pdev) .maxSamplerDescriptorBufferBindings = MAX_SETS, .maxEmbeddedImmutableSamplerBindings = MAX_SETS, .maxEmbeddedImmutableSamplers = radv_max_descriptor_set_size(), - /* No data required for capture/replay (except for sparse images) but these values need to be - * non-zero. + /* No data required for capture/replay (except for sparse buffers/images) but these values + * need to be non-zero. */ - .bufferCaptureReplayDescriptorDataSize = 1, + .bufferCaptureReplayDescriptorDataSize = 8, .imageCaptureReplayDescriptorDataSize = 8, .imageViewCaptureReplayDescriptorDataSize = 1, .samplerCaptureReplayDescriptorDataSize = 1,