Mesa (master): iris: Properly move edgeflag_out from output list to global list

GitLab Mirror gitlab-mirror at kemper.freedesktop.org
Thu Nov 14 22:50:56 UTC 2019


Module: Mesa
Branch: master
Commit: 39c23fd1bbdac2015cb3a15f3baab9ea95b94031
URL:    http://cgit.freedesktop.org/mesa/mesa/commit/?id=39c23fd1bbdac2015cb3a15f3baab9ea95b94031

Author: Kenneth Graunke <kenneth at whitecape.org>
Date:   Thu Nov 14 10:10:27 2019 -0800

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 <jason at jlekstrand.net>

---

 src/gallium/drivers/iris/iris_program.c | 24 ++++++++++++++++--------
 1 file 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;
 }
 
 /**




More information about the mesa-commit mailing list