if (! info->initialized)
return;
+ metrics_collect_available ();
+
if (ctx->timer_begun_id) {
+ glEndQuery (GL_TIME_ELAPSED);
+ glDeleteQueries (1, &ctx->timer_begun_id);
ctx->timer_begun_id = 0;
}
timer;
timer = timer_next)
{
+ glDeleteQueries (1, &timer->id);
timer_next = timer->next;
free (timer);
}
ctx->timer_tail = NULL;
if (ctx->monitor_begun_id) {
+ glEndPerfMonitorAMD (ctx->monitor_begun_id);
+ glDeletePerfMonitorsAMD (1, &ctx->monitor_begun_id);
ctx->monitor_begun_id = 0;
}
monitor;
monitor = monitor_next)
{
+ glDeletePerfMonitorsAMD (1, &monitor->id);
monitor_next = monitor->next;
free (monitor);
}
return 0;
}
+static void
+op_metrics_reset (op_metrics_t *op)
+{
+ context_t *ctx = ¤t_context;
+ metrics_info_t *info = &ctx->metrics_info;
+ unsigned group_index, counter;
+ metrics_group_info_t *group;
+
+ op->time_ns = 0.0;
+
+ for (group_index = 0; group_index < info->num_groups; group_index++) {
+ group = &info->groups[group_index];
+ for (counter = 0; counter < group->num_counters; counter++)
+ {
+ op->counters[group_index][counter] = 0.0;
+ }
+ }
+}
+
+static void
+reset_metrics (void)
+{
+ context_t *ctx = ¤t_context;
+ unsigned i;
+
+ for (i = 0; i < ctx->num_op_metrics; i++) {
+
+ op_metrics_reset (&ctx->op_metrics[i]);
+
+ }
+}
+
static void
print_program_metrics (void)
{
free (sorted);
}
-/* Called at program exit */
+/* Called at program exit.
+ *
+ * This is similar to metrics_info_fini, but only frees any used
+ * memory. Notably, it does not call any OpenGL functions, (since the
+ * OpenGL context no longer exists at program exit).
+ */
static void
metrics_exit (void)
{
+ context_t *ctx = ¤t_context;
+ metrics_info_t *info = &ctx->metrics_info;
+ unsigned i;
+ timer_query_t *timer, *timer_next;
+ monitor_t *monitor, *monitor_next;
+
if (verbose)
printf ("fips: terminating\n");
- metrics_info_fini ();
+ if (! info->initialized)
+ return;
+
+ for (timer = ctx->timer_head;
+ timer;
+ timer = timer_next)
+ {
+ timer_next = timer->next;
+ free (timer);
+ }
+
+ for (monitor = ctx->monitor_head;
+ monitor;
+ monitor = monitor_next)
+ {
+ monitor_next = monitor->next;
+ free (monitor);
+ }
+
+ for (i = 0; i < info->num_groups; i++)
+ metrics_group_info_fini (&info->groups[i]);
+
+ free (info->groups);
+
+ for (i = 0; i < info->num_shader_stages; i++)
+ free (info->stages[i].name);
+
+ free (info->stages);
}
void
print_program_metrics ();
}
+
+ if (frames == 208)
+ reset_metrics ();
}