From f1d8a65d7ff017203065b2cf50f9fd6cdba3026e Mon Sep 17 00:00:00 2001 From: Boris Brezillon Date: Fri, 29 Mar 2024 12:16:02 +0100 Subject: [PATCH] pan/bi: Extend bi_emit_texc() to support wider direct tex/sampler idx The current code was doing some assumptions on the maximum texture/sampler sizes which no longer stand with panvk. Add explicit range checks on the direct texture/sampler_index. Signed-off-by: Boris Brezillon Reviewed-by: Mary Guillemard Part-of: --- src/panfrost/compiler/bifrost_compile.c | 34 ++++++++++++++++++++----- 1 file changed, 27 insertions(+), 7 deletions(-) diff --git a/src/panfrost/compiler/bifrost_compile.c b/src/panfrost/compiler/bifrost_compile.c index 558caf362af..30d3d880832 100644 --- a/src/panfrost/compiler/bifrost_compile.c +++ b/src/panfrost/compiler/bifrost_compile.c @@ -3460,7 +3460,8 @@ bi_emit_texc(bi_builder *b, nir_tex_instr *instr) bool direct_samp = bi_is_null(dregs[BIFROST_TEX_DREG_SAMPLER]); bool direct = direct_tex && direct_samp; - desc.immediate_indices = direct && (instr->sampler_index < 16); + desc.immediate_indices = + direct && (instr->sampler_index < 16 && instr->texture_index < 128); if (desc.immediate_indices) { desc.sampler_index_or_mode = instr->sampler_index; @@ -3468,24 +3469,43 @@ bi_emit_texc(bi_builder *b, nir_tex_instr *instr) } else { unsigned mode = 0; - if (direct && instr->sampler_index == instr->texture_index) { + if (direct && instr->sampler_index == instr->texture_index && + instr->sampler_index < 128) { mode = BIFROST_INDEX_IMMEDIATE_SHARED; desc.index = instr->texture_index; - } else if (direct) { + } else if (direct && instr->sampler_index < 128) { mode = BIFROST_INDEX_IMMEDIATE_SAMPLER; desc.index = instr->sampler_index; dregs[BIFROST_TEX_DREG_TEXTURE] = bi_mov_i32(b, bi_imm_u32(instr->texture_index)); - } else if (direct_tex) { - assert(!direct_samp); + } else if (direct_tex && instr->texture_index < 128) { mode = BIFROST_INDEX_IMMEDIATE_TEXTURE; desc.index = instr->texture_index; - } else if (direct_samp) { - assert(!direct_tex); + + if (direct_samp) { + dregs[BIFROST_TEX_DREG_SAMPLER] = + bi_mov_i32(b, bi_imm_u32(instr->sampler_index)); + } + } else if (direct_samp && instr->sampler_index < 128) { mode = BIFROST_INDEX_IMMEDIATE_SAMPLER; desc.index = instr->sampler_index; + + if (direct_tex) { + dregs[BIFROST_TEX_DREG_TEXTURE] = + bi_mov_i32(b, bi_imm_u32(instr->texture_index)); + } } else { mode = BIFROST_INDEX_REGISTER; + + if (direct_tex) { + dregs[BIFROST_TEX_DREG_TEXTURE] = + bi_mov_i32(b, bi_imm_u32(instr->texture_index)); + } + + if (direct_samp) { + dregs[BIFROST_TEX_DREG_SAMPLER] = + bi_mov_i32(b, bi_imm_u32(instr->sampler_index)); + } } mode |= (BIFROST_TEXTURE_OPERATION_SINGLE << 2);