]> git.cworth.org Git - fips/commitdiff
Hide the metrics_t data structure in metrics.c
authorCarl Worth <cworth@cworth.org>
Mon, 4 Nov 2013 22:17:07 +0000 (14:17 -0800)
committerCarl Worth <cworth@cworth.org>
Mon, 4 Nov 2013 22:17:07 +0000 (14:17 -0800)
Previously, this structure was exposed in metrics.h, which was
obviously not very clean. With this structure now private to
metrics.c, the code should be easier to both read and maintain.

context.c
context.h
metrics.c
metrics.h

index 9e4979fd1b6191e98d8d50f5a89f1ca37783b640..892c696d8db49891d5438c64cbf4ea5a220d9b19 100644 (file)
--- a/context.c
+++ b/context.c
@@ -37,7 +37,7 @@ context_create (fips_api_t api, void *system_context_id)
        fips_dispatch_init (api);
 
        metrics_info_init (&ctx->metrics_info);
-       metrics_init (&ctx->metrics);
+       ctx->metrics = metrics_create ();
 
        return ctx;
 }
@@ -73,7 +73,7 @@ context_leave (void)
        if (ctx == NULL)
                return;
 
-       metrics_fini (&ctx->metrics);
+       metrics_destroy (ctx->metrics);
 }
 
 context_t *
index 6ad357fd724aa958f9f6caf8e165ef796bf253fc..1fddf2e93e289d825b56ad157322563302e7e811 100644 (file)
--- a/context.h
+++ b/context.h
@@ -33,7 +33,7 @@ typedef struct context
        void *system_id;
 
        metrics_info_t metrics_info;
