Module: Mesa Branch: main Commit: 0f57ffb845b61de8e5ed9f623cec2ef468e83f0c URL: http://cgit.freedesktop.org/mesa/mesa/commit/?id=0f57ffb845b61de8e5ed9f623cec2ef468e83f0c
Author: José Expósito <jexpo...@redhat.com> Date: Tue Dec 5 12:07:24 2023 +0100 zink: add render-passes HUD query Add a driver specific query to display the number of render passes per frame in the Gallium HUD. Suggested in https://gitlab.freedesktop.org/mesa/mesa/-/issues/7327 Signed-off-by: José Expósito <jexpo...@redhat.com> Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/26518> --- src/gallium/drivers/zink/zink_context.c | 4 +++ src/gallium/drivers/zink/zink_query.c | 55 ++++++++++++++++++++++++++++++--- src/gallium/drivers/zink/zink_query.h | 9 ++++++ src/gallium/drivers/zink/zink_screen.c | 2 ++ src/gallium/drivers/zink/zink_types.h | 3 ++ 5 files changed, 68 insertions(+), 5 deletions(-) diff --git a/src/gallium/drivers/zink/zink_context.c b/src/gallium/drivers/zink/zink_context.c index d9b6c0bc8db..df5472448b4 100644 --- a/src/gallium/drivers/zink/zink_context.c +++ b/src/gallium/drivers/zink/zink_context.c @@ -2986,6 +2986,10 @@ zink_batch_rp(struct zink_context *ctx) else clear_buffers = begin_rendering(ctx); assert(!ctx->rp_changed); + + /* update the render-passes HUD query */ + ctx->hud.render_passes++; + if (!in_rp && ctx->batch.in_rp) { /* only hit this for valid swapchain and new renderpass */ if (ctx->render_condition.query) diff --git a/src/gallium/drivers/zink/zink_query.c b/src/gallium/drivers/zink/zink_query.c index c10fb4fd8f4..a02cc05f0c8 100644 --- a/src/gallium/drivers/zink/zink_query.c +++ b/src/gallium/drivers/zink/zink_query.c @@ -12,6 +12,8 @@ #define NUM_QUERIES 500 +#define ZINK_QUERY_RENDER_PASSES (PIPE_QUERY_DRIVER_SPECIFIC + 0) + struct zink_query_pool { struct list_head list; VkQueryType vk_query_type; @@ -86,6 +88,10 @@ struct zink_query { bool predicate_dirty; }; +static const struct pipe_driver_query_info zink_specific_queries[] = { + {"render-passes", ZINK_QUERY_RENDER_PASSES, { 0 }}, +}; + static inline int get_num_starts(struct zink_query *q) { @@ -251,7 +257,8 @@ get_num_queries(struct zink_query *q) static inline unsigned get_num_results(struct zink_query *q) { - if (q->vkqtype == VK_QUERY_TYPE_PRIMITIVES_GENERATED_EXT) + if (q->type < PIPE_QUERY_DRIVER_SPECIFIC && + q->vkqtype == VK_QUERY_TYPE_PRIMITIVES_GENERATED_EXT) return 1; switch (q->type) { case PIPE_QUERY_OCCLUSION_COUNTER: @@ -499,6 +506,10 @@ zink_create_query(struct pipe_context *pctx, query->index = index; query->type = query_type; + + if (query->type >= PIPE_QUERY_DRIVER_SPECIFIC) + return (struct pipe_query *)query; + if (query->type == PIPE_QUERY_GPU_FINISHED || query->type == PIPE_QUERY_TIMESTAMP_DISJOINT) return (struct pipe_query *)query; query->vkqtype = convert_query_type(screen, query_type, &query->precise); @@ -872,7 +883,7 @@ begin_query(struct zink_context *ctx, struct zink_batch *batch, struct zink_quer { VkQueryControlFlags flags = 0; - if (q->type == PIPE_QUERY_TIMESTAMP_DISJOINT) + if (q->type == PIPE_QUERY_TIMESTAMP_DISJOINT || q->type >= PIPE_QUERY_DRIVER_SPECIFIC) return; if (q->type == PIPE_QUERY_PIPELINE_STATISTICS_SINGLE && q->index == PIPE_STAT_QUERY_CS_INVOCATIONS && ctx->batch.in_rp) { @@ -961,7 +972,7 @@ zink_begin_query(struct pipe_context *pctx, /* drop all past results */ reset_qbo(query); - if (query->vkqtype == VK_QUERY_TYPE_OCCLUSION) + if (query->type < PIPE_QUERY_DRIVER_SPECIFIC && query->vkqtype == VK_QUERY_TYPE_OCCLUSION) ctx->occlusion_query_active = true; if (query->type == PIPE_QUERY_PIPELINE_STATISTICS_SINGLE && query->index == PIPE_STAT_QUERY_PS_INVOCATIONS) ctx->fs_query_active = true; @@ -995,7 +1006,7 @@ update_query_id(struct zink_context *ctx, struct zink_query *q) static void end_query(struct zink_context *ctx, struct zink_batch *batch, struct zink_query *q) { - if (q->type == PIPE_QUERY_TIMESTAMP_DISJOINT) + if (q->type == PIPE_QUERY_TIMESTAMP_DISJOINT || q->type >= PIPE_QUERY_DRIVER_SPECIFIC) return; zink_flush_dgc_if_enabled(ctx); @@ -1050,7 +1061,7 @@ zink_end_query(struct pipe_context *pctx, struct zink_query *query = (struct zink_query *)q; struct zink_batch *batch = &ctx->batch; - if (query->type == PIPE_QUERY_TIMESTAMP_DISJOINT) + if (query->type == PIPE_QUERY_TIMESTAMP_DISJOINT || query->type >= PIPE_QUERY_DRIVER_SPECIFIC) return true; if (query->type == PIPE_QUERY_GPU_FINISHED) { @@ -1123,6 +1134,12 @@ zink_get_query_result(struct pipe_context *pctx, return result->b; } + if (query->type == ZINK_QUERY_RENDER_PASSES) { + result->u64 = ctx->hud.render_passes; + ctx->hud.render_passes = 0; + return true; + } + if (query->needs_update) { assert(!ctx->tc || !threaded_query(q)->flushed); update_qbo(ctx, query); @@ -1508,3 +1525,31 @@ zink_context_query_init(struct pipe_context *pctx) pctx->set_active_query_state = zink_set_active_query_state; pctx->render_condition = zink_render_condition; } + +int +zink_get_driver_query_group_info(struct pipe_screen *pscreen, unsigned index, + struct pipe_driver_query_group_info *info) +{ + if (!info) + return 1; + + assert(index == 0); + info->name = "Zink counters"; + info->max_active_queries = ARRAY_SIZE(zink_specific_queries); + info->num_queries = ARRAY_SIZE(zink_specific_queries); + + return 1; +} + +int +zink_get_driver_query_info(struct pipe_screen *pscreen, unsigned index, + struct pipe_driver_query_info *info) +{ + if (!info) + return ARRAY_SIZE(zink_specific_queries); + + assert(index < ARRAY_SIZE(zink_specific_queries)); + *info = zink_specific_queries[index]; + + return 1; +} diff --git a/src/gallium/drivers/zink/zink_query.h b/src/gallium/drivers/zink/zink_query.h index ca346607675..2b96a72c700 100644 --- a/src/gallium/drivers/zink/zink_query.h +++ b/src/gallium/drivers/zink/zink_query.h @@ -62,6 +62,15 @@ void zink_context_destroy_query_pools(struct zink_context *ctx); uint64_t zink_get_timestamp(struct pipe_screen *pscreen); + +int +zink_get_driver_query_group_info(struct pipe_screen *pscreen, unsigned index, + struct pipe_driver_query_group_info *info); + +int +zink_get_driver_query_info(struct pipe_screen *pscreen, unsigned index, + struct pipe_driver_query_info *info); + #ifdef __cplusplus } #endif diff --git a/src/gallium/drivers/zink/zink_screen.c b/src/gallium/drivers/zink/zink_screen.c index 6697d7ab938..dc54be5850d 100644 --- a/src/gallium/drivers/zink/zink_screen.c +++ b/src/gallium/drivers/zink/zink_screen.c @@ -3380,6 +3380,8 @@ zink_internal_create_screen(const struct pipe_screen_config *config, int64_t dev screen->base.finalize_nir = zink_shader_finalize; screen->base.get_disk_shader_cache = zink_get_disk_shader_cache; screen->base.get_sparse_texture_virtual_page_size = zink_get_sparse_texture_virtual_page_size; + screen->base.get_driver_query_group_info = zink_get_driver_query_group_info; + screen->base.get_driver_query_info = zink_get_driver_query_info; if (screen->info.have_EXT_sample_locations) { VkMultisamplePropertiesEXT prop; diff --git a/src/gallium/drivers/zink/zink_types.h b/src/gallium/drivers/zink/zink_types.h index 41eaa21215c..6dd95746a0c 100644 --- a/src/gallium/drivers/zink/zink_types.h +++ b/src/gallium/drivers/zink/zink_types.h @@ -1931,6 +1931,9 @@ struct zink_context { bool inverted; bool active; //this is the internal vk state } render_condition; + struct { + uint64_t render_passes; + } hud; struct { bool valid;