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: e14529ff32
"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>
This commit is contained in:
@@ -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;
|
||||
|
Reference in New Issue
Block a user