aboutsummaryrefslogtreecommitdiffstats
path: root/src/gallium/drivers
diff options
context:
space:
mode:
authorKenneth Graunke <[email protected]>2019-11-14 10:10:27 -0800
committerKenneth Graunke <[email protected]>2019-11-14 14:50:09 -0800
commit39c23fd1bbdac2015cb3a15f3baab9ea95b94031 (patch)
tree634df0a099a29de7e0d80ef1bed500e296619f60 /src/gallium/drivers
parent790d0ebef3be3e0e9a09621572b1a2a30a0859fb (diff)
iris: Properly move edgeflag_out from output list to global list
When demoting it from an output to a global, we need to actually move it to the correct list. While here, we also refactor so it's clear we aren't mutating the list while iterating. Closes: https://gitlab.freedesktop.org/mesa/mesa/issues/2106 Fixes: f9fd04aca15 ("nir: Fix non-determinism in lower_global_vars_to_local") Reviewed-by: Jason Ekstrand <[email protected]>
Diffstat (limited to 'src/gallium/drivers')
-rw-r--r--src/gallium/drivers/iris/iris_program.c24
1 files changed, 16 insertions, 8 deletions
diff --git a/src/gallium/drivers/iris/iris_program.c b/src/gallium/drivers/iris/iris_program.c
index 505ededbb59..04f28a7dd8e 100644
--- a/src/gallium/drivers/iris/iris_program.c
+++ b/src/gallium/drivers/iris/iris_program.c
@@ -194,17 +194,25 @@ iris_fix_edge_flags(nir_shader *nir)
if (nir->info.stage != MESA_SHADER_VERTEX)
return false;
- nir_foreach_variable(var, &nir->outputs) {
- if (var->data.location == VARYING_SLOT_EDGE) {
- var->data.mode = nir_var_shader_temp;
- nir->info.outputs_written &= ~VARYING_BIT_EDGE;
- nir->info.inputs_read &= ~VERT_BIT_EDGEFLAG;
- nir_fixup_deref_modes(nir);
- return true;
+ nir_variable *var = NULL;
+ nir_foreach_variable(v, &nir->outputs) {
+ if (v->data.location == VARYING_SLOT_EDGE) {
+ var = v;
+ break;
}
}
- return false;
+ if (!var)
+ return false;
+
+ exec_node_remove(&var->node);
+ var->data.mode = nir_var_shader_temp;
+ exec_list_push_tail(&nir->globals, &var->node);
+ nir->info.outputs_written &= ~VARYING_BIT_EDGE;
+ nir->info.inputs_read &= ~VERT_BIT_EDGEFLAG;
+ nir_fixup_deref_modes(nir);
+
+ return true;
}
/**