aco/sched: treat p_dual_src_export_gfx11 like export
authorGeorg Lehmann <dadschoorse@gmail.com>
Tue, 21 Nov 2023 14:24:35 +0000 (15:24 +0100)
committerEric Engestrom <eric@engestrom.ch>
Wed, 22 Nov 2023 08:42:53 +0000 (08:42 +0000)
This prevents the scheduler from moving the dual source export above mrtz
export, which caused hangs.

Closes: https://gitlab.freedesktop.org/mesa/mesa/-/issues/10173

Cc: mesa-stable
Reviewed-by: Rhys Perry <pendingchaos02@gmail.com>
Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/26317>
(cherry picked from commit 0a5d3ac8d2b245e8b3f3589d3ade3de7356fe637)

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

index df27149..4ef662c 100644 (file)
         "description": "aco/sched: treat p_dual_src_export_gfx11 like export",
         "nominated": true,
         "nomination_type": 0,
-        "resolution": 0,
+        "resolution": 1,
         "main_sha": null,
         "because_sha": null,
         "notes": null
index 592e42c..f4cebf7 100644 (file)
@@ -596,13 +596,15 @@ perform_hazard_query(hazard_query* query, Instruction* instr, bool upwards)
       return hazard_fail_exec;
 
    /* Don't move exports so that they stay closer together.
+    * Since GFX11, export order matters. MRTZ must come first,
+    * then color exports sorted from first to last.
     * Also, with Primitive Ordered Pixel Shading on GFX11+, the `done` export must not be moved
     * above the memory accesses before the queue family scope (more precisely, fragment interlock
     * scope, but it's not available in ACO) release barrier that is expected to be inserted before
     * the export, as well as before any `s_wait_event export_ready` which enters the ordered
     * section, because the `done` export exits the ordered section.
     */
-   if (instr->isEXP())
+   if (instr->isEXP() || instr->opcode == aco_opcode::p_dual_src_export_gfx11)
       return hazard_fail_export;
 
    /* don't move non-reorderable instructions */