Mesa (main): zink: run optimize_nir() only once during compile

GitLab Mirror gitlab-mirror at kemper.freedesktop.org
Wed Oct 27 17:23:38 UTC 2021


Module: Mesa
Branch: main
Commit: 14f7eb9d4c0b2727c7e14027d82f86cf41cecc62
URL:    http://cgit.freedesktop.org/mesa/mesa/commit/?id=14f7eb9d4c0b2727c7e14027d82f86cf41cecc62

Author: Mike Blumenkrantz <michael.blumenkrantz at gmail.com>
Date:   Tue Oct 19 14:39:32 2021 -0400

zink: run optimize_nir() only once during compile

running all the optimizer passes repeatedly is stupid

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

---

 src/gallium/drivers/zink/zink_compiler.c | 21 ++++++++++++++-------
 1 file changed, 14 insertions(+), 7 deletions(-)

diff --git a/src/gallium/drivers/zink/zink_compiler.c b/src/gallium/drivers/zink/zink_compiler.c
index 1715ce2c2d1..5bdfdc9cdae 100644
--- a/src/gallium/drivers/zink/zink_compiler.c
+++ b/src/gallium/drivers/zink/zink_compiler.c
@@ -787,6 +787,8 @@ zink_shader_compile(struct zink_screen *screen, struct zink_shader *zs, nir_shad
    VkShaderModule mod = VK_NULL_HANDLE;
    void *streamout = NULL;
    nir_shader *nir = nir_shader_clone(NULL, base_nir);
+   bool need_optimize = false;
+   bool inlined_uniforms = false;
 
    if (key) {
       if (key->inline_uniforms) {
@@ -795,11 +797,7 @@ zink_shader_compile(struct zink_screen *screen, struct zink_shader *zs, nir_shad
                     key->base.inlined_uniform_values,
                     nir->info.inlinable_uniform_dw_offsets);
 
-         optimize_nir(nir);
-
-         /* This must be done again. */
-         NIR_PASS_V(nir, nir_io_add_const_offset_to_base, nir_var_shader_in |
-                                                          nir_var_shader_out);
+         inlined_uniforms = true;
       }
 
       /* TODO: use a separate mem ctx here for ralloc */
@@ -852,7 +850,7 @@ zink_shader_compile(struct zink_screen *screen, struct zink_shader *zs, nir_shad
             }
             nir_fixup_deref_modes(nir);
             NIR_PASS_V(nir, nir_remove_dead_variables, nir_var_shader_temp, NULL);
-            optimize_nir(nir);
+            need_optimize = true;
          }
          if (zink_fs_key(key)->force_dual_color_blend && nir->info.outputs_written & BITFIELD64_BIT(FRAG_RESULT_DATA1)) {
             NIR_PASS_V(nir, lower_dual_blend);
@@ -868,12 +866,21 @@ zink_shader_compile(struct zink_screen *screen, struct zink_shader *zs, nir_shad
             fbfetch->data.mode = nir_var_shader_temp;
             nir_fixup_deref_modes(nir);
             NIR_PASS_V(nir, nir_remove_dead_variables, nir_var_shader_temp, NULL);
-            optimize_nir(nir);
+            need_optimize = true;
          }
          break;
       default: break;
       }
    }
+   if (inlined_uniforms) {
+      optimize_nir(nir);
+
+      /* This must be done again. */
+      NIR_PASS_V(nir, nir_io_add_const_offset_to_base, nir_var_shader_in |
+                                                       nir_var_shader_out);
+   } else if (need_optimize)
+      optimize_nir(nir);
+
    NIR_PASS_V(nir, nir_convert_from_ssa, true);
 
    struct spirv_shader *spirv = nir_to_spirv(nir, streamout, screen->spirv_version);



More information about the mesa-commit mailing list