radv: fix gang submissions with chaining
authorSamuel Pitoiset <samuel.pitoiset@gmail.com>
Thu, 31 Aug 2023 08:35:38 +0000 (10:35 +0200)
committerMarge Bot <emma+marge@anholt.net>
Fri, 6 Oct 2023 12:42:33 +0000 (12:42 +0000)
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 <samuel.pitoiset@gmail.com>
Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/24966>

src/amd/vulkan/radv_queue.c

index f420ff2..f5bd047 100644 (file)
@@ -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;