From 752fba464398f1193d4616234a311f985dfa4814 Mon Sep 17 00:00:00 2001 From: Samuel Pitoiset Date: Thu, 31 Aug 2023 10:35:38 +0200 Subject: [PATCH] radv: fix gang submissions with chaining Gang submissions are mostly only be used for task shaders to both submit GFX and ACE command buffers in the same submission. Though, the gang leader (the last submitted CS) IP type should match the queue IP type to determine which fence to signal. But if chaining is enabled, it's possible that all GFX cmdbufs are chained to the first GFX cmdbuf, which means the last CS is ACE and not GFX. Fix this by resetting chaining for GFX when a cmdbuffer has GFX+ACE. Cc: mesa-stable Closes: https://gitlab.freedesktop.org/mesa/mesa/-/issues/9724 Signed-off-by: Samuel Pitoiset Part-of: --- src/amd/vulkan/radv_queue.c | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/src/amd/vulkan/radv_queue.c b/src/amd/vulkan/radv_queue.c index f420ff2..f5bd047 100644 --- a/src/amd/vulkan/radv_queue.c +++ b/src/amd/vulkan/radv_queue.c @@ -1637,8 +1637,14 @@ radv_queue_submit_normal(struct radv_queue *queue, struct vk_queue_submit *submi /* Follower needs to be first because the last CS must match the queue's IP type. */ if (radv_cmd_buffer_has_follower(cmd_buffer)) { queue->device->ws->cs_unchain(cmd_buffer->gang.cs); - if (!chainable_ace || !queue->device->ws->cs_chain(chainable_ace, cmd_buffer->gang.cs, false)) + if (!chainable_ace || !queue->device->ws->cs_chain(chainable_ace, cmd_buffer->gang.cs, false)) { cs_array[num_submitted_cs++] = cmd_buffer->gang.cs; + /* Reset chaining for GFX when the cmdbuf has GFX+ACE because the follower CS (ACE) + * must always be before the leader CS (GFX). Otherwise, the GFX CS might be chained + * to previous one and ordering would be incorrect. + */ + chainable = NULL; + } chainable_ace = can_chain_next ? cmd_buffer->gang.cs : NULL; submit_ace = true; -- 2.7.4