summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorFrancisco Jerez <currojerez@riseup.net>2020-03-19 13:08:56 -0700
committerEric Engestrom <eric@engestrom.ch>2020-03-30 12:26:45 +0200
commitcbc7ba2e473e56b5c02bf422f8a7d51945b0d693 (patch)
treeaa90b8a3e82a94213a23ee369cf5711354d77b21
parentc0927e9f72d9f543dda71c0b70fda3f8369de084 (diff)
intel/fs/gen12: Fix interaction of SWSB dependency combination with EU fusion workaround.
This has been reported to fix a hang in Shadow of Mordor on Gen12. One of its compute shaders seems to cause an in-order exec_all dependency to be merged into an out-of-order SET dependency slot, which would prevent us from baking the SET dependency into the parent instruction, leading to an assert failure in emit_inst_dependencies() (Thanks to Rafael for noticing that). Prevent that by avoiding combination of in-order dependencies whenever that would cause a SET dependency to be demoted to a SYNC.NOP instruction. Fixes: e14529ff3262a527 "intel/fs/gen12: Workaround data coherency issues due to broken NoMask control flow." Tested-by: Rafael Antognolli <rafael.antognolli@intel.com> Reviewed-by: Caio Marcelo de Oliveira Filho <caio.oliveira@intel.com> (cherry picked from commit 36c155a0178d6f05d65a9acfe5b7553d7a522f07)
-rw-r--r--.pick_status.json2
-rw-r--r--src/intel/compiler/brw_fs_scoreboard.cpp21
2 files changed, 12 insertions, 11 deletions
diff --git a/.pick_status.json b/.pick_status.json
index 589b3581dc8..2d1b2acaf62 100644
--- a/.pick_status.json
+++ b/.pick_status.json
@@ -652,7 +652,7 @@
"description": "intel/fs/gen12: Fix interaction of SWSB dependency combination with EU fusion workaround.",
"nominated": true,
"nomination_type": 1,
- "resolution": 0,
+ "resolution": 1,
"master_sha": null,
"because_sha": "e14529ff3262a527d630cecac655f69c8ae15c3f"
},
diff --git a/src/intel/compiler/brw_fs_scoreboard.cpp b/src/intel/compiler/brw_fs_scoreboard.cpp
index 5343aa1e634..cf619ffe3dc 100644
--- a/src/intel/compiler/brw_fs_scoreboard.cpp
+++ b/src/intel/compiler/brw_fs_scoreboard.cpp
@@ -658,6 +658,16 @@ namespace {
/* Try to combine the specified dependency with any existing ones. */
for (unsigned i = 0; i < deps.size(); i++) {
+ /* Don't combine otherwise matching dependencies if there is an
+ * exec_all mismatch which would cause a SET dependency to gain an
+ * exec_all flag, since that would prevent it from being baked
+ * into the instruction we want to allocate an SBID for.
+ */
+ if (deps[i].exec_all != dep.exec_all &&
+ (!deps[i].exec_all || (dep.unordered & TGL_SBID_SET)) &&
+ (!dep.exec_all || (deps[i].unordered & TGL_SBID_SET)))
+ continue;
+
if (dep.ordered && deps[i].ordered) {
deps[i].jp = MAX2(deps[i].jp, dep.jp);
deps[i].ordered |= dep.ordered;
@@ -665,16 +675,7 @@ namespace {
dep.ordered = TGL_REGDIST_NULL;
}
- /* Don't combine otherwise matching unordered dependencies if
- * there is an exec_all mismatch which would cause a SET
- * dependency to gain an exec_all flag, since that would prevent
- * it from being baked into the instruction we want to allocate an
- * SBID for.
- */
- if (dep.unordered && deps[i].unordered && deps[i].id == dep.id &&
- (deps[i].exec_all == dep.exec_all ||
- (deps[i].exec_all && !(dep.unordered & TGL_SBID_SET)) ||
- (dep.exec_all && !(deps[i].unordered & TGL_SBID_SET)))) {
+ if (dep.unordered && deps[i].unordered && deps[i].id == dep.id) {
deps[i].unordered |= dep.unordered;
deps[i].exec_all |= dep.exec_all;
dep.unordered = TGL_SBID_NULL;