From ff70ccad16a2efb3be1fbc4ca03453d38721a267 Mon Sep 17 00:00:00 2001 From: Rhys Perry Date: Thu, 28 Nov 2019 15:29:40 +0000 Subject: [PATCH] aco: propagate p_wqm on an image_sample's coordinate p_create_vector MIME-Version: 1.0 Content-Type: text/plain; charset=utf8 Content-Transfer-Encoding: 8bit Closes: https://gitlab.freedesktop.org/mesa/mesa/issues/2156 Fixes: 93c8ebfa780 ('aco: Initial commit of independent AMD compiler') Signed-off-by: Rhys Perry Reviewed-by: Daniel Schürmann --- .../compiler/aco_instruction_selection.cpp | 21 +++++++++++-------- 1 file changed, 12 insertions(+), 9 deletions(-) diff --git a/src/amd/compiler/aco_instruction_selection.cpp b/src/amd/compiler/aco_instruction_selection.cpp index 249a9d7b77b..bcccd0435f1 100644 --- a/src/amd/compiler/aco_instruction_selection.cpp +++ b/src/amd/compiler/aco_instruction_selection.cpp @@ -6588,11 +6588,6 @@ void visit_tex(isel_context *ctx, nir_tex_instr *instr) } } - if (!(has_ddx && has_ddy) && !has_lod && !level_zero && - instr->sampler_dim != GLSL_SAMPLER_DIM_MS && - instr->sampler_dim != GLSL_SAMPLER_DIM_SUBPASS_MS) - coords = emit_wqm(ctx, coords, bld.tmp(coords.regClass()), true); - std::vector args; if (has_offset) args.emplace_back(Operand(offset)); @@ -6608,7 +6603,7 @@ void visit_tex(isel_context *ctx, nir_tex_instr *instr) if (has_lod) args.emplace_back(lod); - Operand arg; + Temp arg; if (args.size() > 1) { aco_ptr vec{create_instruction(aco_opcode::p_create_vector, Format::PSEUDO, args.size(), 1)}; unsigned size = 0; @@ -6620,12 +6615,20 @@ void visit_tex(isel_context *ctx, nir_tex_instr *instr) Temp tmp = bld.tmp(rc); vec->definitions[0] = Definition(tmp); ctx->block->instructions.emplace_back(std::move(vec)); - arg = Operand(tmp); + arg = tmp; } else { assert(args[0].isTemp()); - arg = Operand(as_vgpr(ctx, args[0].getTemp())); + arg = as_vgpr(ctx, args[0].getTemp()); } + /* we don't need the bias, sample index, compare value or offset to be + * computed in WQM but if the p_create_vector copies the coordinates, then it + * needs to be in WQM */ + if (!(has_ddx && has_ddy) && !has_lod && !level_zero && + instr->sampler_dim != GLSL_SAMPLER_DIM_MS && + instr->sampler_dim != GLSL_SAMPLER_DIM_SUBPASS_MS) + arg = emit_wqm(ctx, arg, bld.tmp(arg.regClass()), true); + if (instr->sampler_dim == GLSL_SAMPLER_DIM_BUF) { //FIXME: if (ctx->abi->gfx9_stride_size_workaround) return ac_build_buffer_load_format_gfx9_safe() @@ -6757,7 +6760,7 @@ void visit_tex(isel_context *ctx, nir_tex_instr *instr) } tex.reset(create_instruction(opcode, Format::MIMG, 3, 1)); - tex->operands[0] = arg; + tex->operands[0] = Operand(arg); tex->operands[1] = Operand(resource); tex->operands[2] = Operand(sampler); tex->dim = dim; -- 2.30.2