Module: Mesa
Branch: main
Commit: 1e2ded21ba8809a762560e44b541608ce059d9f5
URL:    
http://cgit.freedesktop.org/mesa/mesa/commit/?id=1e2ded21ba8809a762560e44b541608ce059d9f5

Author: Dave Airlie <[email protected]>
Date:   Thu Dec 16 08:37:03 2021 +1000

mesa/st: merge perfmon groups init/cleanup from st into mesa

This moves the init/cleanup code from st into mesa.

Acked-by: Marek Olšák <[email protected]>
Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/14327>

---

 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 edb3c0982f3..73893005b2d 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 f005208d17f..30a34480179 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 25b69945d5c..7c18c319f40 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)
 {
@@ -321,108 +323,8 @@ st_have_perfmon(struct st_context *st)
    return screen->get_driver_query_group_info(screen, 0, NULL) != 0;
 }
 
-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 fb6f340f02a..84daa7b0335 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

Reply via email to