radeonsi: reorganize the code around the gfx9 scissor bug
Reviewed-by: Pierre-Eric Pelloux-Prayer <pierre-eric.pelloux-prayer@amd.com>
Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/6786>
diff --git a/src/gallium/drivers/radeonsi/si_state_draw.c b/src/gallium/drivers/radeonsi/si_state_draw.c
index 5677443..9c1b8e0 100644
--- a/src/gallium/drivers/radeonsi/si_state_draw.c
+++ b/src/gallium/drivers/radeonsi/si_state_draw.c
@@ -1948,9 +1948,11 @@
* registers must be written too.
*/
unsigned masked_atoms = 0;
+ bool gfx9_scissor_bug = false;
if (sctx->screen->info.has_gfx9_scissor_bug) {
masked_atoms |= si_get_atom_bit(sctx, &sctx->atoms.s.scissors);
+ gfx9_scissor_bug = true;
if (info->count_from_stream_output ||
sctx->dirty_atoms & si_atoms_that_always_roll_context() ||
@@ -1974,14 +1976,17 @@
sctx->emit_cache_flush(sctx);
/* <-- CUs are idle here. */
- if (si_is_atom_dirty(sctx, &sctx->atoms.s.render_cond))
+ if (si_is_atom_dirty(sctx, &sctx->atoms.s.render_cond)) {
sctx->atoms.s.render_cond.emit(sctx);
+ sctx->dirty_atoms &= ~si_get_atom_bit(sctx, &sctx->atoms.s.render_cond);
+ }
- if (sctx->screen->info.has_gfx9_scissor_bug &&
- (sctx->context_roll || si_is_atom_dirty(sctx, &sctx->atoms.s.scissors)))
+ if (gfx9_scissor_bug &&
+ (sctx->context_roll || si_is_atom_dirty(sctx, &sctx->atoms.s.scissors))) {
sctx->atoms.s.scissors.emit(sctx);
-
- sctx->dirty_atoms = 0;
+ sctx->dirty_atoms &= ~si_get_atom_bit(sctx, &sctx->atoms.s.scissors);
+ }
+ assert(sctx->dirty_atoms == 0);
si_emit_draw_packets(sctx, info, indexbuf, index_size, index_offset, instance_count,
dispatch_prim_discard_cs, original_index_size);
@@ -2005,11 +2010,12 @@
si_emit_all_states(sctx, info, prim, instance_count, primitive_restart, masked_atoms);
- if (sctx->screen->info.has_gfx9_scissor_bug &&
- (sctx->context_roll || si_is_atom_dirty(sctx, &sctx->atoms.s.scissors)))
+ if (gfx9_scissor_bug &&
+ (sctx->context_roll || si_is_atom_dirty(sctx, &sctx->atoms.s.scissors))) {
sctx->atoms.s.scissors.emit(sctx);
-
- sctx->dirty_atoms = 0;
+ sctx->dirty_atoms &= ~si_get_atom_bit(sctx, &sctx->atoms.s.scissors);
+ }
+ assert(sctx->dirty_atoms == 0);
si_emit_draw_packets(sctx, info, indexbuf, index_size, index_offset, instance_count,
dispatch_prim_discard_cs, original_index_size);