From 2b1ec1c35d514b73e1e9a66c498a08ddcbb6323e Mon Sep 17 00:00:00 2001 From: Benjamin Lee Date: Wed, 23 Oct 2024 23:23:51 -0700 Subject: [PATCH] panvk: allow resuming secondary cmdbufs with dynamic rendering The removed assertion was originally added to enforce > VUID-vkCmdExecuteCommands-pCommandBuffers-00100: > If vkCmdExecuteCommands is not being called within a render pass > instance, each element of pCommandBuffers must not have been recorded > with the VK_COMMAND_BUFFER_USAGE_RENDER_PASS_CONTINUE_BIT However, if a render pass instance is entered with vkCmdBeginRendering, vk_command_buffer::render_pass is unset. Code change was done by Boris, only commit description was added. Fixes: c2299b66428 ("panvk/csf: Implement vkCmdExecuteCommands") Co-authored-by: Boris Brezillon Signed-off-by: Benjamin Lee Reviewed-by: Mary Guillemard Reviewed-by: Boris Brezillon Reviewed-by: Rebecca Mckeever Part-of: --- src/panfrost/vulkan/csf/panvk_vX_cmd_draw.c | 10 +++++++--- 1 file changed, 7 insertions(+), 3 deletions(-) diff --git a/src/panfrost/vulkan/csf/panvk_vX_cmd_draw.c b/src/panfrost/vulkan/csf/panvk_vX_cmd_draw.c index b5b1784b30d..45505665021 100644 --- a/src/panfrost/vulkan/csf/panvk_vX_cmd_draw.c +++ b/src/panfrost/vulkan/csf/panvk_vX_cmd_draw.c @@ -1537,7 +1537,6 @@ panvk_per_arch(cmd_prepare_exec_cmd_for_draws)( VkResult result; if (secondary->flags & VK_COMMAND_BUFFER_USAGE_RENDER_PASS_CONTINUE_BIT) { - assert(primary->vk.render_pass); result = get_tiler_desc(primary); if (result != VK_SUCCESS) return; @@ -1605,8 +1604,13 @@ panvk_cmd_draw_indirect(struct panvk_cmd_buffer *cmdbuf, return; /* Layered indirect draw (VK_EXT_shader_viewport_index_layer) needs - * additional changes. */ - assert(cmdbuf->state.gfx.render.layer_count == 1); + * additional changes. We allow layer_count == 0 because that happens + * when mixing dynamic rendering and secondary command buffers. Once + * we decide to support layared+indirect, we'll need to pass the + * layer_count info through the tiler descriptor, for instance by + * re-using one of the word that's flagged 'ignored' in the descriptor + * (word 14:23). */ + assert(cmdbuf->state.gfx.render.layer_count <= 1); /* MultiDrawIndirect (.maxDrawIndirectCount) needs additional changes. */ assert(draw->indirect.draw_count == 1);