From c2d8cba0b4b1dbf8e52573d7b78dfe0093d078ed Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Marek=20Ol=C5=A1=C3=A1k?= Date: Thu, 22 Aug 2024 17:25:42 -0400 Subject: [PATCH] radeonsi: always wait for idle before get_query_result_resource The shader busy-waits until the query results are written, but that only synchronizes for src. The destination buffer might also be used by previous shaders, so we should wait until all shaders are idle. This might fix some issues. The missing si_mark_atom_dirty fix should have no effect, but all flags changes should call it to be consistent. Reviewed-by: Pierre-Eric Pelloux-Prayer Part-of: --- src/gallium/drivers/radeonsi/gfx11_query.c | 6 ++++-- src/gallium/drivers/radeonsi/si_query.c | 2 +- 2 files changed, 5 insertions(+), 3 deletions(-) diff --git a/src/gallium/drivers/radeonsi/gfx11_query.c b/src/gallium/drivers/radeonsi/gfx11_query.c index c439d1c4c52..9d92c81fc34 100644 --- a/src/gallium/drivers/radeonsi/gfx11_query.c +++ b/src/gallium/drivers/radeonsi/gfx11_query.c @@ -347,8 +347,10 @@ static void gfx11_sh_query_get_result_resource(struct si_context *sctx, struct s grid.grid[2] = 1; /* TODO: Range-invalidate GL2 */ - if (sctx->screen->info.cp_sdma_ge_use_system_memory_scope) + if (sctx->screen->info.cp_sdma_ge_use_system_memory_scope) { sctx->flags |= SI_CONTEXT_INV_L2; + si_mark_atom_dirty(sctx, &sctx->atoms.s.cache_flush); + } struct gfx11_sh_query_buffer *qbuf = query->first; for (;;) { @@ -393,7 +395,7 @@ static void gfx11_sh_query_get_result_resource(struct si_context *sctx, struct s /* ssbo[2] is either tmp_buffer or resource */ assert(ssbo[2].buffer); - unsigned op_flags = SI_OP_SYNC_PS_BEFORE; + unsigned op_flags = SI_OP_SYNC_BEFORE; unsigned writable_bitmask = (1 << 2) | (ssbo[1].buffer ? 1 << 1 : 0); si_barrier_before_internal_op(sctx, op_flags, 3, ssbo, writable_bitmask, 0, NULL); diff --git a/src/gallium/drivers/radeonsi/si_query.c b/src/gallium/drivers/radeonsi/si_query.c index 300de48966f..36fc3b7338c 100644 --- a/src/gallium/drivers/radeonsi/si_query.c +++ b/src/gallium/drivers/radeonsi/si_query.c @@ -1647,7 +1647,7 @@ static void si_query_hw_get_result_resource(struct si_context *sctx, struct si_q unsigned writable_bitmask = 0x4; - si_barrier_before_internal_op(sctx, 0, 3, ssbo, writable_bitmask, 0, NULL); + si_barrier_before_internal_op(sctx, SI_OP_SYNC_BEFORE, 3, ssbo, writable_bitmask, 0, NULL); si_launch_grid_internal_ssbos(sctx, &grid, sctx->query_result_shader, 0, 3, ssbo, writable_bitmask); si_barrier_after_internal_op(sctx, 0, 3, ssbo, writable_bitmask, 0, NULL);