GL_COUNTER_TYPE_AMD,
&group->counter_types[i]);
- /* We assume that all peformance counters are made
- * available as uint32 values. The code calling
- * CONSUME in accumulate_program_metrics will need to
- * be extended to accomodate other counter values. */
- if (group->counter_types[i] != GL_UNSIGNED_INT) {
- fprintf (stderr, "fips: Internal error: No support for non-uint counter values\n");
- exit (1);
- }
-
glGetPerfMonitorCounterStringAMD (group->id,
group->counter_ids[i],
0, &length, NULL);
free (group->name);
}
-static void
-metrics_info_fini (metrics_info_t *info);
-
/* A helper function, part of metrics_info_init below. */
typedef enum {
GLuint *group_ids;
metrics_info_t *info = ¤t_context.metrics_info;
- if (info->initialized)
- metrics_info_fini (info);
-
glGetPerfMonitorGroupsAMD ((int *) &info->num_groups, 0, NULL);
group_ids = xmalloc (info->num_groups * sizeof (GLuint));
info->initialized = 1;
}
-static void
-metrics_info_fini (metrics_info_t *info)
+void
+metrics_info_fini (void)
{
+ metrics_info_t *info = ¤t_context.metrics_info;
unsigned i;
+ timer_query_t *timer, *timer_next;
+ monitor_t *monitor, *monitor_next;
+
+ if (! info->initialized)
+ return;
+
+ for (timer = current_context.timer_head;
+ timer;
+ timer = timer_next)
+ {
+ timer_next = timer->next;
+ free (timer);
+ }
+ current_context.timer_head = NULL;
+ current_context.timer_tail = NULL;
+
+ for (monitor = current_context.monitor_head;
+ monitor;
+ monitor = monitor_next)
+ {
+ monitor_next = monitor->next;
+ free (monitor);
+ }
+ current_context.monitor_head = NULL;
+ current_context.monitor_tail = NULL;
for (i = 0; i < info->num_groups; i++)
metrics_group_info_fini (&info->groups[i]);
free (info->groups);
+ info->groups = NULL;
for (i = 0; i < info->num_shader_stages; i++)
free (info->stages[i].name);
free (info->stages);
+ info->stages = NULL;
+
+ info->initialized = 0;
}
static const char *
context_t *ctx = ¤t_context;
metrics_info_t *info = &ctx->metrics_info;
+ op_metrics_t *metrics = ctx_get_op_metrics (ctx, op);
unsigned char *p = (unsigned char *) result;
while (p < ((unsigned char *) result) + size)
GLuint group_id, group_index;
GLuint counter_id, counter_index;
metrics_group_info_t *group;
- uint32_t value;
+ double value;
unsigned i;
CONSUME (group_id);
CONSUME (counter_id);
- CONSUME (value);
for (i = 0; i < info->num_groups; i++) {
- if (info->groups[i].id == i)
+ if (info->groups[i].id == group_id)
break;
}
group_index = i;
counter_index = i;
assert (counter_index < group->num_counters);
- ctx->op_metrics[op].counters[group_index][counter_index] += value;
+ switch (group->counter_types[counter_index])
+ {
+ uint uint_value;
+ uint64_t uint64_value;
+ float float_value;
+ case GL_UNSIGNED_INT:
+ CONSUME (uint_value);
+ value = uint_value;
+ break;
+ case GL_UNSIGNED_INT64_AMD:
+ CONSUME (uint64_value);
+ value = uint64_value;
+ break;
+ case GL_PERCENTAGE_AMD:
+ case GL_FLOAT:
+ CONSUME (float_value);
+ value = float_value;
+ break;
+ default:
+ fprintf (stderr, "fips: Warning: Unknown counter value type (%d)\n",
+ group->counter_types[counter_index]);
+ value = 0.0;
+ break;
+ }
+
+ metrics->counters[group_index][counter_index] += value;
}
}
if (verbose)
printf ("fips: terminating\n");
- metrics_info_fini (¤t_context.metrics_info);
+ metrics_info_fini ();
}