+ 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);
+ exit (1);
+ }
+
+ return "";
+}
+
+void
+metrics_counter_start (metrics_t *metrics)
+{
+ unsigned i;
+
+ /* Initialize the timer_query and monitor objects */
+ glGenQueries (1, &metrics->timer_begun_id);
+
+ glGenPerfMonitorsAMD (1, &metrics->monitor_begun_id);
+
+ for (i = 0; i < metrics->info->num_groups; i++)
+ {
+ metrics_group_info_t *group;
+ int num_counters;
+
+ group = &metrics->info->groups[i];
+
+ num_counters = group->num_counters;
+ if (group->max_active_counters < group->num_counters)
+ {
+ fprintf (stderr, "Warning: Only monitoring %d/%d counters from group %d\n",
+ group->max_active_counters,
+ group->num_counters, i);
+ num_counters = group->max_active_counters;
+
+ }
+
+ glSelectPerfMonitorCountersAMD(metrics->monitor_begun_id,
+ GL_TRUE, group->id,
+ num_counters,
+ group->counter_ids);
+ }
+
+ /* Start the queries */
+ glBeginQuery (GL_TIME_ELAPSED, metrics->timer_begun_id);
+
+ glBeginPerfMonitorAMD (metrics->monitor_begun_id);