From 7c009172e300ecdfb387e12629d6199e651a8b8c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Timur=20Krist=C3=B3f?= Date: Thu, 20 Jun 2024 17:23:22 +0200 Subject: [PATCH] ac/nir/esgs: Map linked ES/GS I/O based on GS input mask. MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit With this change, ES/GS linking will not rely on driver locations anymore (driver locations are considered deprecated in NIR). Signed-off-by: Timur Kristóf Reviewed-by: Alyssa Rosenzweig Reviewed-by: Marek Olšák Reviewed-by: Samuel Pitoiset Part-of: --- src/amd/common/ac_nir_lower_esgs_io_to_mem.c | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/src/amd/common/ac_nir_lower_esgs_io_to_mem.c b/src/amd/common/ac_nir_lower_esgs_io_to_mem.c index 63224c671a8..ae94f992dee 100644 --- a/src/amd/common/ac_nir_lower_esgs_io_to_mem.c +++ b/src/amd/common/ac_nir_lower_esgs_io_to_mem.c @@ -160,7 +160,8 @@ lower_es_output_store(nir_builder *b, const unsigned write_mask = nir_intrinsic_write_mask(intrin); b->cursor = nir_before_instr(&intrin->instr); - nir_def *io_off = ac_nir_calc_io_offset(b, intrin, nir_imm_int(b, 16u), 4u, st->map_io); + unsigned mapped = ac_nir_map_io_location(io_sem.location, st->gs_inputs_read, st->map_io); + nir_def *io_off = ac_nir_calc_io_offset_mapped(b, intrin, nir_imm_int(b, 16u), 4u, mapped); nir_def *store_val = intrin->src[0].ssa; if (st->gfx_level <= GFX8) { @@ -289,7 +290,9 @@ gs_per_vertex_input_offset(nir_builder *b, vertex_offset = nir_imul(b, vertex_offset, nir_load_esgs_vertex_stride_amd(b)); unsigned base_stride = st->gfx_level >= GFX9 ? 1 : 64 /* Wave size on GFX6-8 */; - nir_def *io_off = ac_nir_calc_io_offset(b, instr, nir_imm_int(b, base_stride * 4u), base_stride, st->map_io); + const nir_io_semantics io_sem = nir_intrinsic_io_semantics(instr); + unsigned mapped = ac_nir_map_io_location(io_sem.location, st->gs_inputs_read, st->map_io); + nir_def *io_off = ac_nir_calc_io_offset_mapped(b, instr, nir_imm_int(b, base_stride * 4u), base_stride, mapped); nir_def *off = nir_iadd(b, io_off, vertex_offset); return nir_imul_imm(b, off, 4u); }