glsl/nir_opt_access: Update uniforms correctly when only vars change
authorCaio Marcelo de Oliveira Filho <caio.oliveira@intel.com>
Wed, 19 Jun 2019 18:39:24 +0000 (11:39 -0700)
committerCaio Marcelo de Oliveira Filho <caio.oliveira@intel.com>
Wed, 19 Jun 2019 19:50:41 +0000 (12:50 -0700)
Even if only variables access flags are changed, the existing NIR
infrastructure expects metadata to be explicitly preserved, so do
that.  Don't care about avoiding preserve to be called twice since the
cost is negligible.

This scenario can be triggered by dead variables, and also by other
intrinsics that read the variables -- but not cause progress to be
made when processing the intrinsics.

Fixes: f2d0e48ddc7 "glsl/nir: Add optimization pass for access flags"
Reviewed-by: Kenneth Graunke <kenneth@whitecape.org>
src/compiler/glsl/gl_nir_opt_access.c

index 7f8672faf131225125eea2295a1b65d42c8a113b..760214fbbff310adbd1c1d6e656326031b082d82 100644 (file)
@@ -293,6 +293,7 @@ gl_nir_opt_access(nir_shader *shader)
       .vars_written = _mesa_pointer_set_create(NULL),
    };
 
+   bool var_progress = false;
    bool progress = false;
 
    nir_foreach_function(func, shader) {
@@ -307,14 +308,25 @@ gl_nir_opt_access(nir_shader *shader)
    }
 
    nir_foreach_variable(var, &shader->uniforms)
-      progress |= process_variable(&state, var);
+      var_progress |= process_variable(&state, var);
 
    nir_foreach_function(func, shader) {
       if (func->impl) {
          progress |= opt_access_impl(&state, func->impl);
+
+         /* If we make a change to the uniforms, update all the impls. */
+         if (var_progress) {
+            nir_metadata_preserve(func->impl,
+                                  nir_metadata_block_index |
+                                  nir_metadata_dominance |
+                                  nir_metadata_live_ssa_defs |
+                                  nir_metadata_loop_analysis);
+         }
       }
    }
 
+   progress |= var_progress;
+
    _mesa_set_destroy(state.vars_written, NULL);
    return progress;
 }