From e4ef5f043315e9f06bfb082b867dc08efe310d55 Mon Sep 17 00:00:00 2001 From: Pierre-Eric Pelloux-Prayer Date: Tue, 30 Mar 2021 21:50:04 +0200 Subject: [PATCH] mesa/st: ignore texture_index if tex_instr has deref src MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit texture_index is meaningless when a tex_instr has deref src. Use var->data.binding instead. CC: mesa-stable Reviewed-by: Jesse Natalie Acked-by: Marek Olšák Part-of: --- .../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; } }