]> git.cworth.org Git - fips/blobdiff - metrics.c
Cleanup outstanding counters at context change.
[fips] / metrics.c
index d9dd3a0b3faef6ff600f6a6a487c9f639def47ec..c24ae3f27d298cfb7c5a692ef855ebd168534c78 100644 (file)
--- a/metrics.c
+++ b/metrics.c
@@ -163,15 +163,6 @@ metrics_group_info_init (metrics_group_info_t *group, GLuint id)
                                                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);
@@ -200,9 +191,6 @@ metrics_group_info_fini (metrics_group_info_t *group)
        free (group->name);
 }
 
-static void
-metrics_info_fini (metrics_info_t *info);
-
 /* A helper function, part of metrics_info_init below. */
 
 typedef enum {
@@ -274,9 +262,6 @@ metrics_info_init (void)
        GLuint *group_ids;
        metrics_info_t *info = &current_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));
@@ -315,20 +300,50 @@ metrics_info_init (void)
        info->initialized = 1;
 }
 
-static void
-metrics_info_fini (metrics_info_t *info)
+void
+metrics_info_fini (void)
 {
+       metrics_info_t *info = &current_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 *
@@ -524,12 +539,11 @@ accumulate_program_metrics (metrics_op_t op, GLuint *result, GLuint 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 == group_id)
@@ -546,6 +560,31 @@ accumulate_program_metrics (metrics_op_t op, GLuint *result, GLuint size)
                counter_index = i;
                assert (counter_index < group->num_counters);
 
+               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;
+               }
+
                ctx->op_metrics[op].counters[group_index][counter_index] += value;
        }
 }
@@ -761,7 +800,7 @@ metrics_exit (void)
        if (verbose)
                printf ("fips: terminating\n");
 
-       metrics_info_fini (&current_context.metrics_info);
+       metrics_info_fini ();
 }