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++)