radv: fix GPU hangs with PS epilogs and secondaries properly

The previous fix was incomplete because if the same graphics pipeline
and the same PS epilog are rebind after vkCmdExecuteCommands(), the PS
epilog state wouldn't be re-emitted, and it will use a wrong VA (in case
both fragment shader user SGPRs aren't similar either).

Resetting the PS epilog to NULL in the primary should prevent any
issues, but this tracking still need to be improved because it caused
two issues recently.

Fixes: 1a00587c44 ("radv: fix a GPU hang with PS epilogs and secondary command buffers")
Closes: https://gitlab.freedesktop.org/mesa/mesa/-/work_items/15176
Signed-off-by: Samuel Pitoiset <samuel.pitoiset@gmail.com>
Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/41056>
This commit is contained in:
Samuel Pitoiset 2026-04-20 15:06:29 +02:00 committed by Marge Bot
parent 9d17a7bdb4
commit a73fc90bcd

View file

@ -10020,7 +10020,6 @@ radv_CmdExecuteCommands(VkCommandBuffer commandBuffer, uint32_t commandBufferCou
primary->state.emitted_compute_pipeline = secondary->state.emitted_compute_pipeline;
primary->state.emitted_rt_pipeline = secondary->state.emitted_rt_pipeline;
primary->state.ps_epilog = secondary->state.ps_epilog;
primary->state.emitted_vs_prolog = secondary->state.emitted_vs_prolog;
if (secondary->state.last_ia_multi_vgt_param) {
@ -10083,6 +10082,9 @@ radv_CmdExecuteCommands(VkCommandBuffer commandBuffer, uint32_t commandBufferCou
primary->state.last_first_instance = -1;
primary->state.last_drawid = -1;
primary->state.last_vertex_offset_valid = false;
/* Make sure to re-emit the PS epilog if the same graphics pipeline is bind again. */
primary->state.ps_epilog = NULL;
}
static void