From f71893a942a12d9418ed1febd828489d4e7816e0 Mon Sep 17 00:00:00 2001 From: Iago Toral Quiroga Date: Mon, 10 May 2021 09:02:10 +0200 Subject: [PATCH] broadcom/compiler: implement non-uniform offset on vertex outputs Reviewed-by: Juan A. Suarez Part-of: --- src/broadcom/compiler/nir_to_vir.c | 38 ++++++++++++++++-------------- 1 file changed, 20 insertions(+), 18 deletions(-) diff --git a/src/broadcom/compiler/nir_to_vir.c b/src/broadcom/compiler/nir_to_vir.c index 7f645118991..c1653d4db5b 100644 --- a/src/broadcom/compiler/nir_to_vir.c +++ b/src/broadcom/compiler/nir_to_vir.c @@ -2476,25 +2476,27 @@ emit_store_output_gs(struct v3d_compile *c, nir_intrinsic_instr *instr) static void emit_store_output_vs(struct v3d_compile *c, nir_intrinsic_instr *instr) { - /* XXX perf: Use stvpmv with uniform non-constant offsets and - * stvpmd with non-uniform offsets and enable - * PIPE_SHADER_CAP_INDIRECT_OUTPUT_ADDR. - */ - assert(c->s->info.stage == MESA_SHADER_VERTEX); - assert(instr->num_components == 1); + assert(c->s->info.stage == MESA_SHADER_VERTEX); + assert(instr->num_components == 1); - uint32_t base = nir_intrinsic_base(instr); - if (nir_src_is_const(instr->src[1])) { - vir_VPM_WRITE(c, - ntq_get_src(c, instr->src[0], 0), - base + nir_src_as_uint(instr->src[1])); - } else { - vir_VPM_WRITE_indirect(c, - ntq_get_src(c, instr->src[0], 0), - vir_ADD(c, - ntq_get_src(c, instr->src[1], 1), - vir_uniform_ui(c, base))); - } + uint32_t base = nir_intrinsic_base(instr); + struct qreg val = ntq_get_src(c, instr->src[0], 0); + + if (nir_src_is_const(instr->src[1])) { + vir_VPM_WRITE(c, val, + base + nir_src_as_uint(instr->src[1])); + } else { + struct qreg offset = vir_ADD(c, + ntq_get_src(c, instr->src[1], 1), + vir_uniform_ui(c, base)); + bool is_uniform_offset = + !vir_in_nonuniform_control_flow(c) && + !nir_src_is_divergent(instr->src[1]); + if (is_uniform_offset) + vir_VPM_WRITE_indirect(c, val, offset); + else + vir_STVPMD(c, offset, val); + } } static void