aco: ensure MRT0 is written with dual source blending
authorRhys Perry <pendingchaos02@gmail.com>
Wed, 16 Nov 2022 15:08:34 +0000 (15:08 +0000)
committerEric Engestrom <eric@engestrom.ch>
Wed, 23 Nov 2022 19:11:59 +0000 (19:11 +0000)
Fixes crucible test func.shader.dualsrc_mrt0_undef on polaris10.

Signed-off-by: Rhys Perry <pendingchaos02@gmail.com>
Reviewed-by: Samuel Pitoiset <samuel.pitoiset@gmail.com>
Cc: 22.3 mesa-stable
Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/19806>
(cherry picked from commit 3061bc792d3d0252854a38bff956c15c51b06643)

.pick_status.json
src/amd/compiler/aco_instruction_selection.cpp

index 050cc3f..99f7bf2 100644 (file)
         "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
     },
index ae2fd97..c1acde8 100644 (file)
@@ -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;