From: Carl Worth Date: Mon, 4 Nov 2013 21:40:32 +0000 (-0800) Subject: context: Avoid doing excessive work if application re-sets the same context X-Git-Url: https://git.cworth.org/git?p=fips;a=commitdiff_plain;h=316481c29241d6ba004f644d4b0d3198b2a2ec3f context: Avoid doing excessive work if application re-sets the same context I've heard rumors that firefox (at least as of some version) had a tendency to call glXMakeCurrent with the current context on every frame. As of this commit, fips will notice the current context being set with MakeCurrent and will do not tear things down and re-create them in this case. --- 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; } diff --git a/context.h b/context.h index 941f4f0..9b83881 100644 --- a/context.h +++ b/context.h @@ -58,6 +58,9 @@ typedef struct op_metrics typedef struct context { + /* Pointer to the system's context ID, (such as a GLXContext) */ + void *system_id; + metrics_info_t metrics_info; metrics_op_t op;