Module: Mesa Branch: main Commit: 9401990e6f7a4b024b3a62055339f71477b508d0 URL: http://cgit.freedesktop.org/mesa/mesa/commit/?id=9401990e6f7a4b024b3a62055339f71477b508d0
Author: Qiang Yu <[email protected]> Date: Fri Mar 11 18:14:57 2022 +0800 nir/linker: set varying from uniform as flat Flat varying can save some rasterization compute cost and register needed by shader. Acked-by: Pierre-Eric Pelloux-Prayer <[email protected]> Reviewed-by: Marek Olšák <[email protected]> Signed-off-by: Qiang Yu <[email protected]> Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/15341> --- src/compiler/nir/nir_linking_helpers.c | 41 +++++++++++++++++++++------------- 1 file changed, 26 insertions(+), 15 deletions(-) diff --git a/src/compiler/nir/nir_linking_helpers.c b/src/compiler/nir/nir_linking_helpers.c index c7acb73793d..8f31dd4055c 100644 --- a/src/compiler/nir/nir_linking_helpers.c +++ b/src/compiler/nir/nir_linking_helpers.c @@ -1373,26 +1373,37 @@ nir_link_opt_varyings(nir_shader *producer, nir_shader *consumer) if (!can_replace_varying(out_var)) continue; - nir_ssa_scalar uni_scalar; nir_ssa_def *ssa = intr->src[1].ssa; if (ssa->parent_instr->type == nir_instr_type_load_const) { progress |= replace_varying_input_by_constant_load(consumer, intr); - } else if (consumer->options->lower_varying_from_uniform && - is_direct_uniform_load(ssa, &uni_scalar)) { - progress |= replace_varying_input_by_uniform_load(consumer, intr, - &uni_scalar); - } else { - struct hash_entry *entry = - _mesa_hash_table_search(varying_values, ssa); - if (entry) { - progress |= replace_duplicate_input(consumer, - (nir_variable *) entry->data, - intr); + continue; + } + + nir_ssa_scalar uni_scalar; + if (is_direct_uniform_load(ssa, &uni_scalar)) { + if (consumer->options->lower_varying_from_uniform) { + progress |= replace_varying_input_by_uniform_load(consumer, intr, + &uni_scalar); + continue; } else { nir_variable *in_var = get_matching_input_var(consumer, out_var); - if (in_var) { - _mesa_hash_table_insert(varying_values, ssa, in_var); - } + /* The varying is loaded from same uniform, so no need to do any + * interpolation. Mark it as flat explicitly. + */ + if (in_var && in_var->data.interpolation <= INTERP_MODE_NOPERSPECTIVE) + in_var->data.interpolation = INTERP_MODE_FLAT; + } + } + + struct hash_entry *entry = _mesa_hash_table_search(varying_values, ssa); + if (entry) { + progress |= replace_duplicate_input(consumer, + (nir_variable *) entry->data, + intr); + } else { + nir_variable *in_var = get_matching_input_var(consumer, out_var); + if (in_var) { + _mesa_hash_table_insert(varying_values, ssa, in_var); } } }
