From 1e2ded21ba8809a762560e44b541608ce059d9f5 Mon Sep 17 00:00:00 2001 From: Dave Airlie Date: Thu, 16 Dec 2021 08:37:03 +1000 Subject: [PATCH] mesa/st: merge perfmon groups init/cleanup from st into mesa MIME-Version: 1.0 Content-Type: text/plain; charset=utf8 Content-Transfer-Encoding: 8bit This moves the init/cleanup code from st into mesa. Acked-by: Marek Olšák Part-of: --- src/mesa/main/performance_monitor.c | 108 ++++++++++++++++++++++++++++++++- src/mesa/main/performance_monitor.h | 3 +- src/mesa/state_tracker/st_cb_perfmon.c | 104 +------------------------------ src/mesa/state_tracker/st_cb_perfmon.h | 1 - 4 files changed, 111 insertions(+), 105 deletions(-) diff --git a/src/mesa/main/performance_monitor.c b/src/mesa/main/performance_monitor.c index edb3c09..7389300 100644 --- a/src/mesa/main/performance_monitor.c +++ b/src/mesa/main/performance_monitor.c @@ -49,6 +49,9 @@ #include "state_tracker/st_cb_perfmon.h" +#include "pipe/p_context.h" +#include "pipe/p_screen.h" + void _mesa_init_performance_monitors(struct gl_context *ctx) { @@ -57,11 +60,112 @@ _mesa_init_performance_monitors(struct gl_context *ctx) ctx->PerfMonitor.Groups = NULL; } +void +_mesa_free_perfomance_monitor_groups(struct gl_context *ctx) +{ + struct gl_perf_monitor_state *perfmon = &ctx->PerfMonitor; + int gid; + + for (gid = 0; gid < perfmon->NumGroups; gid++) { + FREE((void *)perfmon->Groups[gid].Counters); + } + FREE((void *)perfmon->Groups); +} + static inline void init_groups(struct gl_context *ctx) { - if (unlikely(!ctx->PerfMonitor.Groups)) - st_InitPerfMonitorGroups(ctx); + if (likely(ctx->PerfMonitor.Groups)) + return; + + struct gl_perf_monitor_state *perfmon = &ctx->PerfMonitor; + struct pipe_screen *screen = ctx->pipe->screen; + struct gl_perf_monitor_group *groups = NULL; + int num_counters, num_groups; + int gid, cid; + + /* Get the number of available queries. */ + num_counters = screen->get_driver_query_info(screen, 0, NULL); + + /* Get the number of available groups. */ + num_groups = screen->get_driver_query_group_info(screen, 0, NULL); + groups = CALLOC(num_groups, sizeof(*groups)); + if (!groups) + return; + + for (gid = 0; gid < num_groups; gid++) { + struct gl_perf_monitor_group *g = &groups[perfmon->NumGroups]; + struct pipe_driver_query_group_info group_info; + struct gl_perf_monitor_counter *counters = NULL; + + if (!screen->get_driver_query_group_info(screen, gid, &group_info)) + continue; + + g->Name = group_info.name; + g->MaxActiveCounters = group_info.max_active_queries; + + if (group_info.num_queries) + counters = CALLOC(group_info.num_queries, sizeof(*counters)); + if (!counters) + goto fail; + g->Counters = counters; + + for (cid = 0; cid < num_counters; cid++) { + struct gl_perf_monitor_counter *c = &counters[g->NumCounters]; + struct pipe_driver_query_info info; + + if (!screen->get_driver_query_info(screen, cid, &info)) + continue; + if (info.group_id != gid) + continue; + + c->Name = info.name; + switch (info.type) { + case PIPE_DRIVER_QUERY_TYPE_UINT64: + case PIPE_DRIVER_QUERY_TYPE_BYTES: + case PIPE_DRIVER_QUERY_TYPE_MICROSECONDS: + case PIPE_DRIVER_QUERY_TYPE_HZ: + c->Minimum.u64 = 0; + c->Maximum.u64 = info.max_value.u64 ? info.max_value.u64 : UINT64_MAX; + c->Type = GL_UNSIGNED_INT64_AMD; + break; + case PIPE_DRIVER_QUERY_TYPE_UINT: + c->Minimum.u32 = 0; + c->Maximum.u32 = info.max_value.u32 ? info.max_value.u32 : UINT32_MAX; + c->Type = GL_UNSIGNED_INT; + break; + case PIPE_DRIVER_QUERY_TYPE_FLOAT: + c->Minimum.f = 0.0; + c->Maximum.f = info.max_value.f ? info.max_value.f : FLT_MAX; + c->Type = GL_FLOAT; + break; + case PIPE_DRIVER_QUERY_TYPE_PERCENTAGE: + c->Minimum.f = 0.0f; + c->Maximum.f = 100.0f; + c->Type = GL_PERCENTAGE_AMD; + break; + default: + unreachable("Invalid driver query type!"); + } + + c->query_type = info.query_type; + c->flags = info.flags; + if (c->flags & PIPE_DRIVER_QUERY_FLAG_BATCH) + g->has_batch = true; + + g->NumCounters++; + } + perfmon->NumGroups++; + } + perfmon->Groups = groups; + + return; + +fail: + for (gid = 0; gid < num_groups; gid++) { + FREE((void *)groups[gid].Counters); + } + FREE(groups); } static struct gl_perf_monitor_object * diff --git a/src/mesa/main/performance_monitor.h b/src/mesa/main/performance_monitor.h index f005208..30a3448 100644 --- a/src/mesa/main/performance_monitor.h +++ b/src/mesa/main/performance_monitor.h @@ -41,5 +41,6 @@ _mesa_free_performance_monitors(struct gl_context *ctx); unsigned _mesa_perf_monitor_counter_size(const struct gl_perf_monitor_counter *); - +void +_mesa_free_perfomance_monitor_groups(struct gl_context *ctx); #endif diff --git a/src/mesa/state_tracker/st_cb_perfmon.c b/src/mesa/state_tracker/st_cb_perfmon.c index 25b6994..7c18c31 100644 --- a/src/mesa/state_tracker/st_cb_perfmon.c +++ b/src/mesa/state_tracker/st_cb_perfmon.c @@ -37,6 +37,8 @@ #include "pipe/p_screen.h" #include "util/u_memory.h" +#include "main/performance_monitor.h" + static bool init_perf_monitor(struct gl_context *ctx, struct gl_perf_monitor_object *m) { @@ -322,107 +324,7 @@ st_have_perfmon(struct st_context *st) } void -st_InitPerfMonitorGroups(struct gl_context *ctx) -{ - struct st_context *st = st_context(ctx); - struct gl_perf_monitor_state *perfmon = &ctx->PerfMonitor; - struct pipe_screen *screen = st->screen; - struct gl_perf_monitor_group *groups = NULL; - int num_counters, num_groups; - int gid, cid; - - /* Get the number of available queries. */ - num_counters = screen->get_driver_query_info(screen, 0, NULL); - - /* Get the number of available groups. */ - num_groups = screen->get_driver_query_group_info(screen, 0, NULL); - groups = CALLOC(num_groups, sizeof(*groups)); - if (!groups) - return; - - for (gid = 0; gid < num_groups; gid++) { - struct gl_perf_monitor_group *g = &groups[perfmon->NumGroups]; - struct pipe_driver_query_group_info group_info; - struct gl_perf_monitor_counter *counters = NULL; - - if (!screen->get_driver_query_group_info(screen, gid, &group_info)) - continue; - - g->Name = group_info.name; - g->MaxActiveCounters = group_info.max_active_queries; - - if (group_info.num_queries) - counters = CALLOC(group_info.num_queries, sizeof(*counters)); - if (!counters) - goto fail; - g->Counters = counters; - - for (cid = 0; cid < num_counters; cid++) { - struct gl_perf_monitor_counter *c = &counters[g->NumCounters]; - struct pipe_driver_query_info info; - - if (!screen->get_driver_query_info(screen, cid, &info)) - continue; - if (info.group_id != gid) - continue; - - c->Name = info.name; - switch (info.type) { - case PIPE_DRIVER_QUERY_TYPE_UINT64: - case PIPE_DRIVER_QUERY_TYPE_BYTES: - case PIPE_DRIVER_QUERY_TYPE_MICROSECONDS: - case PIPE_DRIVER_QUERY_TYPE_HZ: - c->Minimum.u64 = 0; - c->Maximum.u64 = info.max_value.u64 ? info.max_value.u64 : UINT64_MAX; - c->Type = GL_UNSIGNED_INT64_AMD; - break; - case PIPE_DRIVER_QUERY_TYPE_UINT: - c->Minimum.u32 = 0; - c->Maximum.u32 = info.max_value.u32 ? info.max_value.u32 : UINT32_MAX; - c->Type = GL_UNSIGNED_INT; - break; - case PIPE_DRIVER_QUERY_TYPE_FLOAT: - c->Minimum.f = 0.0; - c->Maximum.f = info.max_value.f ? info.max_value.f : FLT_MAX; - c->Type = GL_FLOAT; - break; - case PIPE_DRIVER_QUERY_TYPE_PERCENTAGE: - c->Minimum.f = 0.0f; - c->Maximum.f = 100.0f; - c->Type = GL_PERCENTAGE_AMD; - break; - default: - unreachable("Invalid driver query type!"); - } - - c->query_type = info.query_type; - c->flags = info.flags; - if (c->flags & PIPE_DRIVER_QUERY_FLAG_BATCH) - g->has_batch = true; - - g->NumCounters++; - } - perfmon->NumGroups++; - } - perfmon->Groups = groups; - - return; - -fail: - for (gid = 0; gid < num_groups; gid++) { - FREE((void *)groups[gid].Counters); - } - FREE(groups); -} - -void st_destroy_perfmon(struct st_context *st) { - struct gl_perf_monitor_state *perfmon = &st->ctx->PerfMonitor; - int gid; - - for (gid = 0; gid < perfmon->NumGroups; gid++) { - FREE((void *)perfmon->Groups[gid].Counters); - } - FREE((void *)perfmon->Groups); + _mesa_free_perfomance_monitor_groups(st->ctx); } diff --git a/src/mesa/state_tracker/st_cb_perfmon.h b/src/mesa/state_tracker/st_cb_perfmon.h index fb6f340..84daa7b 100644 --- a/src/mesa/state_tracker/st_cb_perfmon.h +++ b/src/mesa/state_tracker/st_cb_perfmon.h @@ -43,5 +43,4 @@ void st_GetPerfMonitorResult(struct gl_context *ctx, GLsizei dataSize, GLuint *data, GLint *bytesWritten); -void st_InitPerfMonitorGroups(struct gl_context *ctx); #endif -- 2.7.4