mirror of
https://gitlab.freedesktop.org/mesa/mesa.git
synced 2026-05-09 08:58:02 +02:00
broadcom/compiler: fix postponed TMU spills with multiple writes
If we are spilling a register that is used in the middle of a TMU
sequence, we postpone the spill until the TMU sequence finishes,
at which point we inject the spill and rewrite the original
instruction to write to the new temp.
However, this doesn't work if the register is written multiple
times during the TMU sequence. In that scenario, we need to ensure
that all writes are rewritten to use the new temp, not just the last
one.
Cc: mesa-stable
Reviewed-by: Alejandro Piñeiro <apinheiro@igalia.com>
Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/17201>
(cherry picked from commit 98420408d0)
This commit is contained in:
parent
c2cbbefe49
commit
63ac4309e1
2 changed files with 13 additions and 6 deletions
|
|
@ -472,7 +472,7 @@
|
|||
"description": "broadcom/compiler: fix postponed TMU spills with multiple writes",
|
||||
"nominated": true,
|
||||
"nomination_type": 0,
|
||||
"resolution": 0,
|
||||
"resolution": 1,
|
||||
"main_sha": null,
|
||||
"because_sha": null
|
||||
},
|
||||
|
|
|
|||
|
|
@ -676,12 +676,19 @@ v3d_spill_reg(struct v3d_compile *c, int *acc_nodes, int spill_temp)
|
|||
* with a new temp though.
|
||||
*/
|
||||
if (start_of_tmu_sequence) {
|
||||
if (postponed_spill) {
|
||||
postponed_spill->dst =
|
||||
postponed_spill_temp;
|
||||
}
|
||||
if (!postponed_spill ||
|
||||
vir_get_cond(inst) == V3D_QPU_COND_NONE) {
|
||||
postponed_spill_temp =
|
||||
vir_get_temp(c);
|
||||
add_node(c,
|
||||
postponed_spill_temp.index,
|
||||
c->nodes.info[spill_node].class_bits);
|
||||
}
|
||||
postponed_spill = inst;
|
||||
postponed_spill_temp =
|
||||
vir_get_temp(c);
|
||||
add_node(c,
|
||||
postponed_spill_temp.index,
|
||||
c->nodes.info[spill_node].class_bits);
|
||||
} else {
|
||||
v3d_emit_tmu_spill(c, inst,
|
||||
postponed_spill_temp,
|
||||
|
|
|
|||
Loading…
Add table
Reference in a new issue