Mesa (master): zink: add a pipe_screen::finalize_nir hook

GitLab Mirror gitlab-mirror at kemper.freedesktop.org
Thu Apr 8 03:14:12 UTC 2021


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

Author: Mike Blumenkrantz <michael.blumenkrantz at gmail.com>
Date:   Tue Dec 29 11:32:18 2020 -0500

zink: add a pipe_screen::finalize_nir hook

moves some of the always-run passes into the base nir

Reviewed-by: Dave Airlie <airlied at redhat.com>
Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/9888>

---

 src/gallium/drivers/zink/zink_compiler.c | 31 ++++++++++++++++++++-----------
 src/gallium/drivers/zink/zink_compiler.h |  3 +++
 src/gallium/drivers/zink/zink_screen.c   |  1 +
 3 files changed, 24 insertions(+), 11 deletions(-)

diff --git a/src/gallium/drivers/zink/zink_compiler.c b/src/gallium/drivers/zink/zink_compiler.c
index 63b05138402..ed11e0031f3 100644
--- a/src/gallium/drivers/zink/zink_compiler.c
+++ b/src/gallium/drivers/zink/zink_compiler.c
@@ -794,12 +794,6 @@ zink_shader_create(struct zink_screen *screen, struct nir_shader *nir,
    ret->shader_id = p_atomic_inc_return(&screen->shader_id);
    ret->programs = _mesa_pointer_set_create(NULL);
 
-   if (!screen->info.feats.features.shaderImageGatherExtended) {
-      nir_lower_tex_options tex_opts = {};
-      tex_opts.lower_tg4_offsets = true;
-      NIR_PASS_V(nir, nir_lower_tex, &tex_opts);
-   }
-
    if (nir->info.stage == MESA_SHADER_VERTEX)
       create_vs_pushconst(nir);
    else if (nir->info.stage == MESA_SHADER_TESS_CTRL ||
@@ -809,11 +803,8 @@ zink_shader_create(struct zink_screen *screen, struct nir_shader *nir,
    } else if (nir->info.stage == MESA_SHADER_KERNEL)
       create_cs_pushconst(nir);
 
-   NIR_PASS_V(nir, nir_lower_uniforms_to_ubo, 16);
    if (nir->info.stage < MESA_SHADER_FRAGMENT)
       have_psiz = check_psiz(nir);
-   if (nir->info.stage == MESA_SHADER_GEOMETRY)
-      NIR_PASS_V(nir, nir_lower_gs_intrinsics, nir_lower_gs_intrinsics_per_stream);
    NIR_PASS_V(nir, lower_basevertex);
    NIR_PASS_V(nir, lower_work_dim);
    NIR_PASS_V(nir, nir_lower_regs_to_ssa);
@@ -823,8 +814,6 @@ zink_shader_create(struct zink_screen *screen, struct nir_shader *nir,
    NIR_PASS_V(nir, lower_discard_if);
    NIR_PASS_V(nir, nir_lower_fragcolor);
    NIR_PASS_V(nir, lower_64bit_vertex_attribs);
-   if (nir->info.num_ubos || nir->info.num_ssbos)
-      NIR_PASS_V(nir, nir_lower_dynamic_bo_access);
    NIR_PASS_V(nir, unbreak_bos);
 
    if (zink_debug & ZINK_DEBUG_NIR) {
@@ -896,6 +885,26 @@ zink_shader_create(struct zink_screen *screen, struct nir_shader *nir,
    return ret;
 }
 
+void
+zink_shader_finalize(struct pipe_screen *pscreen, void *nirptr, bool optimize)
+{
+   struct zink_screen *screen = zink_screen(pscreen);
+   nir_shader *nir = nirptr;
+
+   if (!screen->info.feats.features.shaderImageGatherExtended) {
+      nir_lower_tex_options tex_opts = {};
+      tex_opts.lower_tg4_offsets = true;
+      NIR_PASS_V(nir, nir_lower_tex, &tex_opts);
+   }
+   NIR_PASS_V(nir, nir_lower_uniforms_to_ubo, 16);
+   if (nir->info.stage == MESA_SHADER_GEOMETRY)
+      NIR_PASS_V(nir, nir_lower_gs_intrinsics, nir_lower_gs_intrinsics_per_stream);
+   optimize_nir(nir);
+   if (nir->info.num_ubos || nir->info.num_ssbos)
+      NIR_PASS_V(nir, nir_lower_dynamic_bo_access);
+   nir_shader_gather_info(nir, nir_shader_get_entrypoint(nir));
+}
+
 void
 zink_shader_free(struct zink_context *ctx, struct zink_shader *shader)
 {
diff --git a/src/gallium/drivers/zink/zink_compiler.h b/src/gallium/drivers/zink/zink_compiler.h
index 75aa5f6cb49..c73646a9e0b 100644
--- a/src/gallium/drivers/zink/zink_compiler.h
+++ b/src/gallium/drivers/zink/zink_compiler.h
@@ -98,6 +98,9 @@ struct zink_shader *
 zink_shader_create(struct zink_screen *screen, struct nir_shader *nir,
                  const struct pipe_stream_output_info *so_info);
 
+void
+zink_shader_finalize(struct pipe_screen *pscreen, void *nirptr, bool optimize);
+
 void
 zink_shader_free(struct zink_context *ctx, struct zink_shader *shader);
 
diff --git a/src/gallium/drivers/zink/zink_screen.c b/src/gallium/drivers/zink/zink_screen.c
index 8fe325c57ab..70c14b0f3de 100644
--- a/src/gallium/drivers/zink/zink_screen.c
+++ b/src/gallium/drivers/zink/zink_screen.c
@@ -1463,6 +1463,7 @@ zink_internal_create_screen(const struct pipe_screen_config *config)
    screen->base.context_create = zink_context_create;
    screen->base.flush_frontbuffer = zink_flush_frontbuffer;
    screen->base.destroy = zink_destroy_screen;
+   screen->base.finalize_nir = zink_shader_finalize;
 
    if (!zink_screen_resource_init(&screen->base))
       goto fail;



More information about the mesa-commit mailing list