mirror of
https://gitlab.freedesktop.org/mesa/mesa.git
synced 2026-05-08 13:28:06 +02:00
radeonsi: fix a nasty bug in si_pm4.c
If you did: si_pm4_set_reg(pm4, reg, val0); si_pm4_cmd_add(pm4, val1); si_pm4 set_reg(pm4, reg + 4, val1); it wrote val0 to reg, val1 to reg + 4, and val2 to reg + 8. This fixes it by clearing last_opcode in si_pm4_cmd_add, so that si_pm4_set_reg doesn't try to combine set_reg calls across si_pm4_cmd_add. Fixes:da78d50bc8- radeonsi: make si_pm4_cmd_begin/end static and simplify all usages Reviewed-by: Pierre-Eric Pelloux-Prayer <pierre-eric.pelloux-prayer@amd.com> Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/7721> (cherry picked from commit0d4f1dcd15)
This commit is contained in:
parent
b7659c5ed7
commit
2b9da404c1
2 changed files with 6 additions and 3 deletions
|
|
@ -733,7 +733,7 @@
|
|||
"description": "radeonsi: fix a nasty bug in si_pm4.c",
|
||||
"nominated": true,
|
||||
"nomination_type": 1,
|
||||
"resolution": 0,
|
||||
"resolution": 1,
|
||||
"master_sha": null,
|
||||
"because_sha": "da78d50bc87ef5db846a942664094b6299cd1888"
|
||||
},
|
||||
|
|
|
|||
|
|
@ -38,6 +38,7 @@ void si_pm4_cmd_add(struct si_pm4_state *state, uint32_t dw)
|
|||
{
|
||||
assert(state->ndw < SI_PM4_MAX_DW);
|
||||
state->pm4[state->ndw++] = dw;
|
||||
state->last_opcode = -1;
|
||||
}
|
||||
|
||||
static void si_pm4_cmd_end(struct si_pm4_state *state, bool predicate)
|
||||
|
|
@ -76,13 +77,15 @@ void si_pm4_set_reg(struct si_pm4_state *state, unsigned reg, uint32_t val)
|
|||
|
||||
reg >>= 2;
|
||||
|
||||
assert(state->ndw + 2 <= SI_PM4_MAX_DW);
|
||||
|
||||
if (opcode != state->last_opcode || reg != (state->last_reg + 1)) {
|
||||
si_pm4_cmd_begin(state, opcode);
|
||||
si_pm4_cmd_add(state, reg);
|
||||
state->pm4[state->ndw++] = reg;
|
||||
}
|
||||
|
||||
state->last_reg = reg;
|
||||
si_pm4_cmd_add(state, val);
|
||||
state->pm4[state->ndw++] = val;
|
||||
si_pm4_cmd_end(state, false);
|
||||
}
|
||||
|
||||
|
|
|
|||
Loading…
Add table
Reference in a new issue