From 361a598b4c6d2319249e1c842314b0c8bfdf534e Mon Sep 17 00:00:00 2001 From: Samuel Pitoiset Date: Fri, 14 Feb 2025 08:12:13 +0100 Subject: [PATCH] radv: use radv_CmdDispatchIndirect() in the accel struct path Signed-off-by: Samuel Pitoiset Part-of: --- src/amd/vulkan/radv_acceleration_structure.c | 14 ++++++-------- src/amd/vulkan/radv_cmd_buffer.c | 18 +++++------------- src/amd/vulkan/radv_cmd_buffer.h | 2 -- 3 files changed, 11 insertions(+), 23 deletions(-) diff --git a/src/amd/vulkan/radv_acceleration_structure.c b/src/amd/vulkan/radv_acceleration_structure.c index 2fbb40cfc04..95b7ff10fdf 100644 --- a/src/amd/vulkan/radv_acceleration_structure.c +++ b/src/amd/vulkan/radv_acceleration_structure.c @@ -788,7 +788,6 @@ radv_CmdCopyAccelerationStructureKHR(VkCommandBuffer commandBuffer, const VkCopy VK_FROM_HANDLE(radv_cmd_buffer, cmd_buffer, commandBuffer); VK_FROM_HANDLE(vk_acceleration_structure, src, pInfo->src); VK_FROM_HANDLE(vk_acceleration_structure, dst, pInfo->dst); - VK_FROM_HANDLE(radv_buffer, src_buffer, src->buffer); struct radv_device *device = radv_cmd_buffer_device(cmd_buffer); struct radv_meta_saved_state saved_state; @@ -817,9 +816,9 @@ radv_CmdCopyAccelerationStructureKHR(VkCommandBuffer commandBuffer, const VkCopy cmd_buffer->state.flush_bits |= radv_dst_access_flush(cmd_buffer, VK_PIPELINE_STAGE_2_DRAW_INDIRECT_BIT, VK_ACCESS_2_INDIRECT_COMMAND_READ_BIT, 0, NULL, NULL); - radv_indirect_dispatch( - cmd_buffer, src_buffer->bo, - vk_acceleration_structure_get_va(src) + offsetof(struct radv_accel_struct_header, copy_dispatch_size)); + radv_CmdDispatchIndirect(commandBuffer, src->buffer, + src->offset + offsetof(struct radv_accel_struct_header, copy_dispatch_size)); + radv_meta_restore(&saved_state, cmd_buffer); } @@ -877,7 +876,6 @@ radv_CmdCopyAccelerationStructureToMemoryKHR(VkCommandBuffer commandBuffer, { VK_FROM_HANDLE(radv_cmd_buffer, cmd_buffer, commandBuffer); VK_FROM_HANDLE(vk_acceleration_structure, src, pInfo->src); - VK_FROM_HANDLE(radv_buffer, src_buffer, src->buffer); struct radv_device *device = radv_cmd_buffer_device(cmd_buffer); const struct radv_physical_device *pdev = radv_device_physical(device); struct radv_meta_saved_state saved_state; @@ -907,9 +905,9 @@ radv_CmdCopyAccelerationStructureToMemoryKHR(VkCommandBuffer commandBuffer, cmd_buffer->state.flush_bits |= radv_dst_access_flush(cmd_buffer, VK_PIPELINE_STAGE_2_DRAW_INDIRECT_BIT, VK_ACCESS_2_INDIRECT_COMMAND_READ_BIT, 0, NULL, NULL); - radv_indirect_dispatch( - cmd_buffer, src_buffer->bo, - vk_acceleration_structure_get_va(src) + offsetof(struct radv_accel_struct_header, copy_dispatch_size)); + radv_CmdDispatchIndirect(commandBuffer, src->buffer, + src->offset + offsetof(struct radv_accel_struct_header, copy_dispatch_size)); + radv_meta_restore(&saved_state, cmd_buffer); /* Set the header of the serialized data. */ diff --git a/src/amd/vulkan/radv_cmd_buffer.c b/src/amd/vulkan/radv_cmd_buffer.c index 8b7c80812c4..f10ff868851 100644 --- a/src/amd/vulkan/radv_cmd_buffer.c +++ b/src/amd/vulkan/radv_cmd_buffer.c @@ -12084,9 +12084,12 @@ radv_CmdDispatchIndirect(VkCommandBuffer commandBuffer, VkBuffer _buffer, VkDevi { VK_FROM_HANDLE(radv_cmd_buffer, cmd_buffer, commandBuffer); VK_FROM_HANDLE(radv_buffer, buffer, _buffer); - const uint64_t va = buffer->addr + offset; + struct radv_device *device = radv_cmd_buffer_device(cmd_buffer); + struct radv_dispatch_info info = {.indirect_va = buffer->addr + offset}; - radv_indirect_dispatch(cmd_buffer, buffer->bo, va); + radv_cs_add_buffer(device->ws, cmd_buffer->cs, buffer->bo); + + radv_compute_dispatch(cmd_buffer, &info); } void @@ -12102,17 +12105,6 @@ radv_unaligned_dispatch(struct radv_cmd_buffer *cmd_buffer, uint32_t x, uint32_t radv_compute_dispatch(cmd_buffer, &info); } -void -radv_indirect_dispatch(struct radv_cmd_buffer *cmd_buffer, struct radeon_winsys_bo *bo, uint64_t va) -{ - struct radv_device *device = radv_cmd_buffer_device(cmd_buffer); - struct radv_dispatch_info info = {.indirect_va = va}; - - radv_cs_add_buffer(device->ws, cmd_buffer->cs, bo); - - radv_compute_dispatch(cmd_buffer, &info); -} - static void radv_trace_trace_rays(struct radv_cmd_buffer *cmd_buffer, const VkTraceRaysIndirectCommand2KHR *cmd, uint64_t indirect_va) diff --git a/src/amd/vulkan/radv_cmd_buffer.h b/src/amd/vulkan/radv_cmd_buffer.h index db0bfbe9d17..39fd6e450b8 100644 --- a/src/amd/vulkan/radv_cmd_buffer.h +++ b/src/amd/vulkan/radv_cmd_buffer.h @@ -793,8 +793,6 @@ void radv_compute_dispatch(struct radv_cmd_buffer *cmd_buffer, const struct radv */ void radv_unaligned_dispatch(struct radv_cmd_buffer *cmd_buffer, uint32_t x, uint32_t y, uint32_t z); -void radv_indirect_dispatch(struct radv_cmd_buffer *cmd_buffer, struct radeon_winsys_bo *bo, uint64_t va); - uint32_t radv_init_fmask(struct radv_cmd_buffer *cmd_buffer, struct radv_image *image, const VkImageSubresourceRange *range);