zink: compute correct location for line-smooth gs

The GS and the FS needs to agree on the driver_location. But we just
used the num_outputs variable for the GS instead of matching the logic
from lower_aaline_instr in nir_draw_helpers.c.

This does that, but cleans up our copy slightly to avoid computing the
needless location, as well as using unsigned values.

This used to *mostly* work before, but only because we were lucky and
not too much crazy stuff went on with the inputs / outputs in
smooth-line cases.

Fixes: edecb66b01 ("nir: avoid generating conflicting output variables")
Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/23316>
This commit is contained in:
Erik Faye-Lund 2023-05-26 09:48:56 +02:00 committed by Marge Bot
parent 955a6ffa6e
commit ffc77d5262

View file

@ -1097,13 +1097,20 @@ lower_line_smooth_gs(nir_shader *shader)
if (!state.pos_out)
return false;
unsigned location = 0;
nir_foreach_shader_in_variable(var, shader) {
if (var->data.driver_location >= location)
location = var->data.driver_location + 1;
}
state.line_coord_out =
nir_variable_create(shader, nir_var_shader_out, glsl_vec4_type(),
"__line_coord");
state.line_coord_out->data.interpolation = INTERP_MODE_NOPERSPECTIVE;
state.line_coord_out->data.driver_location = shader->num_outputs++;
state.line_coord_out->data.driver_location = location;
state.line_coord_out->data.location = MAX2(util_last_bit64(shader->info.outputs_written), VARYING_SLOT_VAR0);
shader->info.outputs_written |= BITFIELD64_BIT(state.line_coord_out->data.location);
shader->num_outputs++;
// create temp variables
state.prev_pos = nir_variable_create(shader, nir_var_shader_temp,