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:
edecb66b018 ("nir: avoid generating conflicting output variables")
Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/23316>
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,