From b9e506afd48d9065a636bf6effb2438dd242b2fd Mon Sep 17 00:00:00 2001 From: Natalie Vock Date: Thu, 27 Mar 2025 18:44:34 +0100 Subject: [PATCH] aco: Add support for multiple definitions in emit_mimg Reviewed-by: Rhys Perry Part-of: --- .../compiler/aco_instruction_selection.cpp | 33 ++++++++++--------- 1 file changed, 17 insertions(+), 16 deletions(-) diff --git a/src/amd/compiler/aco_instruction_selection.cpp b/src/amd/compiler/aco_instruction_selection.cpp index 7b33c446215..a7ee2e19de5 100644 --- a/src/amd/compiler/aco_instruction_selection.cpp +++ b/src/amd/compiler/aco_instruction_selection.cpp @@ -5865,8 +5865,8 @@ image_type_to_components_count(enum glsl_sampler_dim dim, bool array) } static MIMG_instruction* -emit_mimg(Builder& bld, aco_opcode op, Temp dst, Temp rsrc, Operand samp, std::vector coords, - Operand vdata = Operand(v1)) +emit_mimg(Builder& bld, aco_opcode op, std::vector dsts, Temp rsrc, Operand samp, + std::vector coords, Operand vdata = Operand(v1)) { bool is_vsample = !samp.isUndefined() || op == aco_opcode::image_msaa_load; @@ -5909,11 +5909,9 @@ emit_mimg(Builder& bld, aco_opcode op, Temp dst, Temp rsrc, Operand samp, std::v coords.resize(nsa_size + 1); } - bool has_dst = dst.id() != 0; - - aco_ptr mimg{create_instruction(op, Format::MIMG, 3 + coords.size(), has_dst)}; - if (has_dst) - mimg->definitions[0] = Definition(dst); + aco_ptr mimg{create_instruction(op, Format::MIMG, 3 + coords.size(), dsts.size())}; + for (unsigned i = 0; i < dsts.size(); ++i) + mimg->definitions[i] = Definition(dsts[i]); mimg->operands[0] = Operand(rsrc); mimg->operands[1] = samp; mimg->operands[2] = vdata; @@ -5955,7 +5953,7 @@ visit_bvh64_intersect_ray_amd(isel_context* ctx, nir_intrinsic_instr* instr) } MIMG_instruction* mimg = - emit_mimg(bld, aco_opcode::image_bvh64_intersect_ray, dst, resource, Operand(s4), args); + emit_mimg(bld, aco_opcode::image_bvh64_intersect_ray, {dst}, resource, Operand(s4), args); mimg->dim = ac_image_1d; mimg->dmask = 0xf; mimg->unrm = true; @@ -6172,7 +6170,7 @@ visit_image_load(isel_context* ctx, nir_intrinsic_instr* instr) } Operand vdata = is_sparse ? emit_tfe_init(bld, tmp) : Operand(v1); - MIMG_instruction* load = emit_mimg(bld, opcode, tmp, resource, Operand(s4), coords, vdata); + MIMG_instruction* load = emit_mimg(bld, opcode, {tmp}, resource, Operand(s4), coords, vdata); load->cache = get_cache_flags(ctx, nir_intrinsic_access(instr) | ACCESS_TYPE_LOAD); load->a16 = instr->src[1].ssa->bit_size == 16; load->d16 = d16; @@ -6313,7 +6311,7 @@ visit_image_store(isel_context* ctx, nir_intrinsic_instr* instr) aco_opcode opcode = level_zero ? aco_opcode::image_store : aco_opcode::image_store_mip; MIMG_instruction* store = - emit_mimg(bld, opcode, Temp(0, v1), resource, Operand(s4), coords, Operand(data)); + emit_mimg(bld, opcode, {}, resource, Operand(s4), coords, Operand(data)); store->cache = cache; store->a16 = instr->src[1].ssa->bit_size == 16; store->d16 = d16; @@ -6466,9 +6464,11 @@ visit_image_atomic(isel_context* ctx, nir_intrinsic_instr* instr) std::vector coords = get_image_coords(ctx, instr); Temp resource = bld.as_uniform(get_ssa_temp(ctx, instr->src[0].ssa)); - Temp tmp = return_previous ? (cmpswap ? bld.tmp(data.regClass()) : dst) : Temp(0, v1); + std::vector tmps; + if (return_previous) + tmps = {(cmpswap ? bld.tmp(data.regClass()) : dst)}; MIMG_instruction* mimg = - emit_mimg(bld, image_op, tmp, resource, Operand(s4), coords, Operand(data)); + emit_mimg(bld, image_op, tmps, resource, Operand(s4), coords, Operand(data)); mimg->cache = get_atomic_cache_flags(ctx, return_previous); mimg->dmask = (1 << data.size()) - 1; mimg->a16 = instr->src[1].ssa->bit_size == 16; @@ -6480,7 +6480,7 @@ visit_image_atomic(isel_context* ctx, nir_intrinsic_instr* instr) mimg->sync = sync; ctx->program->needs_exact = true; if (return_previous && cmpswap) - bld.pseudo(aco_opcode::p_extract_vector, Definition(dst), tmp, Operand::zero()); + bld.pseudo(aco_opcode::p_extract_vector, Definition(dst), tmps[0], Operand::zero()); return; } @@ -9296,7 +9296,7 @@ visit_tex(isel_context* ctx, nir_tex_instr* instr) } else { Temp tg4_lod = bld.copy(bld.def(v1), Operand::zero()); Temp size = bld.tmp(v2); - MIMG_instruction* tex = emit_mimg(bld, aco_opcode::image_get_resinfo, size, resource, + MIMG_instruction* tex = emit_mimg(bld, aco_opcode::image_get_resinfo, {size}, resource, Operand(s4), std::vector{tg4_lod}); tex->dim = dim; tex->dmask = 0x3; @@ -9453,7 +9453,7 @@ visit_tex(isel_context* ctx, nir_tex_instr* instr) ? aco_opcode::image_load : aco_opcode::image_load_mip; Operand vdata = instr->is_sparse ? emit_tfe_init(bld, tmp_dst) : Operand(v1); - MIMG_instruction* tex = emit_mimg(bld, op, tmp_dst, resource, Operand(s4), args, vdata); + MIMG_instruction* tex = emit_mimg(bld, op, {tmp_dst}, resource, Operand(s4), args, vdata); if (instr->op == nir_texop_fragment_mask_fetch_amd) tex->dim = da ? ac_image_2darray : ac_image_2d; else @@ -9632,7 +9632,8 @@ visit_tex(isel_context* ctx, nir_tex_instr* instr) instr->sampler_dim != GLSL_SAMPLER_DIM_SUBPASS_MS; Operand vdata = instr->is_sparse ? emit_tfe_init(bld, tmp_dst) : Operand(v1); - MIMG_instruction* tex = emit_mimg(bld, opcode, tmp_dst, resource, Operand(sampler), args, vdata); + MIMG_instruction* tex = + emit_mimg(bld, opcode, {tmp_dst}, resource, Operand(sampler), args, vdata); tex->dim = dim; tex->dmask = dmask & 0xf; tex->da = da;