radv: suspend user conditional rendering when DGC has task shaders

Otherwise the DGC ACE IB would be uninitialized and it would hang.

Signed-off-by: Samuel Pitoiset <samuel.pitoiset@gmail.com>
Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/29954>
This commit is contained in:
Samuel Pitoiset
2024-06-28 08:51:40 +02:00
committed by Marge Bot
parent 49eda4d742
commit cc48e12431

View File

@@ -11526,19 +11526,23 @@ radv_CmdExecuteGeneratedCommandsNV(VkCommandBuffer commandBuffer, VkBool32 isPre
}
if (!radv_dgc_can_preprocess(layout, pipeline)) {
/* Suspend conditional rendering when the DGC execute is called on the compute queue to
* generate a cmdbuf which will skips dispatches when necessary. This is because the
* compute queue is missing IB2 which means it's not possible to skip the cmdbuf entirely.
* It should also be suspended when task shaders are used because the DGC ACE IB would be
* uninitialized otherwise.
*/
const bool suspend_cond_render =
(cmd_buffer->qf == RADV_QUEUE_COMPUTE || radv_dgc_with_task_shader(pGeneratedCommandsInfo));
const bool old_predicating = cmd_buffer->state.predicating;
if (cmd_buffer->qf == RADV_QUEUE_COMPUTE && cmd_buffer->state.predicating) {
/* Suspend conditional rendering when the DGC execute is called on the compute queue to
* generate a cmdbuf which will skips dispatches when necessary. This is because the
* compute queue is missing IB2 which means it's not possible to skip the cmdbuf entirely.
*/
if (suspend_cond_render && cmd_buffer->state.predicating) {
cmd_buffer->state.predicating = false;
}
radv_prepare_dgc(cmd_buffer, pGeneratedCommandsInfo, old_predicating);
if (cmd_buffer->qf == RADV_QUEUE_COMPUTE) {
if (suspend_cond_render) {
cmd_buffer->state.predicating = old_predicating;
}