From d71a05dffabcf497ae32ba3a150c4b7ff635147f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Timur=20Krist=C3=B3f?= Date: Thu, 22 Feb 2024 17:07:45 +0100 Subject: [PATCH] radv: Implement gang semaphores for transfer queues. MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit We need to use gang semaphores in the following two scenarios: 1. Leader to follower semaphore: Increment the leader to follower semaphore when the leader wants to block the follower: a transfer operation on ACE needs to wait for a previous operation on SDMA. 2. Follower to leader semaphore: Increment the follower to leader semaphore when the follower wants to block the leader: a transfer operation on SDMA needs to wait for a previous operation on ACE. Signed-off-by: Timur Kristóf Reviewed-by: Konstantin Seurer Reviewed-by: Samuel Pitoiset Part-of: --- src/amd/vulkan/radv_cmd_buffer.c | 26 +++++++++++++++++++++++--- 1 file changed, 23 insertions(+), 3 deletions(-) diff --git a/src/amd/vulkan/radv_cmd_buffer.c b/src/amd/vulkan/radv_cmd_buffer.c index efa6e2ed224..9dae1c12b1a 100644 --- a/src/amd/vulkan/radv_cmd_buffer.c +++ b/src/amd/vulkan/radv_cmd_buffer.c @@ -1459,10 +1459,30 @@ radv_gang_barrier(struct radv_cmd_buffer *cmd_buffer, VkPipelineStageFlags2 src_ VK_PIPELINE_STAGE_2_BOTTOM_OF_PIPE_BIT | VK_PIPELINE_STAGE_2_ALL_COMMANDS_BIT)) dst_stage_mask |= cmd_buffer->state.dma_is_busy ? VK_PIPELINE_STAGE_2_TASK_SHADER_BIT_EXT : 0; - /* Increment the GFX/ACE semaphore when task shaders are blocked. */ - if (dst_stage_mask & (VK_PIPELINE_STAGE_2_TOP_OF_PIPE_BIT | VK_PIPELINE_STAGE_2_DRAW_INDIRECT_BIT | - RADV_TASK_SHADER_SENSITIVE_STAGES)) + /* Increment the leader to follower semaphore when the leader wants to block the follower: + * - graphics command buffer: task shader execution needs to wait for something + * - transfer command buffer: a transfer operation on ACE needs to wait for a previous operation on SDMA + */ + const VkPipelineStageFlags2 gang_leader_flags = + cmd_buffer->qf == RADV_QUEUE_TRANSFER + ? (VK_PIPELINE_STAGE_2_TOP_OF_PIPE_BIT | VK_PIPELINE_STAGE_2_ALL_TRANSFER_BIT | + VK_PIPELINE_STAGE_2_ALL_COMMANDS_BIT) + : (VK_PIPELINE_STAGE_2_TOP_OF_PIPE_BIT | VK_PIPELINE_STAGE_2_DRAW_INDIRECT_BIT | + RADV_TASK_SHADER_SENSITIVE_STAGES); + if (dst_stage_mask & gang_leader_flags) cmd_buffer->gang.sem.leader_value++; + + /* Increment the follower to leader semaphore when the follower wants to block the leader: + * - graphics command buffer: not necessary yet + * - transfer command buffer: a transfer operation on SDMA needs to wait for a previous operation on ACE + */ + const VkPipelineStageFlags2 gang_follower_flags = + cmd_buffer->qf == RADV_QUEUE_TRANSFER + ? (VK_PIPELINE_STAGE_2_BOTTOM_OF_PIPE_BIT | VK_PIPELINE_STAGE_2_ALL_TRANSFER_BIT | + VK_PIPELINE_STAGE_2_ALL_COMMANDS_BIT) + : 0; + if (src_stage_mask & gang_follower_flags) + cmd_buffer->gang.sem.follower_value++; } void