mirror of
https://gitlab.freedesktop.org/mesa/mesa.git
synced 2024-12-13 20:24:23 +08:00
pan/bi: Check dependencies of both destinations of instructions
TEXC can have two destinations; the value for neither of them can be
used in the same bundle, so extend the code to check for this to
iterate over both destinations.
Fixes artefacts in the game "LIMBO".
Fixes: a303076c1a
("pan/bi: Add bi_instr_schedulable predicate")
Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/15250>
This commit is contained in:
parent
9e714f7455
commit
cb8c47b15e
@ -1060,16 +1060,21 @@ bi_instr_schedulable(bi_instr *instr,
|
||||
* same clause (most likely they will not), so if a later instruction
|
||||
* in the clause accesses the destination, the message-passing
|
||||
* instruction can't be scheduled */
|
||||
if (bi_opcode_props[instr->op].sr_write && !bi_is_null(instr->dest[0])) {
|
||||
unsigned nr = bi_count_write_registers(instr, 0);
|
||||
assert(instr->dest[0].type == BI_INDEX_REGISTER);
|
||||
unsigned reg = instr->dest[0].value;
|
||||
if (bi_opcode_props[instr->op].sr_write) {
|
||||
bi_foreach_dest(instr, d) {
|
||||
if (bi_is_null(instr->dest[d]))
|
||||
continue;
|
||||
|
||||
for (unsigned i = 0; i < clause->access_count; ++i) {
|
||||
bi_index idx = clause->accesses[i];
|
||||
for (unsigned d = 0; d < nr; ++d) {
|
||||
if (bi_is_equiv(bi_register(reg + d), idx))
|
||||
return false;
|
||||
unsigned nr = bi_count_write_registers(instr, d);
|
||||
assert(instr->dest[d].type == BI_INDEX_REGISTER);
|
||||
unsigned reg = instr->dest[d].value;
|
||||
|
||||
for (unsigned i = 0; i < clause->access_count; ++i) {
|
||||
bi_index idx = clause->accesses[i];
|
||||
for (unsigned d = 0; d < nr; ++d) {
|
||||
if (bi_is_equiv(bi_register(reg + d), idx))
|
||||
return false;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
Loading…
Reference in New Issue
Block a user