From 0b92d4ec9825550cc23999130296d26d8ad75097 Mon Sep 17 00:00:00 2001 From: Bas Nieuwenhuizen Date: Fri, 3 Sep 2021 03:08:49 +0200 Subject: [PATCH] radv: Add GPU serialization of acceleration structures. Reviewed-by: Samuel Pitoiset Part-of: --- src/amd/vulkan/radv_acceleration_structure.c | 69 ++++++++++++++++++++ 1 file changed, 69 insertions(+) diff --git a/src/amd/vulkan/radv_acceleration_structure.c b/src/amd/vulkan/radv_acceleration_structure.c index 0c2db936191..83b3fb262e7 100644 --- a/src/amd/vulkan/radv_acceleration_structure.c +++ b/src/amd/vulkan/radv_acceleration_structure.c @@ -2034,3 +2034,72 @@ radv_CopyAccelerationStructureToMemoryKHR(VkDevice _device, device->ws->buffer_unmap(accel_struct->bo); return VK_SUCCESS; } + +void +radv_CmdCopyMemoryToAccelerationStructureKHR( + VkCommandBuffer commandBuffer, const VkCopyMemoryToAccelerationStructureInfoKHR *pInfo) +{ + RADV_FROM_HANDLE(radv_cmd_buffer, cmd_buffer, commandBuffer); + RADV_FROM_HANDLE(radv_acceleration_structure, dst, pInfo->dst); + struct radv_meta_saved_state saved_state; + + radv_meta_save( + &saved_state, cmd_buffer, + RADV_META_SAVE_COMPUTE_PIPELINE | RADV_META_SAVE_DESCRIPTORS | RADV_META_SAVE_CONSTANTS); + + uint64_t dst_addr = radv_accel_struct_get_va(dst); + + radv_CmdBindPipeline(radv_cmd_buffer_to_handle(cmd_buffer), VK_PIPELINE_BIND_POINT_COMPUTE, + cmd_buffer->device->meta_state.accel_struct_build.copy_pipeline); + + const struct copy_constants consts = { + .src_addr = pInfo->src.deviceAddress, + .dst_addr = dst_addr, + .mode = COPY_MODE_DESERIALIZE, + }; + + radv_CmdPushConstants(radv_cmd_buffer_to_handle(cmd_buffer), + cmd_buffer->device->meta_state.accel_struct_build.copy_p_layout, + VK_SHADER_STAGE_COMPUTE_BIT, 0, sizeof(consts), &consts); + + radv_CmdDispatch(commandBuffer, 512, 1, 1); + radv_meta_restore(&saved_state, cmd_buffer); +} + +void +radv_CmdCopyAccelerationStructureToMemoryKHR( + VkCommandBuffer commandBuffer, const VkCopyAccelerationStructureToMemoryInfoKHR *pInfo) +{ + RADV_FROM_HANDLE(radv_cmd_buffer, cmd_buffer, commandBuffer); + RADV_FROM_HANDLE(radv_acceleration_structure, src, pInfo->src); + struct radv_meta_saved_state saved_state; + + radv_meta_save( + &saved_state, cmd_buffer, + RADV_META_SAVE_COMPUTE_PIPELINE | RADV_META_SAVE_DESCRIPTORS | RADV_META_SAVE_CONSTANTS); + + uint64_t src_addr = radv_accel_struct_get_va(src); + + radv_CmdBindPipeline(radv_cmd_buffer_to_handle(cmd_buffer), VK_PIPELINE_BIND_POINT_COMPUTE, + cmd_buffer->device->meta_state.accel_struct_build.copy_pipeline); + + const struct copy_constants consts = { + .src_addr = src_addr, + .dst_addr = pInfo->dst.deviceAddress, + .mode = COPY_MODE_SERIALIZE, + }; + + radv_CmdPushConstants(radv_cmd_buffer_to_handle(cmd_buffer), + cmd_buffer->device->meta_state.accel_struct_build.copy_p_layout, + VK_SHADER_STAGE_COMPUTE_BIT, 0, sizeof(consts), &consts); + + radv_indirect_dispatch(cmd_buffer, src->bo, + src_addr + offsetof(struct radv_accel_struct_header, copy_dispatch_size)); + radv_meta_restore(&saved_state, cmd_buffer); + + /* Set the header of the serialized data. */ + uint8_t header_data[2 * VK_UUID_SIZE] = {0}; + memcpy(header_data, cmd_buffer->device->physical_device->driver_uuid, VK_UUID_SIZE); + + radv_update_buffer_cp(cmd_buffer, pInfo->dst.deviceAddress, header_data, sizeof(header_data)); +}