+void
+metrics_fini (metrics_t *metrics)
+{
+ timer_query_t *timer, *timer_next;
+ monitor_t *monitor, *monitor_next;
+
+ /* Discard and cleanup any outstanding queries. */
+ if (metrics->timer_begun_id) {
+ glEndQuery (GL_TIME_ELAPSED);
+ glDeleteQueries (1, &metrics->timer_begun_id);
+ metrics->timer_begun_id = 0;
+ }
+
+ for (timer = metrics->timer_head;
+ timer;
+ timer = timer_next)
+ {
+ glDeleteQueries (1, &timer->id);
+ timer_next = timer->next;
+ free (timer);
+ }
+ metrics->timer_head = NULL;
+ metrics->timer_tail = NULL;
+
+ if (metrics->info->have_perfmon) {
+
+ if (metrics->monitor_begun_id) {
+ glEndPerfMonitorAMD (metrics->monitor_begun_id);
+ glDeletePerfMonitorsAMD (1, &metrics->monitor_begun_id);
+ metrics->monitor_begun_id = 0;
+ }
+
+ for (monitor = metrics->monitor_head;
+ monitor;
+ monitor = monitor_next)
+ {
+ glDeletePerfMonitorsAMD (1, &monitor->id);
+ monitor_next = monitor->next;
+ free (monitor);
+ }
+ metrics->monitor_head = NULL;
+ metrics->monitor_tail = NULL;
+
+ }
+
+ metrics->monitors_in_flight = 0;
+}
+
+void
+metrics_destroy (metrics_t *metrics)
+{
+ metrics_fini (metrics);
+
+ free (metrics);
+}
+
+static const char *
+metrics_op_string (metrics_op_t op)
+{
+ if (op >= METRICS_OP_SHADER)
+ return "Shader program";
+
+ switch (op)
+ {
+ case METRICS_OP_ACCUM:
+ return "glAccum*(+)";
+ case METRICS_OP_BUFFER_DATA:
+ return "glBufferData(+)";
+ case METRICS_OP_BUFFER_SUB_DATA:
+ return "glCopyBufferSubData*";
+ case METRICS_OP_BITMAP:
+ return "glBitmap*";
+ case METRICS_OP_BLIT_FRAMEBUFFER:
+ return "glBlitFramebuffer*";
+ case METRICS_OP_CLEAR:
+ return "glClear(+)";
+ case METRICS_OP_CLEAR_BUFFER_DATA:
+ return "glCearBufferData(+)";
+ case METRICS_OP_CLEAR_TEX_IMAGE:
+ return "glClearTexImage(+)";
+ case METRICS_OP_COPY_PIXELS:
+ return "glCopyPixels";
+ case METRICS_OP_COPY_TEX_IMAGE:
+ return "glCopyTexImage(+)";
+ case METRICS_OP_DRAW_PIXELS:
+ return "glDrawPixels";
+ case METRICS_OP_GET_TEX_IMAGE:
+ return "glGetTexImage(+)";
+ case METRICS_OP_READ_PIXELS:
+ return "glReadPixels*";
+ case METRICS_OP_TEX_IMAGE:
+ return "glTexImage*(+)";
+ default:
+ fprintf (stderr, "fips: Internal error: "
+ "Unknown metrics op value: %d\n", op);