Module: Mesa Branch: main Commit: 061f64f35156abe6cbf26f990f91fdb66d83516b URL: http://cgit.freedesktop.org/mesa/mesa/commit/?id=061f64f35156abe6cbf26f990f91fdb66d83516b
Author: Pierre-Eric Pelloux-Prayer <[email protected]> Date: Tue Apr 19 13:13:51 2022 +0200 radeonsi/ngg: reuse the pipeline stats buffer when using atomics To support PIPE_STAT_QUERY_GS_INVOCATIONS and PIPE_STAT_QUERY_GS_PRIMITIVES being used at the same time we have to reuse the same buffer. Reviewed-by: Marek Olšák <[email protected]> Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/15861> --- src/gallium/drivers/radeonsi/si_pipe.c | 1 + src/gallium/drivers/radeonsi/si_pipe.h | 2 ++ src/gallium/drivers/radeonsi/si_query.c | 10 +++++++++- 3 files changed, 12 insertions(+), 1 deletion(-) diff --git a/src/gallium/drivers/radeonsi/si_pipe.c b/src/gallium/drivers/radeonsi/si_pipe.c index 0c46ef6b2e0..7eb7d364f80 100644 --- a/src/gallium/drivers/radeonsi/si_pipe.c +++ b/src/gallium/drivers/radeonsi/si_pipe.c @@ -218,6 +218,7 @@ static void si_destroy_context(struct pipe_context *context) si_resource_reference(&sctx->wait_mem_scratch, NULL); si_resource_reference(&sctx->wait_mem_scratch_tmz, NULL); si_resource_reference(&sctx->small_prim_cull_info_buf, NULL); + si_resource_reference(&sctx->pipeline_stats_query_buf, NULL); if (sctx->cs_preamble_state) si_pm4_free_state(sctx, sctx->cs_preamble_state, ~0); diff --git a/src/gallium/drivers/radeonsi/si_pipe.h b/src/gallium/drivers/radeonsi/si_pipe.h index 27fe1fa2ccd..42756da8347 100644 --- a/src/gallium/drivers/radeonsi/si_pipe.h +++ b/src/gallium/drivers/radeonsi/si_pipe.h @@ -1268,6 +1268,8 @@ struct si_context { int num_pipeline_stat_emulated_queries; struct list_head active_queries; unsigned num_cs_dw_queries_suspend; + /* Shared buffer for pipeline stats queries implemented with an atomic op */ + struct si_resource *pipeline_stats_query_buf; /* Render condition. */ struct pipe_query *render_cond; diff --git a/src/gallium/drivers/radeonsi/si_query.c b/src/gallium/drivers/radeonsi/si_query.c index 2ef38a2d503..06f45270dc5 100644 --- a/src/gallium/drivers/radeonsi/si_query.c +++ b/src/gallium/drivers/radeonsi/si_query.c @@ -890,9 +890,17 @@ static void si_query_hw_emit_start(struct si_context *sctx, struct si_query_hw * { uint64_t va; - if (!si_query_buffer_alloc(sctx, &query->buffer, query->ops->prepare_buffer, query->result_size)) + if (!query->buffer.buf && query->flags & SI_QUERY_EMULATE_GS_COUNTERS) + si_resource_reference(&query->buffer.buf, sctx->pipeline_stats_query_buf); + + /* Don't realloc pipeline_stats_query_buf */ + if ((!(query->flags & SI_QUERY_EMULATE_GS_COUNTERS) || !sctx->pipeline_stats_query_buf) && + !si_query_buffer_alloc(sctx, &query->buffer, query->ops->prepare_buffer, query->result_size)) return; + if (query->flags & SI_QUERY_EMULATE_GS_COUNTERS) + si_resource_reference(&sctx->pipeline_stats_query_buf, query->buffer.buf); + si_update_occlusion_query_state(sctx, query->b.type, 1); si_update_prims_generated_query_state(sctx, query->b.type, 1);
