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