From a2cb85800bf82ff84199b0e999e76b193027fd8c Mon Sep 17 00:00:00 2001 From: Gert Wollny Date: Sun, 31 Jul 2022 15:30:07 +0200 Subject: [PATCH] r600/sfn: Handle non-compressed MS texel fetch v2: Fix formatting (Filip) Signed-off-by: Gert Wollny Reviewed-by: Filip Gawin Part-of: --- .../drivers/r600/sfn/sfn_instr_tex.cpp | 45 ++++++++++++++++++- src/gallium/drivers/r600/sfn/sfn_instr_tex.h | 1 + 2 files changed, 44 insertions(+), 2 deletions(-) diff --git a/src/gallium/drivers/r600/sfn/sfn_instr_tex.cpp b/src/gallium/drivers/r600/sfn/sfn_instr_tex.cpp index 64c298e8755..0ba7abc0f4d 100644 --- a/src/gallium/drivers/r600/sfn/sfn_instr_tex.cpp +++ b/src/gallium/drivers/r600/sfn/sfn_instr_tex.cpp @@ -336,7 +336,7 @@ bool TexInstr::from_nir(nir_tex_instr *tex, Shader& shader) case nir_texop_tex: return emit_tex_tex(tex, src, shader); case nir_texop_txf: - return emit_tex_txf(tex, src, shader); + return emit_tex_txf(tex, src, shader); case nir_texop_txb: case nir_texop_txl: return emit_tex_txl_txb(tex, src, shader); @@ -349,7 +349,10 @@ bool TexInstr::from_nir(nir_tex_instr *tex, Shader& shader) case nir_texop_txd: return emit_tex_txd(tex, src, shader); case nir_texop_txf_ms: - return emit_tex_tex_ms(tex, src, shader); + if (shader.chip_class() < ISA_CC_EVERGREEN) + return emit_tex_tex_ms_direct(tex, src, shader); + else + return emit_tex_tex_ms(tex, src, shader); case nir_texop_tg4: return emit_tex_tg4(tex, src, shader); case nir_texop_texture_samples: @@ -499,6 +502,44 @@ bool TexInstr::emit_buf_txf(nir_tex_instr *tex, Inputs& src, Shader& shader) return true; } +bool TexInstr::emit_tex_tex_ms_direct(nir_tex_instr *tex, Inputs& src, Shader& shader) +{ + assert(tex->src[0].src.is_ssa); + auto& vf = shader.value_factory(); + + r600::sfn_log << SfnLog::instr << "emit '" + << *reinterpret_cast(tex) + << "' (" << __func__ << ")\n"; + + auto sampler = get_sampler_id(tex->sampler_index, src.sampler_deref); + assert(!sampler.indirect && "Indirect sampler selection not yet supported"); + + auto temp2 = vf.temp_vec4(pin_group); + + for (unsigned i = 0; i < tex->coord_components; ++i) { + unsigned k = i; + if (tex->is_array && tex->sampler_dim == GLSL_SAMPLER_DIM_1D && i == 1) + k = 2; + + shader.emit_instruction(new AluInstr(op1_mov, temp2[k], + src.coord[k], AluInstr::write)); + } + + shader.emit_instruction(new AluInstr(op1_mov, temp2[3], src.ms_index, + AluInstr::last_write)); + + auto dst = vf.dest_vec4(tex->dest, pin_group); + + /* txf doesn't need rounding for the array index, but 1D has the array index + * in the z component */ + auto tex_ir = new TexInstr(ld, dst, {0,1,2,3}, temp2, + sampler.id, + sampler.id + R600_MAX_CONST_BUFFERS, src.sampler_offset); + + shader.emit_instruction(tex_ir); + return true; +} + bool TexInstr::emit_tex_tex_ms(nir_tex_instr *tex, Inputs& src, Shader& shader) { assert(tex->src[0].src.is_ssa); diff --git a/src/gallium/drivers/r600/sfn/sfn_instr_tex.h b/src/gallium/drivers/r600/sfn/sfn_instr_tex.h index 53adb18681b..056e4140cb3 100644 --- a/src/gallium/drivers/r600/sfn/sfn_instr_tex.h +++ b/src/gallium/drivers/r600/sfn/sfn_instr_tex.h @@ -159,6 +159,7 @@ private: static bool emit_buf_txf(nir_tex_instr *tex, Inputs& src, Shader& shader); static bool emit_tex_txf(nir_tex_instr *tex, Inputs& src, Shader& shader); + static bool emit_tex_tex_ms_direct(nir_tex_instr *tex, Inputs& src, Shader& shader); static bool emit_tex_tex_ms(nir_tex_instr *tex, Inputs& src, Shader& shader); static bool emit_tex_tex(nir_tex_instr *tex, Inputs& src, Shader& shader); static bool emit_tex_txl_txb(nir_tex_instr *tex, Inputs& src, Shader& shader);