nir/linking_helpers: don't promote interpolated varyings to flat

Even the most flexible interpolation that we have in NIR options
(nir_io_has_flexible_input_interpolation_except_flat) doesn't allow
mixing flat and non-flat in the same vec4. This (legacy) optimization
can't promote interpolated inputs to flat if it doesn't consider
the interpolation mode of the whole vec4 slot.

Reviewed-by: Alyssa Rosenzweig <alyssa@rosenzweig.io>
Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/32424>
This commit is contained in:
Marek Olšák 2024-11-30 00:51:49 -05:00 committed by Marge Bot
parent 16f7d22394
commit a618a2aa8b

View file

@ -1409,22 +1409,11 @@ nir_link_opt_varyings(nir_shader *producer, nir_shader *consumer)
}
nir_scalar uni_scalar;
if (is_direct_uniform_load(ssa, &uni_scalar)) {
if (consumer->options->max_varying_expression_cost >= 2) {
progress |= replace_varying_input_by_uniform_load(consumer, intr,
&uni_scalar);
continue;
} else {
nir_variable *in_var = get_matching_input_var(consumer, out_var);
/* The varying is loaded from same uniform, so no need to do any
* interpolation. Mark it as flat explicitly.
*/
if (!consumer->options->no_integers &&
in_var && in_var->data.interpolation <= INTERP_MODE_NOPERSPECTIVE) {
in_var->data.interpolation = INTERP_MODE_FLAT;
out_var->data.interpolation = INTERP_MODE_FLAT;
}
}
if (consumer->options->max_varying_expression_cost >= 2 &&
is_direct_uniform_load(ssa, &uni_scalar)) {
progress |= replace_varying_input_by_uniform_load(consumer, intr,
&uni_scalar);
continue;
}
struct hash_entry *entry = _mesa_hash_table_search(varying_values, ssa);