typedef struct metrics_info
{
+ int initialized;
+
unsigned num_groups;
metrics_group_info_t *groups;
} metrics_info_t;
}
}
+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)
{
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));
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);
}
static const char *
{
if (verbose)
printf ("fips: terminating\n");
+
+ metrics_info_fini (¤t_context.metrics_info);
}