X-Git-Url: https://git.libre-soc.org/?a=blobdiff_plain;ds=sidebyside;f=src%2Fmesa%2Fstate_tracker%2Fst_cb_perfmon.c;h=23d32dcad4722b722839ae1d847f2154517b29b2;hb=0a4378ce562dbf68b7b58165f2dcfc94f831559f;hp=8fdf0e8497fab34f5122ab497c33f75aeff922e5;hpb=179fc4aae8f782453f0488e8dd508f9a01117376;p=mesa.git diff --git a/src/mesa/state_tracker/st_cb_perfmon.c b/src/mesa/state_tracker/st_cb_perfmon.c index 8fdf0e8497f..23d32dcad47 100644 --- a/src/mesa/state_tracker/st_cb_perfmon.c +++ b/src/mesa/state_tracker/st_cb_perfmon.c @@ -308,16 +308,16 @@ st_GetPerfMonitorResult(struct gl_context *ctx, data[offset++] = cid; switch (type) { case GL_UNSIGNED_INT64_AMD: - *(uint64_t *)&data[offset] = result.u64; + memcpy(&data[offset], &result.u64, sizeof(uint64_t)); offset += sizeof(uint64_t) / sizeof(GLuint); break; case GL_UNSIGNED_INT: - *(uint32_t *)&data[offset] = result.u32; + memcpy(&data[offset], &result.u32, sizeof(uint32_t)); offset += sizeof(uint32_t) / sizeof(GLuint); break; case GL_FLOAT: case GL_PERCENTAGE_AMD: - *(GLfloat *)&data[offset] = result.f; + memcpy(&data[offset], &result.f, sizeof(GLfloat)); offset += sizeof(GLfloat) / sizeof(GLuint); break; } @@ -329,8 +329,20 @@ st_GetPerfMonitorResult(struct gl_context *ctx, bool -st_init_perfmon(struct st_context *st) +st_have_perfmon(struct st_context *st) { + struct pipe_screen *screen = st->pipe->screen; + + if (!screen->get_driver_query_info || !screen->get_driver_query_group_info) + return false; + + return screen->get_driver_query_group_info(screen, 0, NULL) != 0; +} + +static void +st_InitPerfMonitorGroups(struct gl_context *ctx) +{ + struct st_context *st = st_context(ctx); struct gl_perf_monitor_state *perfmon = &st->ctx->PerfMonitor; struct pipe_screen *screen = st->pipe->screen; struct gl_perf_monitor_group *groups = NULL; @@ -338,20 +350,14 @@ st_init_perfmon(struct st_context *st) int num_counters, num_groups; int gid, cid; - if (!screen->get_driver_query_info || !screen->get_driver_query_group_info) - return false; - /* Get the number of available queries. */ num_counters = screen->get_driver_query_info(screen, 0, NULL); - if (!num_counters) - return false; /* Get the number of available groups. */ num_groups = screen->get_driver_query_group_info(screen, 0, NULL); - if (num_groups) - groups = CALLOC(num_groups, sizeof(*groups)); + groups = CALLOC(num_groups, sizeof(*groups)); if (!groups) - return false; + return; stgroups = CALLOC(num_groups, sizeof(*stgroups)); if (!stgroups) @@ -432,7 +438,7 @@ st_init_perfmon(struct st_context *st) perfmon->Groups = groups; st->perfmon = stgroups; - return true; + return; fail: for (gid = 0; gid < num_groups; gid++) { @@ -442,7 +448,6 @@ fail: FREE(stgroups); fail_only_groups: FREE(groups); - return false; } void @@ -461,6 +466,7 @@ st_destroy_perfmon(struct st_context *st) void st_init_perfmon_functions(struct dd_function_table *functions) { + functions->InitPerfMonitorGroups = st_InitPerfMonitorGroups; functions->NewPerfMonitor = st_NewPerfMonitor; functions->DeletePerfMonitor = st_DeletePerfMonitor; functions->BeginPerfMonitor = st_BeginPerfMonitor;