Mesa (master): st/mesa: enable state var merging to improve fetch_state performance

GitLab Mirror gitlab-mirror at kemper.freedesktop.org
Thu Jan 21 22:16:31 UTC 2021


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

Author: Marek Olšák <marek.olsak at amd.com>
Date:   Sun Nov 22 23:30:57 2020 -0500

st/mesa: enable state var merging to improve fetch_state performance

The requirement is that drivers must implement finalize_nir for
st_finalize_nir to be invoked at link time and before shader variant
generation. Without that, _mesa_optimize_state_parameters won't be called.

Reviewed-by: Zoltán Böszörményi <zboszor at gmail.com>
Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/8183>

---

 src/mesa/state_tracker/st_glsl_to_nir.cpp | 14 ++++++++++++--
 src/mesa/state_tracker/st_nir.h           |  3 ++-
 src/mesa/state_tracker/st_program.c       |  8 ++++----
 3 files changed, 18 insertions(+), 7 deletions(-)

diff --git a/src/mesa/state_tracker/st_glsl_to_nir.cpp b/src/mesa/state_tracker/st_glsl_to_nir.cpp
index ee31428a3d3..4626f5de96f 100644
--- a/src/mesa/state_tracker/st_glsl_to_nir.cpp
+++ b/src/mesa/state_tracker/st_glsl_to_nir.cpp
@@ -565,7 +565,7 @@ st_glsl_to_nir_post_opts(struct st_context *st, struct gl_program *prog,
    st_finalize_nir_before_variants(nir);
 
    if (st->allow_st_finalize_nir_twice)
-      st_finalize_nir(st, prog, shader_program, nir, true);
+      st_finalize_nir(st, prog, shader_program, nir, true, true);
 
    if (st->ctx->_Shader->Flags & GLSL_DUMP) {
       _mesa_log("\n");
@@ -1018,7 +1018,8 @@ st_nir_lower_uniforms(struct st_context *st, nir_shader *nir)
 void
 st_finalize_nir(struct st_context *st, struct gl_program *prog,
                 struct gl_shader_program *shader_program,
-                nir_shader *nir, bool finalize_by_driver)
+                nir_shader *nir, bool finalize_by_driver,
+                bool is_before_variants)
 {
    struct pipe_screen *screen = st->screen;
 
@@ -1032,6 +1033,15 @@ st_finalize_nir(struct st_context *st, struct gl_program *prog,
    nir->num_uniforms = DIV_ROUND_UP(prog->Parameters->NumParameterValues, 4);
 
    st_nir_lower_uniforms(st, nir);
+
+   if (is_before_variants && nir->options->lower_uniforms_to_ubo) {
+      /* This must be done after uniforms are lowered to UBO and all
+       * nir_var_uniform variables are removed from NIR to prevent conflicts
+       * between state parameter merging and shader variant generation.
+       */
+      _mesa_optimize_state_parameters(&st->ctx->Const, prog->Parameters);
+   }
+
    st_nir_lower_samplers(screen, nir, shader_program, prog);
    if (!screen->get_param(screen, PIPE_CAP_NIR_IMAGES_AS_DEREF))
       NIR_PASS_V(nir, gl_nir_lower_images, false);
diff --git a/src/mesa/state_tracker/st_nir.h b/src/mesa/state_tracker/st_nir.h
index cb07c6632c5..a8e879a9d35 100644
--- a/src/mesa/state_tracker/st_nir.h
+++ b/src/mesa/state_tracker/st_nir.h
@@ -43,7 +43,8 @@ void st_nir_lower_wpos_ytransform(struct nir_shader *nir,
 
 void st_finalize_nir(struct st_context *st, struct gl_program *prog,
                      struct gl_shader_program *shader_program,
-                     struct nir_shader *nir, bool finalize_by_driver);
+                     struct nir_shader *nir, bool finalize_by_driver,
+                     bool is_before_variants);
 
 void st_nir_opts(struct nir_shader *nir);
 
diff --git a/src/mesa/state_tracker/st_program.c b/src/mesa/state_tracker/st_program.c
index 2a8cf247378..c8c812a6fe9 100644
--- a/src/mesa/state_tracker/st_program.c
+++ b/src/mesa/state_tracker/st_program.c
@@ -391,7 +391,7 @@ st_prog_to_nir_postprocess(struct st_context *st, nir_shader *nir,
    st_finalize_nir_before_variants(nir);
 
    if (st->allow_st_finalize_nir_twice)
-      st_finalize_nir(st, prog, NULL, nir, true);
+      st_finalize_nir(st, prog, NULL, nir, true, true);
 
    nir_validate_shader(nir, "after st/glsl finalize_nir");
 }
@@ -785,7 +785,7 @@ st_create_vp_variant(struct st_context *st,
 
       if (finalize || !st->allow_st_finalize_nir_twice) {
          st_finalize_nir(st, &stvp->Base, stvp->shader_program, state.ir.nir,
-                         true);
+                         true, false);
 
          /* Some of the lowering above may have introduced new varyings */
          nir_shader_gather_info(state.ir.nir,
@@ -1360,7 +1360,7 @@ st_create_fp_variant(struct st_context *st,
 
       if (finalize || !st->allow_st_finalize_nir_twice) {
          st_finalize_nir(st, &stfp->Base, stfp->shader_program, state.ir.nir,
-                         false);
+                         false, false);
       }
 
       /* This pass needs to happen *after* nir_lower_sampler */
@@ -1761,7 +1761,7 @@ st_get_common_variant(struct st_context *st,
 
             if (finalize || !st->allow_st_finalize_nir_twice) {
                st_finalize_nir(st, &prog->Base, prog->shader_program,
-                               state.ir.nir, true);
+                               state.ir.nir, true, false);
             }
 
             if (ST_DEBUG & DEBUG_PRINT_IR)



More information about the mesa-commit mailing list