From 8a24610477f3b23a0dc0fb423bbc67ee92a0353f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Timur=20Krist=C3=B3f?= Date: Fri, 29 Mar 2024 01:20:05 +0100 Subject: [PATCH] nir/recompute_io_bases: Sort per-primitive PS inputs last. MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Some hardware requires that per-primitive FS inputs are sorted last, and nir_assign_io_var_locations can already take care of this. Add the same consideration to nir_recompute_io_bases. Signed-off-by: Timur Kristóf Reviewed-by: Marek Olšák Part-of: --- src/compiler/nir/nir_lower_mediump.c | 26 ++++++++++++++++++++------ 1 file changed, 20 insertions(+), 6 deletions(-) diff --git a/src/compiler/nir/nir_lower_mediump.c b/src/compiler/nir/nir_lower_mediump.c index ff4f5171618c4..609e5a7a701e6 100644 --- a/src/compiler/nir/nir_lower_mediump.c +++ b/src/compiler/nir/nir_lower_mediump.c @@ -67,9 +67,11 @@ nir_recompute_io_bases(nir_shader *nir, nir_variable_mode modes) nir_function_impl *impl = nir_shader_get_entrypoint(nir); BITSET_DECLARE(inputs, NUM_TOTAL_VARYING_SLOTS); - BITSET_DECLARE(dual_slot_inputs, NUM_TOTAL_VARYING_SLOTS); + BITSET_DECLARE(per_prim_inputs, NUM_TOTAL_VARYING_SLOTS); /* FS only */ + BITSET_DECLARE(dual_slot_inputs, NUM_TOTAL_VARYING_SLOTS); /* VS only */ BITSET_DECLARE(outputs, NUM_TOTAL_VARYING_SLOTS); BITSET_ZERO(inputs); + BITSET_ZERO(per_prim_inputs); BITSET_ZERO(dual_slot_inputs); BITSET_ZERO(outputs); @@ -88,7 +90,11 @@ nir_recompute_io_bases(nir_shader *nir, nir_variable_mode modes) if (mode == nir_var_shader_in) { for (unsigned i = 0; i < num_slots; i++) { - BITSET_SET(inputs, sem.location + i); + if (sem.per_primitive) + BITSET_SET(per_prim_inputs, sem.location + i); + else + BITSET_SET(inputs, sem.location + i); + if (sem.high_dvec2) BITSET_SET(dual_slot_inputs, sem.location + i); } @@ -99,6 +105,8 @@ nir_recompute_io_bases(nir_shader *nir, nir_variable_mode modes) } } + const unsigned num_normal_inputs = BITSET_COUNT(inputs) + BITSET_COUNT(dual_slot_inputs); + /* Renumber bases. */ bool changed = false; @@ -115,10 +123,16 @@ nir_recompute_io_bases(nir_shader *nir, nir_variable_mode modes) num_slots = (num_slots + sem.high_16bits + 1) / 2; if (mode == nir_var_shader_in) { - nir_intrinsic_set_base(intr, - BITSET_PREFIX_SUM(inputs, sem.location) + - BITSET_PREFIX_SUM(dual_slot_inputs, sem.location) + - (sem.high_dvec2 ? 1 : 0)); + if (nir->info.per_primitive_inputs & BITFIELD64_BIT(sem.location)) { + nir_intrinsic_set_base(intr, + num_normal_inputs + + BITSET_PREFIX_SUM(per_prim_inputs, sem.location)); + } else { + nir_intrinsic_set_base(intr, + BITSET_PREFIX_SUM(inputs, sem.location) + + BITSET_PREFIX_SUM(dual_slot_inputs, sem.location) + + (sem.high_dvec2 ? 1 : 0)); + } } else if (sem.dual_source_blend_index) { nir_intrinsic_set_base(intr, BITSET_PREFIX_SUM(outputs, NUM_TOTAL_VARYING_SLOTS));