Module: Mesa Branch: staging/23.3 Commit: ae337176ef0ce0012b5d5f2d970723d03623747a URL: http://cgit.freedesktop.org/mesa/mesa/commit/?id=ae337176ef0ce0012b5d5f2d970723d03623747a
Author: Alyssa Rosenzweig <[email protected]> Date: Thu Oct 12 15:45:28 2023 -0400 agx: Fix fragment side effects scheduling We can't move discards across side effects, or the side effect might not happen. Fixes KHR-GLES31.core.shader_image_load_store.basic-allFormats-load-fs regression. Sigh. CI is up next. Fixes: 119e5b9719a ("agx: Schedule for register pressure") Signed-off-by: Alyssa Rosenzweig <[email protected]> Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/26056> (cherry picked from commit 7b92c6310586e3b17eb922b442561b64cb3b1aff) --- .pick_status.json | 2 +- src/asahi/compiler/agx_pressure_schedule.c | 6 ++++++ 2 files changed, 7 insertions(+), 1 deletion(-) diff --git a/.pick_status.json b/.pick_status.json index 953eb1798e0..60bcc59cedc 100644 --- a/.pick_status.json +++ b/.pick_status.json @@ -504,7 +504,7 @@ "description": "agx: Fix fragment side effects scheduling", "nominated": true, "nomination_type": 1, - "resolution": 0, + "resolution": 1, "main_sha": null, "because_sha": "119e5b9719a1e1cb0cb7e8e74d7b607633bd3ee0", "notes": null diff --git a/src/asahi/compiler/agx_pressure_schedule.c b/src/asahi/compiler/agx_pressure_schedule.c index a58509a191a..9dd940f8e8d 100644 --- a/src/asahi/compiler/agx_pressure_schedule.c +++ b/src/asahi/compiler/agx_pressure_schedule.c @@ -81,6 +81,8 @@ create_dag(agx_context *ctx, agx_block *block, void *memctx) assert(dep != AGX_SCHEDULE_CLASS_INVALID && "invalid instruction seen"); bool barrier = dep == AGX_SCHEDULE_CLASS_BARRIER; + bool discards = + I->op == AGX_OPCODE_SAMPLE_MASK || I->op == AGX_OPCODE_ZS_EMIT; if (dep == AGX_SCHEDULE_CLASS_STORE) add_dep(node, memory_load); @@ -94,6 +96,10 @@ create_dag(agx_context *ctx, agx_block *block, void *memctx) if (dep == AGX_SCHEDULE_CLASS_COVERAGE || barrier) serialize(node, &coverage); + /* Make sure side effects happen before a discard */ + if (discards) + add_dep(node, memory_store); + if (dep == AGX_SCHEDULE_CLASS_PRELOAD) serialize(node, &preload); else
