From 25b1974e1b734838ff545793b1ae6ddae7d3f90d Mon Sep 17 00:00:00 2001 From: Rhys Perry Date: Fri, 31 Mar 2023 19:43:03 +0100 Subject: [PATCH] aco: support implicit LOD for nir_texop_tg4 Signed-off-by: Rhys Perry Reviewed-by: Georg Lehmann Part-of: --- .../compiler/aco_instruction_selection.cpp | 22 +++++++++++++++---- 1 file changed, 18 insertions(+), 4 deletions(-) diff --git a/src/amd/compiler/aco_instruction_selection.cpp b/src/amd/compiler/aco_instruction_selection.cpp index 4ecfee98b06..7b685c3a95b 100644 --- a/src/amd/compiler/aco_instruction_selection.cpp +++ b/src/amd/compiler/aco_instruction_selection.cpp @@ -9359,6 +9359,9 @@ visit_tex(isel_context* ctx, nir_tex_instr* instr) } } + if (instr->op == nir_texop_tg4 && !has_lod && !instr->is_gather_implicit_lod) + level_zero = true; + if (has_offset) { assert(instr->op != nir_texop_txf); @@ -9809,15 +9812,22 @@ visit_tex(isel_context* ctx, nir_tex_instr* instr) } if (instr->op == nir_texop_tg4) { + /* GFX11 supports implicit LOD, but the extension is unsupported. */ + assert(level_zero || ctx->options->gfx_level < GFX11); + if (has_offset) { /* image_gather4_*_o */ if (has_compare) { - opcode = aco_opcode::image_gather4_c_lz_o; + opcode = aco_opcode::image_gather4_c_o; + if (level_zero) + opcode = aco_opcode::image_gather4_c_lz_o; if (has_lod) opcode = aco_opcode::image_gather4_c_l_o; if (has_bias) opcode = aco_opcode::image_gather4_c_b_o; } else { - opcode = aco_opcode::image_gather4_lz_o; + opcode = aco_opcode::image_gather4_o; + if (level_zero) + opcode = aco_opcode::image_gather4_lz_o; if (has_lod) opcode = aco_opcode::image_gather4_l_o; if (has_bias) @@ -9825,13 +9835,17 @@ visit_tex(isel_context* ctx, nir_tex_instr* instr) } } else { if (has_compare) { - opcode = aco_opcode::image_gather4_c_lz; + opcode = aco_opcode::image_gather4_c; + if (level_zero) + opcode = aco_opcode::image_gather4_c_lz; if (has_lod) opcode = aco_opcode::image_gather4_c_l; if (has_bias) opcode = aco_opcode::image_gather4_c_b; } else { - opcode = aco_opcode::image_gather4_lz; + opcode = aco_opcode::image_gather4; + if (level_zero) + opcode = aco_opcode::image_gather4_lz; if (has_lod) opcode = aco_opcode::image_gather4_l; if (has_bias)