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 <marek.olsak@amd.com> Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/14327>
This commit is contained in:
@@ -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 *
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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);
|
||||
}
|
||||
|
||||
@@ -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
|
||||
|
||||
Reference in New Issue
Block a user