diff options
-rw-r--r-- | src/mesa/main/dd.h | 1 | ||||
-rw-r--r-- | src/mesa/main/performance_monitor.c | 39 |
2 files changed, 36 insertions, 4 deletions
diff --git a/src/mesa/main/dd.h b/src/mesa/main/dd.h index 496a14f8dad..e5281ce9744 100644 --- a/src/mesa/main/dd.h +++ b/src/mesa/main/dd.h @@ -727,6 +727,7 @@ struct dd_function_table { * \name Performance monitors */ /*@{*/ + void (*InitPerfMonitorGroups)(struct gl_context *ctx); struct gl_perf_monitor_object * (*NewPerfMonitor)(struct gl_context *ctx); void (*DeletePerfMonitor)(struct gl_context *ctx, struct gl_perf_monitor_object *m); diff --git a/src/mesa/main/performance_monitor.c b/src/mesa/main/performance_monitor.c index 2d740daf019..98dfbea083c 100644 --- a/src/mesa/main/performance_monitor.c +++ b/src/mesa/main/performance_monitor.c @@ -53,6 +53,13 @@ _mesa_init_performance_monitors(struct gl_context *ctx) ctx->PerfMonitor.Groups = NULL; } +static inline void +init_groups(struct gl_context *ctx) +{ + if (unlikely(!ctx->PerfMonitor.Groups)) + ctx->Driver.InitPerfMonitorGroups(ctx); +} + static struct gl_perf_monitor_object * new_performance_monitor(struct gl_context *ctx, GLuint index) { @@ -171,6 +178,7 @@ _mesa_GetPerfMonitorGroupsAMD(GLint *numGroups, GLsizei groupsSize, GLuint *groups) { GET_CURRENT_CONTEXT(ctx); + init_groups(ctx); if (numGroups != NULL) *numGroups = ctx->PerfMonitor.NumGroups; @@ -191,7 +199,11 @@ _mesa_GetPerfMonitorCountersAMD(GLuint group, GLint *numCounters, GLsizei countersSize, GLuint *counters) { GET_CURRENT_CONTEXT(ctx); - const struct gl_perf_monitor_group *group_obj = get_group(ctx, group); + const struct gl_perf_monitor_group *group_obj; + + init_groups(ctx); + + group_obj = get_group(ctx, group); if (group_obj == NULL) { _mesa_error(ctx, GL_INVALID_VALUE, "glGetPerfMonitorCountersAMD(invalid group)"); @@ -219,9 +231,11 @@ _mesa_GetPerfMonitorGroupStringAMD(GLuint group, GLsizei bufSize, GLsizei *length, GLchar *groupString) { GET_CURRENT_CONTEXT(ctx); + const struct gl_perf_monitor_group *group_obj; - const struct gl_perf_monitor_group *group_obj = get_group(ctx, group); + init_groups(ctx); + group_obj = get_group(ctx, group); if (group_obj == NULL) { _mesa_error(ctx, GL_INVALID_VALUE, "glGetPerfMonitorGroupStringAMD"); return; @@ -251,6 +265,8 @@ _mesa_GetPerfMonitorCounterStringAMD(GLuint group, GLuint counter, const struct gl_perf_monitor_group *group_obj; const struct gl_perf_monitor_counter *counter_obj; + init_groups(ctx); + group_obj = get_group(ctx, group); if (group_obj == NULL) { @@ -290,6 +306,8 @@ _mesa_GetPerfMonitorCounterInfoAMD(GLuint group, GLuint counter, GLenum pname, const struct gl_perf_monitor_group *group_obj; const struct gl_perf_monitor_counter *counter_obj; + init_groups(ctx); + group_obj = get_group(ctx, group); if (group_obj == NULL) { @@ -353,6 +371,8 @@ _mesa_GenPerfMonitorsAMD(GLsizei n, GLuint *monitors) if (MESA_VERBOSE & VERBOSE_API) _mesa_debug(ctx, "glGenPerfMonitorsAMD(%d)\n", n); + init_groups(ctx); + if (n < 0) { _mesa_error(ctx, GL_INVALID_VALUE, "glGenPerfMonitorsAMD(n < 0)"); return; @@ -673,6 +693,8 @@ _mesa_GetFirstPerfQueryIdINTEL(GLuint *queryId) GET_CURRENT_CONTEXT(ctx); unsigned numGroups; + init_groups(ctx); + /* The GL_INTEL_performance_query spec says: * * "If queryId pointer is equal to 0, INVALID_VALUE error is generated." @@ -705,6 +727,7 @@ extern void GLAPIENTRY _mesa_GetNextPerfQueryIdINTEL(GLuint queryId, GLuint *nextQueryId) { GET_CURRENT_CONTEXT(ctx); + init_groups(ctx); /* The GL_INTEL_performance_query spec says: * @@ -744,6 +767,8 @@ _mesa_GetPerfQueryIdByNameINTEL(char *queryName, GLuint *queryId) GET_CURRENT_CONTEXT(ctx); unsigned i; + init_groups(ctx); + /* The GL_INTEL_performance_query spec says: * * "If queryName does not reference a valid query name, an INVALID_VALUE @@ -783,9 +808,11 @@ _mesa_GetPerfQueryInfoINTEL(GLuint queryId, GET_CURRENT_CONTEXT(ctx); unsigned i; - const struct gl_perf_monitor_group *group_obj = - get_group(ctx, queryid_to_index(queryId)); + const struct gl_perf_monitor_group *group_obj; + init_groups(ctx); + + group_obj = get_group(ctx, queryid_to_index(queryId)); if (group_obj == NULL) { /* The GL_INTEL_performance_query spec says: * @@ -860,6 +887,8 @@ _mesa_GetPerfCounterInfoINTEL(GLuint queryId, GLuint counterId, unsigned counterIndex; unsigned i; + init_groups(ctx); + group_obj = get_group(ctx, queryid_to_index(queryId)); /* The GL_INTEL_performance_query spec says: @@ -979,6 +1008,8 @@ _mesa_CreatePerfQueryINTEL(GLuint queryId, GLuint *queryHandle) struct gl_perf_monitor_object *m; unsigned i; + init_groups(ctx); + /* This is not specified in the extension, but is the only sane thing to * do. */ |