-static void
-metrics_group_info_init (metrics_group_info_t *group, GLuint id)
-{
- GLsizei length;
- unsigned i;
-
- group->id = id;
-
- /* Get name */
- glGetPerfMonitorGroupStringAMD (id, 0, &length, NULL);
-
- group->name = xmalloc (length + 1);
-
- glGetPerfMonitorGroupStringAMD (id, length + 1, NULL, group->name);
-
- /* Get number of counters */
- group->num_counters = 0;
- group->max_active_counters = 0;
- glGetPerfMonitorCountersAMD (group->id,
- (int *) &group->num_counters,
- (int *) &group->max_active_counters,
- 0, NULL);
-
- /* Get counter numbers */
- group->counters = xmalloc (group->num_counters * sizeof (GLuint));
-
- glGetPerfMonitorCountersAMD (group->id, NULL, NULL,
- group->num_counters,
- group->counters);
-
- /* Get counter names */
- group->counter_names = xmalloc (group->num_counters * sizeof (char *));
- group->counter_types = xmalloc (group->num_counters * sizeof (GLuint));
-
- for (i = 0; i < group->num_counters; i++) {
- glGetPerfMonitorCounterInfoAMD (group->id,
- group->counters[i],
- GL_COUNTER_TYPE_AMD,
- &group->counter_types[i]);
-
- /* We assume that all peformance counters are made
- * available as uint32 values. The code calling
- * CONSUME in accumulate_program_metrics will need to
- * be extended to accomodate other counter values. */
- if (group->counter_types[i] != GL_UNSIGNED_INT) {
- fprintf (stderr, "fips: Internal error: No support for non-uint counter values\n");
- exit (1);
- }
-
- glGetPerfMonitorCounterStringAMD (group->id,
- group->counters[i],
- 0, &length, NULL);
-
- group->counter_names[i] = xmalloc (length + 1);
-
- glGetPerfMonitorCounterStringAMD (group->id,
- group->counters[i],
- length + 1, NULL,
- group->counter_names[i]);
- }
-}
-
-static void
-metrics_group_info_fini (metrics_group_info_t *group)
-{
- unsigned i;
-
- for (i = 0; i < group->num_counters; i++)
- free (group->counter_names[i]);
-
- free (group->counter_types);
- free (group->counter_names);
- free (group->counters);
-
- free (group->name);
-}
-
-static void
-metrics_info_fini (metrics_info_t *info);
-
-void
-metrics_info_init (void)
-{
- unsigned i;
- GLuint *group_ids;
- metrics_info_t *metrics_info = ¤t_context.metrics_info;
-
- if (metrics_info->initialized)
- metrics_info_fini (metrics_info);
-
- glGetPerfMonitorGroupsAMD ((int *) &metrics_info->num_groups, 0, NULL);
-
- group_ids = xmalloc (metrics_info->num_groups * sizeof (GLuint));
-
- glGetPerfMonitorGroupsAMD (NULL, metrics_info->num_groups, group_ids);
-
- metrics_info->groups = xmalloc (metrics_info->num_groups * sizeof (metrics_group_info_t));
-
- for (i = 0; i < metrics_info->num_groups; i++)
- metrics_group_info_init (&metrics_info->groups[i], i);
-
- free (group_ids);
-
- metrics_info->initialized = 1;
-}
-
-static void
-metrics_info_fini (metrics_info_t *info)
-{
- unsigned i;
-
- for (i = 0; i < info->num_groups; i++)
- metrics_group_info_fini (&info->groups[i]);
-
- free (info->groups);
-}