From 0d4f1dcd155be753ff49cd763be916cf701cda25 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Marek=20Ol=C5=A1=C3=A1k?= Date: Sun, 22 Nov 2020 23:19:44 -0500 Subject: [PATCH] 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: da78d50bc87 - radeonsi: make si_pm4_cmd_begin/end static and simplify all usages Reviewed-by: Pierre-Eric Pelloux-Prayer Part-of: --- src/gallium/drivers/radeonsi/si_pm4.c | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/src/gallium/drivers/radeonsi/si_pm4.c b/src/gallium/drivers/radeonsi/si_pm4.c index d1d003af1d4..e4ddbc8d59b 100644 --- a/src/gallium/drivers/radeonsi/si_pm4.c +++ b/src/gallium/drivers/radeonsi/si_pm4.c @@ -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); }