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.
-/* 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);
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 ();
}
metrics_set_current_op (METRICS_OP_SHADER + 0);
metrics_counter_start ();
}
void
context_leave (void)
{
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;
timer_query_t *timer, *timer_next;
monitor_t *monitor, *monitor_next;
+ if (ctx == NULL)
+ return;
+
metrics_collect_available ();
if (ctx->timer_begun_id) {
metrics_collect_available ();
if (ctx->timer_begun_id) {
ctx->monitor_head = NULL;
ctx->monitor_tail = NULL;
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)
{
}
context_t *
context_get_current (void)
{
- return ¤t_context;
+ return current_context;
+ /* Pointer to the system's context ID, (such as a GLXContext) */
+ void *system_id;
+
metrics_info_t metrics_info;
metrics_op_t op;
metrics_info_t metrics_info;
metrics_op_t op;