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);
 

Reply via email to