From: Rhys Perry Date: Wed, 16 Nov 2022 15:08:34 +0000 (+0000) Subject: aco: ensure MRT0 is written with dual source blending X-Git-Tag: upstream/22.3.5~389 X-Git-Url: http://review.tizen.org/git/?a=commitdiff_plain;h=c0c581ec3449b865e2d1e5dd080d7c88ca30f8fe;p=platform%2Fupstream%2Fmesa.git 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: (cherry picked from commit 3061bc792d3d0252854a38bff956c15c51b06643) --- diff --git a/.pick_status.json b/.pick_status.json index 050cc3f..99f7bf2 100644 --- a/.pick_status.json +++ b/.pick_status.json @@ -904,7 +904,7 @@ "description": "aco: ensure MRT0 is written with dual source blending", "nominated": true, "nomination_type": 0, - "resolution": 0, + "resolution": 1, "main_sha": null, "because_sha": null }, diff --git a/src/amd/compiler/aco_instruction_selection.cpp b/src/amd/compiler/aco_instruction_selection.cpp index ae2fd97..c1acde8 100644 --- a/src/amd/compiler/aco_instruction_selection.cpp +++ b/src/amd/compiler/aco_instruction_selection.cpp @@ -11496,6 +11496,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;