From 9ff5e56eb74c7d418bf94a085c7e4eaa83335dea Mon Sep 17 00:00:00 2001 From: Boris Brezillon Date: Wed, 22 May 2024 17:16:35 +0200 Subject: [PATCH] panvk: Take VK_RENDERING_{RESUM,SUSPEND}ING_BIT flags into account Don't close the current batch when suspending a rendering pass, and only open a new batch if the cur_batch was closed by a compute job being queued in the middle. We also don't re-init the FB info if we're resuming. Signed-off-by: Boris Brezillon Acked-by: Erik Faye-Lund Part-of: --- src/panfrost/vulkan/panvk_cmd_buffer.h | 2 ++ src/panfrost/vulkan/panvk_vX_cmd_buffer.c | 26 ++++++++++++++++++++--- 2 files changed, 25 insertions(+), 3 deletions(-) diff --git a/src/panfrost/vulkan/panvk_cmd_buffer.h b/src/panfrost/vulkan/panvk_cmd_buffer.h index 03f378e922a..58cac39f595 100644 --- a/src/panfrost/vulkan/panvk_cmd_buffer.h +++ b/src/panfrost/vulkan/panvk_cmd_buffer.h @@ -133,6 +133,8 @@ struct panvk_cmd_graphics_state { } ib; struct { + VkRenderingFlags flags; + enum vk_rp_attachment_flags bound_attachments; struct { VkFormat fmts[MAX_RTS]; diff --git a/src/panfrost/vulkan/panvk_vX_cmd_buffer.c b/src/panfrost/vulkan/panvk_vX_cmd_buffer.c index 318ddc2215b..9f2e5011f79 100644 --- a/src/panfrost/vulkan/panvk_vX_cmd_buffer.c +++ b/src/panfrost/vulkan/panvk_vX_cmd_buffer.c @@ -2025,6 +2025,12 @@ panvk_cmd_begin_rendering_init_state(struct panvk_cmd_buffer *cmdbuf, struct pan_fb_info *fbinfo = &cmdbuf->state.gfx.render.fb.info; uint32_t att_width = 0, att_height = 0; + cmdbuf->state.gfx.render.flags = pRenderingInfo->flags; + + /* Resuming from a suspended pass, the state should be unchanged. */ + if (cmdbuf->state.gfx.render.flags & VK_RENDERING_RESUMING_BIT) + return; + cmdbuf->state.gfx.render.fb.bo_count = 0; memset(cmdbuf->state.gfx.render.fb.bos, 0, sizeof(cmdbuf->state.gfx.render.fb.bos)); @@ -2170,7 +2176,19 @@ panvk_per_arch(CmdBeginRendering)(VkCommandBuffer commandBuffer, VK_FROM_HANDLE(panvk_cmd_buffer, cmdbuf, commandBuffer); panvk_cmd_begin_rendering_init_state(cmdbuf, pRenderingInfo); - panvk_per_arch(cmd_open_batch)(cmdbuf); + + bool resuming = cmdbuf->state.gfx.render.flags & VK_RENDERING_RESUMING_BIT; + + /* If we're not resuming, cur_batch should be NULL. */ + assert(!cmdbuf->cur_batch || resuming); + + /* The opened batch might have been disrupted by a compute job. + * We need to preload in that case. */ + if (resuming && !cmdbuf->cur_batch) + panvk_cmd_preload_fb_after_batch_split(cmdbuf); + + if (!cmdbuf->cur_batch) + panvk_per_arch(cmd_open_batch)(cmdbuf); } VKAPI_ATTR void VKAPI_CALL @@ -2178,8 +2196,10 @@ panvk_per_arch(CmdEndRendering)(VkCommandBuffer commandBuffer) { VK_FROM_HANDLE(panvk_cmd_buffer, cmdbuf, commandBuffer); - panvk_per_arch(cmd_close_batch)(cmdbuf); - cmdbuf->cur_batch = NULL; + if (!(cmdbuf->state.gfx.render.flags & VK_RENDERING_SUSPENDING_BIT)) { + panvk_per_arch(cmd_close_batch)(cmdbuf); + cmdbuf->cur_batch = NULL; + } } VKAPI_ATTR void VKAPI_CALL