From 82420ebc2c0dc2b745cbfa2379e49bf6b67be69a Mon Sep 17 00:00:00 2001 From: Rhys Perry Date: Fri, 20 Feb 2026 12:01:11 +0000 Subject: [PATCH] aco: fix PS epilog dual-source blending with only one color output MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: Rhys Perry Reviewed-by: Marek Olšák Reviewed-by: Samuel Pitoiset Part-of: --- .../instruction_selection/aco_isel_helpers.cpp | 4 ++-- .../instruction_selection/aco_select_ps_epilog.cpp | 11 ++++++++++- 2 files changed, 12 insertions(+), 3 deletions(-) diff --git a/src/amd/compiler/instruction_selection/aco_isel_helpers.cpp b/src/amd/compiler/instruction_selection/aco_isel_helpers.cpp index 7bda26fb834..d78f949af8a 100644 --- a/src/amd/compiler/instruction_selection/aco_isel_helpers.cpp +++ b/src/amd/compiler/instruction_selection/aco_isel_helpers.cpp @@ -606,8 +606,8 @@ create_fs_dual_src_export_gfx11(isel_context* ctx, const struct aco_export_mrt* aco_ptr exp{ create_instruction(aco_opcode::p_dual_src_export_gfx11, Format::PSEUDO, 10, 6)}; for (unsigned i = 0; i < 4; i++) { - exp->operands[i] = mrt0 ? mrt0->out[i] : Operand(v1); - exp->operands[i + 4] = mrt1 ? mrt1->out[i] : Operand(v1); + exp->operands[i] = mrt0->out[i]; + exp->operands[i + 4] = mrt1->out[i]; } instr_exact_mask(exp.get()) = Operand(); diff --git a/src/amd/compiler/instruction_selection/aco_select_ps_epilog.cpp b/src/amd/compiler/instruction_selection/aco_select_ps_epilog.cpp index cf4639d6d40..5848173ea26 100644 --- a/src/amd/compiler/instruction_selection/aco_select_ps_epilog.cpp +++ b/src/amd/compiler/instruction_selection/aco_select_ps_epilog.cpp @@ -449,8 +449,17 @@ select_ps_epilog(Program* program, void* pinfo, ac_shader_config* config, } if (mrt_num) { + if (einfo->mrt0_is_dual_src && mrt_num == 1) { + mrts[mrt_num++] = mrts[0]; + std::fill(mrts[1].out, mrts[1].out + 3, Operand(v1)); + u_foreach_bit (i, mrts[1].enabled_channels) + mrts[1].out[i] = bld.copy(bld.def(v1), Operand::c32(0)); + if (einfo->colors[1].used) + std::swap(mrts[0], mrts[1]); + mrts[1].target++; + } + if (ctx.options->gfx_level >= GFX11 && einfo->mrt0_is_dual_src) { - assert(mrt_num == 2); create_fs_dual_src_export_gfx11(&ctx, &mrts[0], &mrts[1]); } else { for (unsigned i = 0; i < mrt_num; i++)