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 <boris.brezillon@collabora.com>
Reviewed-by: Mary Guillemard <mary.guillemard@collabora.com>
Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/28417>
This commit is contained in:
Boris Brezillon
2024-03-29 12:16:02 +01:00
committed by Marge Bot
parent feffe7fd2a
commit f1d8a65d7f

View File

@@ -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);