Mesa (main): nir-to-tgsi: Avoid emitting TXL just for lod 0 on non-vertex shaders.

GitLab Mirror gitlab-mirror at kemper.freedesktop.org
Wed Oct 6 04:34:01 UTC 2021


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

Author: Emma Anholt <emma at anholt.net>
Date:   Thu Jul 29 14:59:11 2021 -0700

nir-to-tgsi: Avoid emitting TXL just for lod 0 on non-vertex shaders.

Prompted by comparing virgl fails and finding that it has issues with
immediate args to TXL/TXB, at least.

Acked-by: Gert Wollny <gert.wollny at collabora.com>
Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/12800>

---

 src/compiler/nir/nir.c                  | 11 +++++++++++
 src/compiler/nir/nir.h                  |  3 +++
 src/compiler/nir/nir_lower_tex.c        |  7 +------
 src/gallium/auxiliary/nir/nir_to_tgsi.c | 14 ++++++++++++++
 4 files changed, 29 insertions(+), 6 deletions(-)

diff --git a/src/compiler/nir/nir.c b/src/compiler/nir/nir.c
index c441af3e5d1..404dcd014cd 100644
--- a/src/compiler/nir/nir.c
+++ b/src/compiler/nir/nir.c
@@ -2236,6 +2236,17 @@ nir_shader_lower_instructions(nir_shader *shader,
    return progress;
 }
 
+/**
+ * Returns true if the shader supports quad-based implicit derivatives on
+ * texture sampling.
+ */
+bool nir_shader_supports_implicit_lod(nir_shader *shader)
+{
+   return (shader->info.stage == MESA_SHADER_FRAGMENT ||
+           (shader->info.stage == MESA_SHADER_COMPUTE &&
+            shader->info.cs.derivative_group != DERIVATIVE_GROUP_NONE));
+}
+
 nir_intrinsic_op
 nir_intrinsic_from_system_value(gl_system_value val)
 {
diff --git a/src/compiler/nir/nir.h b/src/compiler/nir/nir.h
index 36e0feda00f..a3f2ed6c1b6 100644
--- a/src/compiler/nir/nir.h
+++ b/src/compiler/nir/nir.h
@@ -5443,9 +5443,12 @@ bool nir_shader_uses_view_index(nir_shader *shader);
 bool nir_can_lower_multiview(nir_shader *shader);
 bool nir_lower_multiview(nir_shader *shader, uint32_t view_mask);
 
+
 bool nir_lower_fp16_casts(nir_shader *shader);
 bool nir_normalize_cubemap_coords(nir_shader *shader);
 
+bool nir_shader_supports_implicit_lod(nir_shader *shader);
+
 void nir_live_ssa_defs_impl(nir_function_impl *impl);
 
 const BITSET_WORD *nir_get_live_ssa_defs(nir_cursor cursor, void *mem_ctx);
diff --git a/src/compiler/nir/nir_lower_tex.c b/src/compiler/nir/nir_lower_tex.c
index 67b7712ddcb..b19f671623b 100644
--- a/src/compiler/nir/nir_lower_tex.c
+++ b/src/compiler/nir/nir_lower_tex.c
@@ -1373,13 +1373,8 @@ nir_lower_tex_block(nir_block *block, nir_builder *b,
        * derivatives.  Lower those opcodes which use implicit derivatives to
        * use an explicit LOD of 0.
        */
-      bool shader_supports_implicit_lod =
-         b->shader->info.stage == MESA_SHADER_FRAGMENT ||
-         (b->shader->info.stage == MESA_SHADER_COMPUTE &&
-          b->shader->info.cs.derivative_group != DERIVATIVE_GROUP_NONE);
-
       if (nir_tex_instr_has_implicit_derivative(tex) &&
-          !shader_supports_implicit_lod) {
+          !nir_shader_supports_implicit_lod(b->shader)) {
          lower_zero_lod(b, tex);
          progress = true;
       }
diff --git a/src/gallium/auxiliary/nir/nir_to_tgsi.c b/src/gallium/auxiliary/nir/nir_to_tgsi.c
index 64895748773..25b4e312eaa 100644
--- a/src/gallium/auxiliary/nir/nir_to_tgsi.c
+++ b/src/gallium/auxiliary/nir/nir_to_tgsi.c
@@ -2776,6 +2776,20 @@ nir_to_tgsi_lower_tex_instr(nir_builder *b, nir_instr *instr, void *data)
    if (nir_tex_instr_src_index(tex, nir_tex_src_coord) < 0)
       return false;
 
+   /* NIR after lower_tex will have LOD set to 0 for tex ops that wanted
+    * implicit lod in shader stages that don't have quad-based derivatives.
+    * TGSI doesn't want that, it requires that the backend do implict LOD 0 for
+    * those stages.
+    */
+   if (!nir_shader_supports_implicit_lod(b->shader) && tex->op == nir_texop_txl) {
+      int lod_index = nir_tex_instr_src_index(tex, nir_tex_src_lod);
+      nir_src *lod_src = &tex->src[lod_index].src;
+      if (nir_src_is_const(*lod_src) && nir_src_as_uint(*lod_src) == 0) {
+         nir_tex_instr_remove_src(tex, lod_index);
+         tex->op = nir_texop_tex;
+      }
+   }
+
    b->cursor = nir_before_instr(instr);
 
    struct ntt_lower_tex_state s = {0};



More information about the mesa-commit mailing list