Mesa (master): mesa/st: ignore texture_index if tex_instr has deref src

GitLab Mirror gitlab-mirror at kemper.freedesktop.org
Mon Apr 5 08:41:34 UTC 2021


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

Author: Pierre-Eric Pelloux-Prayer <pierre-eric.pelloux-prayer at amd.com>
Date:   Tue Mar 30 21:50:04 2021 +0200

mesa/st: ignore texture_index if tex_instr has deref src

texture_index is meaningless when a tex_instr has deref src.
Use var->data.binding instead.

CC: mesa-stable
Reviewed-by: Jesse Natalie <jenatali at microsoft.com>
Acked-by: Marek Olšák <marek.olsak at amd.com>
Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/9931>

---

 src/mesa/state_tracker/st_nir_lower_tex_src_plane.c | 19 ++++++++++++-------
 1 file changed, 12 insertions(+), 7 deletions(-)

diff --git a/src/mesa/state_tracker/st_nir_lower_tex_src_plane.c b/src/mesa/state_tracker/st_nir_lower_tex_src_plane.c
index edd80fb5201..8daf19bdcf5 100644
--- a/src/mesa/state_tracker/st_nir_lower_tex_src_plane.c
+++ b/src/mesa/state_tracker/st_nir_lower_tex_src_plane.c
@@ -121,25 +121,26 @@ lower_tex_src_plane_block(nir_builder *b, lower_tex_src_state *state, nir_block
 
       if (plane[0].i32 > 0) {
          unsigned y_samp = tex->texture_index;
+         int tex_index = nir_tex_instr_src_index(tex, nir_tex_src_texture_deref);
+         if (tex_index >= 0) {
+            nir_deref_instr *deref = nir_src_as_deref(tex->src[tex_index].src);
+            y_samp = nir_deref_instr_get_variable(deref)->data.binding;
+         }
 
-         assume(tex->texture_index == tex->sampler_index);
          assume(((state->lower_3plane & (1 << y_samp)) && plane[0].i32 < 3) ||
                (plane[0].i32 < 2));
 
-         tex->texture_index = tex->sampler_index =
-               state->sampler_map[y_samp][plane[0].i32 - 1];
-
-         BITSET_SET(state->shader->info.textures_used, tex->texture_index);
+         unsigned u_v_samp = state->sampler_map[y_samp][plane[0].i32 - 1];
+         BITSET_SET(state->shader->info.textures_used, u_v_samp);
 
          /* For drivers using PIPE_CAP_NIR_SAMPLERS_AS_DEREF, we need
           * to reference the correct sampler nir variable.
           */
-         int tex_index = nir_tex_instr_src_index(tex, nir_tex_src_texture_deref);
          int samp_index = nir_tex_instr_src_index(tex, nir_tex_src_sampler_deref);
          if (tex_index >= 0 && samp_index >= 0) {
             b->cursor = nir_before_instr(&tex->instr);
 
-            nir_variable* samp = find_sampler(state, tex->sampler_index);
+            nir_variable* samp = find_sampler(state, u_v_samp);
             assert(samp);
 
             nir_deref_instr *tex_deref_instr = nir_build_deref_var(b, samp);
@@ -151,6 +152,10 @@ lower_tex_src_plane_block(nir_builder *b, lower_tex_src_state *state, nir_block
             nir_instr_rewrite_src(&tex->instr,
                                   &tex->src[samp_index].src,
                                   nir_src_for_ssa(tex_deref));
+         } else {
+            /* For others we need to update texture_index */
+            assume(tex->texture_index == tex->sampler_index);
+            tex->texture_index = tex->sampler_index = u_v_samp;
          }
       }
 



More information about the mesa-commit mailing list