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