From 6911634820bb29b2b0b25410608426e4c42da164 Mon Sep 17 00:00:00 2001 From: Boris Brezillon Date: Fri, 31 Jan 2025 14:33:20 +0100 Subject: [PATCH] panvk: Don't clobber registers if the render pass was suspended Commit 2d3c50d484bb ("panvk: Fix barriers in secondary cmdbufs w/o rp's") started resetting the render flags we were relying on to decide to clobber registers or not. Introduce a new field to restore that check. Fixes: 2d3c50d484bb ("panvk: Fix barriers in secondary cmdbufs w/o rp's") Signed-off-by: Boris Brezillon Reviewed-by: Lars-Ivar Hesselberg Simonsen Part-of: (cherry picked from commit 127af6f38a36bd127f091b11bd2ad070582544d1) --- .pick_status.json | 2 +- src/panfrost/vulkan/csf/panvk_vX_cmd_buffer.c | 6 +++--- src/panfrost/vulkan/csf/panvk_vX_cmd_draw.c | 2 ++ src/panfrost/vulkan/panvk_cmd_draw.h | 3 +++ 4 files changed, 9 insertions(+), 4 deletions(-) diff --git a/.pick_status.json b/.pick_status.json index 08e2e177f85..49efe3e0313 100644 --- a/.pick_status.json +++ b/.pick_status.json @@ -824,7 +824,7 @@ "description": "panvk: Don't clobber registers if the render pass was suspended", "nominated": true, "nomination_type": 2, - "resolution": 0, + "resolution": 1, "main_sha": null, "because_sha": "2d3c50d484bb25fe595959b00cfb92fe538d1d6f", "notes": null diff --git a/src/panfrost/vulkan/csf/panvk_vX_cmd_buffer.c b/src/panfrost/vulkan/csf/panvk_vX_cmd_buffer.c index 14fae6c9b5a..2dfa71d1634 100644 --- a/src/panfrost/vulkan/csf/panvk_vX_cmd_buffer.c +++ b/src/panfrost/vulkan/csf/panvk_vX_cmd_buffer.c @@ -171,7 +171,7 @@ finish_cs(struct panvk_cmd_buffer *cmdbuf, uint32_t subqueue) * simple with this all-or-nothing approach. */ if ((instance->debug_flags & PANVK_DEBUG_CS) && cmdbuf->vk.level != VK_COMMAND_BUFFER_LEVEL_SECONDARY && - !(cmdbuf->state.gfx.render.flags & VK_RENDERING_SUSPENDING_BIT)) { + !cmdbuf->state.gfx.render.suspended) { cs_update_cmdbuf_regs(b) { /* Poison all cmdbuf registers to make sure we don't inherit state from * a previously executed cmdbuf. */ @@ -934,8 +934,8 @@ panvk_per_arch(CmdExecuteCommands)(VkCommandBuffer commandBuffer, /* We need to propagate the suspending state of the secondary command * buffer if we want to avoid poisoning the reg file when the secondary * command buffer suspended the render pass. */ - if (secondary->state.gfx.render.flags & VK_RENDERING_SUSPENDING_BIT) - primary->state.gfx.render.flags = secondary->state.gfx.render.flags; + primary->state.gfx.render.suspended = + secondary->state.gfx.render.suspended; /* If the render context we passed to the secondary command buffer got * invalidated, reset the FB/tiler descs and treat things as if we diff --git a/src/panfrost/vulkan/csf/panvk_vX_cmd_draw.c b/src/panfrost/vulkan/csf/panvk_vX_cmd_draw.c index 30d452dc23c..022857ae8b6 100644 --- a/src/panfrost/vulkan/csf/panvk_vX_cmd_draw.c +++ b/src/panfrost/vulkan/csf/panvk_vX_cmd_draw.c @@ -2081,6 +2081,7 @@ panvk_per_arch(cmd_inherit_render_state)( to_panvk_physical_device(dev->vk.physical); struct pan_fb_info *fbinfo = &cmdbuf->state.gfx.render.fb.info; + cmdbuf->state.gfx.render.suspended = false; cmdbuf->state.gfx.render.flags = inheritance_info->flags; gfx_state_set_dirty(cmdbuf, RENDER_STATE); @@ -2614,6 +2615,7 @@ panvk_per_arch(CmdEndRendering)(VkCommandBuffer commandBuffer) * so any barrier encountered after EndRendering() doesn't try to flush * draws. */ cmdbuf->state.gfx.render.flags = 0; + cmdbuf->state.gfx.render.suspended = suspending; /* If we're not suspending, we need to resolve attachments. */ if (!suspending) diff --git a/src/panfrost/vulkan/panvk_cmd_draw.h b/src/panfrost/vulkan/panvk_cmd_draw.h index 43a03375faa..39011a16c2d 100644 --- a/src/panfrost/vulkan/panvk_cmd_draw.h +++ b/src/panfrost/vulkan/panvk_cmd_draw.h @@ -77,6 +77,9 @@ struct panvk_rendering_state { * inherited context, and the primary command buffer needs to know. */ bool invalidate_inherited_ctx; + /* True if the last render pass was suspended. */ + bool suspended; + struct { /* != 0 if the render pass contains one or more occlusion queries to * signal. */