From 236dcccedb722288b5ed54da45233b1bb9356ba8 Mon Sep 17 00:00:00 2001 From: Mary Guillemard Date: Tue, 3 Jun 2025 10:21:59 +0200 Subject: [PATCH] panvk: Use NEXT_SB_ENTRY on v11+ and prepare for indirect wait Now that cs_next_iter_sb match NEXT_SB_ENTRY behavior, we can just implement it with it. We also setup the scoreboard wait mask when selecting the next scoreboard entry to prepare for defer indirect wait and signal usage around the codebase. Signed-off-by: Mary Guillemard Reviewed-by: Lars-Ivar Hesselberg Simonsen Part-of: --- src/panfrost/vulkan/csf/panvk_vX_cmd_buffer.c | 25 +++++++++++++++++++ src/panfrost/vulkan/csf/panvk_vX_queue.c | 2 ++ 2 files changed, 27 insertions(+) diff --git a/src/panfrost/vulkan/csf/panvk_vX_cmd_buffer.c b/src/panfrost/vulkan/csf/panvk_vX_cmd_buffer.c index 154b705a3aa..17d7a18f7f8 100644 --- a/src/panfrost/vulkan/csf/panvk_vX_cmd_buffer.c +++ b/src/panfrost/vulkan/csf/panvk_vX_cmd_buffer.c @@ -617,6 +617,30 @@ panvk_per_arch(CmdPipelineBarrier2)(VkCommandBuffer commandBuffer, } } +#if PAN_ARCH >= 11 +void +panvk_per_arch(cs_next_iter_sb)(struct panvk_cmd_buffer *cmdbuf, + enum panvk_subqueue_id subqueue, + struct cs_index scratch_regs) +{ + struct cs_builder *b = panvk_get_cs_builder(cmdbuf, subqueue); + struct cs_index iter_sb = cs_extract32(b, scratch_regs, 0); + struct cs_index sb_wait_mask = cs_extract32(b, scratch_regs, 1); + + /* Wait for scoreboard to be available and select the next scoreboard entry */ + cs_next_sb_entry(b, iter_sb, MALI_CS_SCOREBOARD_TYPE_ENDPOINT, + MALI_CS_NEXT_SB_ENTRY_FORMAT_INDEX); + + /* Setup indirect scoreboard wait mask now for indirect defer */ + cs_move32_to(b, sb_wait_mask, 0); + cs_bit_set32(b, sb_wait_mask, sb_wait_mask, iter_sb); + cs_set_state(b, MALI_CS_SET_STATE_TYPE_SB_MASK_WAIT, sb_wait_mask); + + cs_store32(b, iter_sb, cs_subqueue_ctx_reg(b), + offsetof(struct panvk_cs_subqueue_context, iter_sb)); + cs_flush_stores(b); +} +#else void panvk_per_arch(cs_next_iter_sb)(struct panvk_cmd_buffer *cmdbuf, enum panvk_subqueue_id subqueue, @@ -656,6 +680,7 @@ panvk_per_arch(cs_next_iter_sb)(struct panvk_cmd_buffer *cmdbuf, offsetof(struct panvk_cs_subqueue_context, iter_sb)); cs_flush_stores(b); } +#endif static struct cs_buffer alloc_cs_buffer(void *cookie) diff --git a/src/panfrost/vulkan/csf/panvk_vX_queue.c b/src/panfrost/vulkan/csf/panvk_vX_queue.c index 05e5052bf0d..02c4e397fcf 100644 --- a/src/panfrost/vulkan/csf/panvk_vX_queue.c +++ b/src/panfrost/vulkan/csf/panvk_vX_queue.c @@ -428,6 +428,8 @@ init_subqueue(struct panvk_queue *queue, enum panvk_subqueue_id subqueue) #if PAN_ARCH >= 11 cs_set_state_imm32(&b, MALI_CS_SET_STATE_TYPE_SB_SEL_ENDPOINT, SB_ITER(0)); cs_set_state_imm32(&b, MALI_CS_SET_STATE_TYPE_SB_SEL_OTHER, SB_ID(LS)); + cs_set_state_imm32(&b, MALI_CS_SET_STATE_TYPE_SB_SEL_DEFERRED, SB_ID(DEFERRED_SYNC)); + cs_set_state_imm32(&b, MALI_CS_SET_STATE_TYPE_SB_MASK_STREAM, dev->csf.sb.all_iters_mask); #else cs_set_scoreboard_entry(&b, SB_ITER(0), SB_ID(LS)); #endif