zink: compute correct location for line-smooth gs
authorErik Faye-Lund <erik.faye-lund@collabora.com>
Fri, 26 May 2023 07:48:56 +0000 (09:48 +0200)
committerMarge Bot <emma+marge@anholt.net>
Tue, 30 May 2023 14:24:25 +0000 (14:24 +0000)
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>

src/gallium/drivers/zink/zink_compiler.c

index ce1f70f..a7c91aa 100644 (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,