-       metrics_t metrics;
+       metrics_t *metrics;
 } context_t;
 
 /* Indicate that a new context has come into use.
index 3f7f484131ef5d60e45a61545281ba1944772150..fdd794a726863bba4a4b756d81be9d95e82b10d1 100644 (file)
--- a/metrics.c
+++ b/metrics.c
@@ -38,6 +38,63 @@ int verbose;
 
 #define MAX_MONITORS_IN_FLIGHT 1000
 
+/* Timer query */
+typedef struct timer_query
+{
+       unsigned id;
+
+       metrics_op_t op;
+       struct timer_query *next;
+} timer_query_t;
+
+/* Performance-monitor query */
+typedef struct monitor
+{
+       unsigned id;
+
+       metrics_op_t op;
+       struct monitor *next;
+} monitor_t;
+
+typedef struct op_metrics
+{
+       /* This happens to also be the index into the
+        * ctx->op_metrics array currently
+        */
+       metrics_op_t op;
+       double time_ns;
+
+       double **counters;
+} op_metrics_t;
+
+struct metrics
+{
+       metrics_op_t op;
+
+       /* GL_TIME_ELAPSED query for which glEndQuery has not yet
+        * been called. */
+       unsigned timer_begun_id;
+
+       /* GL_TIME_ELAPSED queries for which glEndQuery has been
+        * called, (but results have not yet been queried). */
+       timer_query_t *timer_head;
+       timer_query_t *timer_tail;
+
+       /* Performance monitor for which glEndPerfMonitorAMD has not
+        * yet been called. */
+       unsigned monitor_begun_id;
+
+       /* Performance monitors for which glEndPerfMonitorAMD has
+        * been called, (but results have not yet been queried). */
+       monitor_t *monitor_head;
+       monitor_t *monitor_tail;
+
+       int monitors_in_flight;
+
+       unsigned num_op_metrics;
+       op_metrics_t *op_metrics;
+};
+
 static const char *
 metrics_op_string (metrics_op_t op)
 {
@@ -87,7 +144,7 @@ void
 metrics_counter_start (void)
 {
        context_t *ctx = context_get_current ();
-       metrics_t *metrics = &ctx->metrics;
+       metrics_t *metrics = ctx->metrics;
        unsigned i;
 
        /* Initialize the timer_query and monitor objects */
@@ -128,7 +185,7 @@ void
 metrics_counter_stop (void)
 {
        context_t *ctx = context_get_current ();
-       metrics_t *metrics = &ctx->metrics;
+       metrics_t *metrics = ctx->metrics;
        timer_query_t *timer;
        monitor_t *monitor;
 
@@ -182,7 +239,7 @@ void
 metrics_set_current_op (metrics_op_t op)
 {
        context_t *ctx = context_get_current ();
-       metrics_t *metrics = &ctx->metrics;
+       metrics_t *metrics = ctx->metrics;
 
        metrics->op = op;
 }
@@ -191,7 +248,7 @@ metrics_op_t
 metrics_get_current_op (void)
 {
        context_t *ctx = context_get_current ();
-       metrics_t *metrics = &ctx->metrics;
+       metrics_t *metrics = ctx->metrics;
 
        return metrics->op;
 }
@@ -218,7 +275,7 @@ op_metrics_init (context_t *ctx, op_metrics_t *metrics, metrics_op_t op)
 static op_metrics_t *
 ctx_get_op_metrics (context_t *ctx, metrics_op_t op)
 {
-       metrics_t *metrics = &ctx->metrics;
+       metrics_t *metrics = ctx->metrics;
        unsigned i;
 
        if (op >= metrics->num_op_metrics)
@@ -439,7 +496,7 @@ static void
 print_program_metrics (void)
 {
        context_t *ctx = context_get_current ();
-       metrics_t *metrics = &ctx->metrics;
+       metrics_t *metrics = ctx->metrics;
        metrics_info_t *info = &ctx->metrics_info;
        unsigned num_shader_stages = info->num_shader_stages;
        per_stage_metrics_t *sorted, *per_stage;
@@ -542,7 +599,7 @@ static void
 metrics_exit (void)
 {
        context_t *ctx = context_get_current ();
-       metrics_t *metrics = &ctx->metrics;
+       metrics_t *metrics = ctx->metrics;
        metrics_info_t *info = &ctx->metrics_info;
        unsigned i, j;
        timer_query_t *timer, *timer_next;
@@ -595,7 +652,7 @@ void
 metrics_collect_available (void)
 {
        context_t *ctx = context_get_current ();
-       metrics_t *metrics = &ctx->metrics;
+       metrics_t *metrics = ctx->metrics;
 
        /* Consume all timer queries that are ready. */
        timer_query_t *timer = metrics->timer_head;
@@ -700,9 +757,13 @@ metrics_end_frame (void)
        }
 }
 
-void
-metrics_init (metrics_t *metrics)
+metrics_t *
+metrics_create (void)
 {
+       metrics_t *metrics;
+
+       metrics = xmalloc (sizeof (metrics_t));
+
        metrics->op = 0;
 
        metrics->timer_begun_id = 0;
@@ -719,6 +780,8 @@ metrics_init (metrics_t *metrics)
 
        metrics->num_op_metrics = 0;
        metrics->op_metrics = NULL;
+
+       return metrics;
 }
 
 void
@@ -727,12 +790,7 @@ metrics_fini (metrics_t *metrics)
        timer_query_t *timer, *timer_next;
        monitor_t *monitor, *monitor_next;
 
-       /* Since these metrics are going away, let's first collect
-        * whatever results might already be available. */
-       metrics_collect_available ();
-
-       /* If, after collection, any queries are still outstanding,
-        * just give up and clean them up. */
+       /* Discard and cleanup any outstanding queries. */
        if (metrics->timer_begun_id) {
                glEndQuery (GL_TIME_ELAPSED);
                glDeleteQueries (1, &metrics->timer_begun_id);
@@ -768,5 +826,12 @@ metrics_fini (metrics_t *metrics)
        metrics->monitor_tail = NULL;
 
        metrics->monitors_in_flight = 0;
+}
+
+void
+metrics_destroy (metrics_t *metrics)
+{
+       metrics_fini (metrics);
 
+       free (metrics);
 }
index 26de580d517066856133971fb5ac7641fb7559be..7baa9cb5aeb25cc460c29ec7b782f5d2bf96f4b4 100644 (file)
--- a/metrics.h
+++ b/metrics.h
@@ -50,70 +50,27 @@ typedef enum
        METRICS_OP_SHADER
 } metrics_op_t;
 
-/* Timer query */
-typedef struct timer_query
-{
-       unsigned id;
-
-       metrics_op_t op;
-       struct timer_query *next;
-} timer_query_t;
-
-/* Performance-monitor query */
-typedef struct monitor
-{
-       unsigned id;
-
-       metrics_op_t op;
-       struct monitor *next;
-} monitor_t;
-
-typedef struct op_metrics
-{
-       /* This happens to also be the index into the
-        * ctx->op_metrics array currently
-        */
-       metrics_op_t op;
-       double time_ns;
-
-       double **counters;
-} op_metrics_t;
-
-typedef struct metrics
-{
-       metrics_op_t op;
+typedef struct metrics metrics_t;
 
-       /* GL_TIME_ELAPSED query for which glEndQuery has not yet
-        * been called. */
-       unsigned timer_begun_id;
+/* Create a new metrics_t object for tracking metrics. */
+metrics_t *
+metrics_create (void);
 
-       /* GL_TIME_ELAPSED queries for which glEndQuery has been
-        * called, (but results have not yet been queried). */
-       timer_query_t *timer_head;
-       timer_query_t *timer_tail;
-
-       /* Performance monitor for which glEndPerfMonitorAMD has not
-        * yet been called. */
-       unsigned monitor_begun_id;
-
-       /* Performance monitors for which glEndPerfMonitorAMD has
-        * been called, (but results have not yet been queried). */
-       monitor_t *monitor_head;
-       monitor_t *monitor_tail;
-
-       int monitors_in_flight;
-
-       unsigned num_op_metrics;
-       op_metrics_t *op_metrics;
-} metrics_t;
-
-/* Initialize a metrics_t object for tracking metrics. */
+/* Free all internal resources of a metrics_t
+ *
+ * All outstanding metrics counters are discarded.
+ *
+ * The metrics_t object remains valid and may be used again.
+ */
 void
-metrics_init (metrics_t *metrics);
+metrics_fini (metrics_t *metrics);
 
-/* Cleanup a metrics_t object that's no longer needed. */
+/* Destroy a metrics_t object.
+ *
+ * After this call, the metrics_t* value is and must not be used
+ * further. */
 void
-metrics_fini (metrics_t *metrics);
+metrics_destroy (metrics_t *metrics);
 
 /* Start accumulating GPU time.
  *