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>
/* 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;