+static void
+print_op_metrics (context_t *ctx, op_metrics_t *metric, double total)
+{
+ metrics_info_t *info = &ctx->metrics_info;
+ metrics_group_info_t *group;
+ const char *op_string;
+ unsigned i, group_id, counter;
+ double value;
+
+ /* Since we sparsely fill the array based on program
+ * id, many "programs" have no time.
+ */
+ if (metric->time_ns == 0.0)
+ return;
+
+ op_string = metrics_op_string (metric->op);
+
+ printf ("%s", op_string);
+ if (metric->op >= METRICS_OP_SHADER) {
+ printf (" %d:", metric->op - METRICS_OP_SHADER);
+ } else {
+ printf (":");
+ for (i = strlen (op_string); i < 20; i++)
+ printf (" ");
+ }
+
+ printf ("\t%7.2f ms (% 2.1f%%)",
+ metric->time_ns / 1e6,
+ metric->time_ns / total * 100);
+
+ printf ("[");
+ for (group_id = 0; group_id < info->num_groups; group_id++) {
+ group = &info->groups[group_id];
+ for (counter = 0; counter < group->num_counters; counter++) {
+ value = metric->counters[group_id][counter];
+ if (value == 0.0)
+ continue;
+ printf ("%s: %.2f ", group->counter_names[counter],
+ value / 1e6);
+ }
+ }
+ printf ("]\n");
+}
+