Mesa (master): glsl/nir_opt_access: Update uniforms correctly when only vars change

GitLab Mirror gitlab-mirror at kemper.freedesktop.org
Wed Jun 19 19:52:09 UTC 2019


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

Author: Caio Marcelo de Oliveira Filho <caio.oliveira at intel.com>
Date:   Wed Jun 19 11:39:24 2019 -0700

glsl/nir_opt_access: Update uniforms correctly when only vars change

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 at whitecape.org>

---

 src/compiler/glsl/gl_nir_opt_access.c | 14 +++++++++++++-
 1 file changed, 13 insertions(+), 1 deletion(-)

diff --git a/src/compiler/glsl/gl_nir_opt_access.c b/src/compiler/glsl/gl_nir_opt_access.c
index 7f8672faf13..760214fbbff 100644
--- a/src/compiler/glsl/gl_nir_opt_access.c
+++ b/src/compiler/glsl/gl_nir_opt_access.c
@@ -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;
 }




More information about the mesa-commit mailing list