From 3061bc792d3d0252854a38bff956c15c51b06643 Mon Sep 17 00:00:00 2001 From: Rhys Perry Date: Wed, 16 Nov 2022 15:08:34 +0000 Subject: [PATCH] aco: ensure MRT0 is written with dual source blending Fixes crucible test func.shader.dualsrc_mrt0_undef on polaris10. Signed-off-by: Rhys Perry Reviewed-by: Samuel Pitoiset Cc: 22.3 mesa-stable Part-of: --- src/amd/compiler/aco_instruction_selection.cpp | 13 +++++++++++++ 1 file changed, 13 insertions(+) diff --git a/src/amd/compiler/aco_instruction_selection.cpp b/src/amd/compiler/aco_instruction_selection.cpp index 1d5185ec0e2..2de6e9a6deb 100644 --- a/src/amd/compiler/aco_instruction_selection.cpp +++ b/src/amd/compiler/aco_instruction_selection.cpp @@ -11495,6 +11495,19 @@ create_fs_exports(isel_context* ctx) struct aco_export_mrt mrts[8]; unsigned compacted_mrt_index = 0; + /* MRT compaction doesn't work with dual-source blending. Dual-source blending seems to + * require MRT0 to be written. Just copy MRT1 into MRT0. Skipping MRT1 exports seems to be + * fine. + */ + if (ctx->options->key.ps.mrt0_is_dual_src && !ctx->outputs.mask[FRAG_RESULT_DATA0] && + ctx->outputs.mask[FRAG_RESULT_DATA1]) { + u_foreach_bit (j, ctx->outputs.mask[FRAG_RESULT_DATA1]) { + ctx->outputs.temps[FRAG_RESULT_DATA0 * 4u + j] = + ctx->outputs.temps[FRAG_RESULT_DATA1 * 4u + j]; + } + ctx->outputs.mask[FRAG_RESULT_DATA0] = ctx->outputs.mask[FRAG_RESULT_DATA1]; + } + /* Export all color render targets. */ for (unsigned i = FRAG_RESULT_DATA0; i < FRAG_RESULT_DATA7 + 1; ++i) { unsigned idx = i - FRAG_RESULT_DATA0;