From 8aab92b393742cb8ee2b36bdc02ec9778f1ae53e Mon Sep 17 00:00:00 2001 From: =?utf8?q?Daniel=20Sch=C3=BCrmann?= Date: Tue, 5 Nov 2019 15:24:12 +0100 Subject: [PATCH] aco: SI/CI - fix sampler aniso Reviewed-by: Rhys Perry --- .../compiler/aco_instruction_selection.cpp | 25 +++++++++++++++---- 1 file changed, 20 insertions(+), 5 deletions(-) diff --git a/src/amd/compiler/aco_instruction_selection.cpp b/src/amd/compiler/aco_instruction_selection.cpp index f734940ccda..805a7354979 100644 --- a/src/amd/compiler/aco_instruction_selection.cpp +++ b/src/amd/compiler/aco_instruction_selection.cpp @@ -6180,12 +6180,27 @@ void tex_fetch_ptrs(isel_context *ctx, nir_tex_instr *instr, } if (samp_ptr) { *samp_ptr = get_sampler_desc(ctx, sampler_deref_instr, ACO_DESC_SAMPLER, instr, false, false); + if (instr->sampler_dim < GLSL_SAMPLER_DIM_RECT && ctx->options->chip_class < GFX8) { - fprintf(stderr, "Unimplemented sampler descriptor: "); - nir_print_instr(&instr->instr, stderr); - fprintf(stderr, "\n"); - abort(); - // TODO: build samp_ptr = and(samp_ptr, res_ptr) + /* fix sampler aniso on SI/CI: samp[0] = samp[0] & img[7] */ + Builder bld(ctx->program, ctx->block); + + /* to avoid unnecessary moves, we split and recombine sampler and image */ + Temp img[8] = {bld.tmp(s1), bld.tmp(s1), bld.tmp(s1), bld.tmp(s1), + bld.tmp(s1), bld.tmp(s1), bld.tmp(s1), bld.tmp(s1)}; + Temp samp[4] = {bld.tmp(s1), bld.tmp(s1), bld.tmp(s1), bld.tmp(s1)}; + bld.pseudo(aco_opcode::p_split_vector, Definition(img[0]), Definition(img[1]), + Definition(img[2]), Definition(img[3]), Definition(img[4]), + Definition(img[5]), Definition(img[6]), Definition(img[7]), *res_ptr); + bld.pseudo(aco_opcode::p_split_vector, Definition(samp[0]), Definition(samp[1]), + Definition(samp[2]), Definition(samp[3]), *samp_ptr); + + samp[0] = bld.sop2(aco_opcode::s_and_b32, bld.def(s1), bld.def(s1, scc), samp[0], img[7]); + *res_ptr = bld.pseudo(aco_opcode::p_create_vector, bld.def(s8), + img[0], img[1], img[2], img[3], + img[4], img[5], img[6], img[7]); + *samp_ptr = bld.pseudo(aco_opcode::p_create_vector, bld.def(s4), + samp[0], samp[1], samp[2], samp[3]); } } if (fmask_ptr && (instr->op == nir_texop_txf_ms || -- 2.30.2