From f390835074bdf162a63deb0311d1a6de527f9f89 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Louis-Francis=20Ratt=C3=A9-Boulianne?= Date: Wed, 21 Aug 2024 00:04:35 -0400 Subject: [PATCH] panfrost: use special DrawID register on CSF-based GPUs MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit It allows easier support for multi indirect draws by updating the draw ID value in each iteration of the loop. Signed-off-by: Louis-Francis Ratté-Boulianne Reviewed-by: Boris Brezillon Part-of: --- src/gallium/drivers/panfrost/pan_csf.c | 24 +++++++++++++++++-- .../drivers/panfrost/pan_nir_lower_sysvals.c | 2 ++ 2 files changed, 24 insertions(+), 2 deletions(-) diff --git a/src/gallium/drivers/panfrost/pan_csf.c b/src/gallium/drivers/panfrost/pan_csf.c index fff30f50292..2555d0f8c4c 100644 --- a/src/gallium/drivers/panfrost/pan_csf.c +++ b/src/gallium/drivers/panfrost/pan_csf.c @@ -927,6 +927,22 @@ csf_emit_draw_state(struct panfrost_batch *batch, return flags_override; } +static struct cs_index +csf_emit_draw_id_register(struct panfrost_batch *batch, unsigned offset) +{ + struct cs_builder *b = batch->csf.cs.builder; + struct panfrost_context *ctx = batch->ctx; + struct panfrost_uncompiled_shader *vs = ctx->uncompiled[PIPE_SHADER_VERTEX]; + + if (!BITSET_TEST(vs->nir->info.system_values_read, SYSTEM_VALUE_DRAW_ID)) + return cs_undef(); + + struct cs_index drawid = cs_reg32(b, 67); + cs_move32_to(b, drawid, offset); + + return drawid; +} + void GENX(csf_launch_draw)(struct panfrost_batch *batch, const struct pipe_draw_info *info, unsigned drawid_offset, @@ -936,6 +952,7 @@ GENX(csf_launch_draw)(struct panfrost_batch *batch, struct cs_builder *b = batch->csf.cs.builder; uint32_t flags_override = csf_emit_draw_state(batch, info, drawid_offset); + struct cs_index drawid = csf_emit_draw_id_register(batch, drawid_offset); cs_move32_to(b, cs_reg32(b, 33), draw->count); cs_move32_to(b, cs_reg32(b, 34), info->instance_count); @@ -953,7 +970,7 @@ GENX(csf_launch_draw)(struct panfrost_batch *batch, } cs_run_idvs(b, flags_override, false, true, cs_shader_res_sel(0, 0, 1, 0), - cs_shader_res_sel(2, 2, 2, 0), cs_undef()); + cs_shader_res_sel(2, 2, 2, 0), drawid); } void @@ -965,6 +982,7 @@ GENX(csf_launch_draw_indirect)(struct panfrost_batch *batch, struct cs_builder *b = batch->csf.cs.builder; uint32_t flags_override = csf_emit_draw_state(batch, info, drawid_offset); + struct cs_index drawid = csf_emit_draw_id_register(batch, drawid_offset); struct cs_index address = cs_reg64(b, 64); struct cs_index counter = cs_reg32(b, 66); @@ -990,10 +1008,12 @@ GENX(csf_launch_draw_indirect)(struct panfrost_batch *batch, cs_wait_slot(b, 0, false); cs_run_idvs(b, flags_override, false, true, cs_shader_res_sel(0, 0, 1, 0), - cs_shader_res_sel(2, 2, 2, 0), cs_undef()); + cs_shader_res_sel(2, 2, 2, 0), drawid); cs_add64(b, address, address, indirect->stride); cs_add32(b, counter, counter, (unsigned int)-1); + if (drawid.type != CS_INDEX_UNDEF) + cs_add32(b, drawid, drawid, 1); } } diff --git a/src/gallium/drivers/panfrost/pan_nir_lower_sysvals.c b/src/gallium/drivers/panfrost/pan_nir_lower_sysvals.c index 8b4a77abaef..72262d70b56 100644 --- a/src/gallium/drivers/panfrost/pan_nir_lower_sysvals.c +++ b/src/gallium/drivers/panfrost/pan_nir_lower_sysvals.c @@ -90,8 +90,10 @@ sysval_for_intrinsic(nir_intrinsic_instr *intr, unsigned *offset) *offset = 8; return PAN_SYSVAL_VERTEX_INSTANCE_OFFSETS; +#if PAN_ARCH <= 7 case nir_intrinsic_load_draw_id: return PAN_SYSVAL_DRAWID; +#endif case nir_intrinsic_load_multisampled_pan: return PAN_SYSVAL_MULTISAMPLED;