X-Git-Url: https://git.cworth.org/git?p=fips;a=blobdiff_plain;f=context.c;fp=context.c;h=284e4ae8d8e7ce246e37246fc616ad77b6d3713f;hp=f4694c1ae8052152c9d36383e64170ccca2a0832;hb=316481c29241d6ba004f644d4b0d3198b2a2ec3f;hpb=01b9630089d68e7e0e570cf9793c00a8519df973 diff --git a/context.c b/context.c index f4694c1..284e4ae 100644 --- a/context.c +++ b/context.c @@ -20,23 +20,46 @@ */ #include "context.h" - #include "metrics.h" +#include "xmalloc.h" -/* FIXME: Need a map from integers to context objects and track the - * current context with glXMakeContextCurrent, eglMakeCurrent, etc. */ - -context_t current_context; +context_t *current_context; -void -context_enter (fips_api_t api, void *system_context_id unused) +static context_t * +context_create (fips_api_t api, void *system_context_id) { - context_t *ctx = ¤t_context; + context_t *ctx; + + ctx = xcalloc (1, sizeof (*ctx)); + + ctx->system_id = system_context_id; fips_dispatch_init (api); metrics_info_init (&ctx->metrics_info); + return ctx; +} + +static void +context_destroy (context_t *ctx) +{ + metrics_info_fini (&ctx->metrics_info); +} + +void +context_enter (fips_api_t api, void *system_context_id) +{ + /* Do nothing if the application is setting the same context + * as is already current. */ + if (current_context && current_context->system_id == system_context_id) + return; + + if (current_context) + context_destroy (current_context); + + current_context = context_create (api, system_context_id); + metrics_set_current_op (METRICS_OP_SHADER + 0); metrics_counter_start (); } @@ -44,10 +67,13 @@ context_enter (fips_api_t api, void *system_context_id unused) void context_leave (void) { - context_t *ctx = ¤t_context; + context_t *ctx = current_context; timer_query_t *timer, *timer_next; monitor_t *monitor, *monitor_next; + if (ctx == NULL) + return; + metrics_collect_available (); if (ctx->timer_begun_id) { @@ -84,13 +110,11 @@ context_leave (void) ctx->monitor_head = NULL; ctx->monitor_tail = NULL; - current_context.monitors_in_flight = 0; - - metrics_info_fini (&ctx->metrics_info); + ctx->monitors_in_flight = 0; } context_t * context_get_current (void) { - return ¤t_context; + return current_context; }