diff --git a/src/cairo-egl-context.c b/src/cairo-egl-context.c index b24bc808c..0e9fd7191 100644 --- a/src/cairo-egl-context.c +++ b/src/cairo-egl-context.c @@ -80,6 +80,8 @@ static void _egl_release (void *abstract_ctx) { cairo_egl_context_t *ctx = abstract_ctx; + if (!ctx->base.thread_aware) + return; eglMakeCurrent (ctx->display, EGL_NO_SURFACE, EGL_NO_SURFACE, EGL_NO_CONTEXT); diff --git a/src/cairo-gl-device.c b/src/cairo-gl-device.c index 6abee1ccc..9cb0c2157 100644 --- a/src/cairo-gl-device.c +++ b/src/cairo-gl-device.c @@ -185,6 +185,8 @@ _cairo_gl_context_init (cairo_gl_context_t *ctx) ctx->compositor = _cairo_gl_span_compositor_get (); + ctx->thread_aware = TRUE; + memset (ctx->glyph_cache, 0, sizeof (ctx->glyph_cache)); cairo_list_init (&ctx->fonts); @@ -703,3 +705,14 @@ _cairo_gl_context_set_destination (cairo_gl_context_t *ctx, _gl_identity_ortho (ctx->modelviewprojection_matrix, 0, surface->width, surface->height, 0); } + +void +cairo_gl_device_set_thread_aware (cairo_device_t *device, + cairo_bool_t thread_aware) +{ + if (device->backend->type != CAIRO_DEVICE_TYPE_GL) { + _cairo_error_throw (CAIRO_STATUS_DEVICE_TYPE_MISMATCH); + return; + } + ((cairo_gl_context_t *) device)->thread_aware = thread_aware; +} diff --git a/src/cairo-gl-private.h b/src/cairo-gl-private.h index 48087eca2..d6b0554cc 100644 --- a/src/cairo-gl-private.h +++ b/src/cairo-gl-private.h @@ -349,6 +349,8 @@ struct _cairo_gl_context { cairo_bool_t has_packed_depth_stencil; cairo_bool_t has_npot_repeat; + cairo_bool_t thread_aware; + void (*acquire) (void *ctx); void (*release) (void *ctx); diff --git a/src/cairo-gl.h b/src/cairo-gl.h index dd17be630..cec317305 100644 --- a/src/cairo-gl.h +++ b/src/cairo-gl.h @@ -88,6 +88,10 @@ cairo_gl_surface_get_height (cairo_surface_t *abstract_surface); cairo_public void cairo_gl_surface_swapbuffers (cairo_surface_t *surface); +cairo_public void +cairo_gl_device_set_thread_aware (cairo_device_t *device, + cairo_bool_t thread_aware); + #if CAIRO_HAS_GLX_FUNCTIONS #include diff --git a/src/cairo-glx-context.c b/src/cairo-glx-context.c index 512bee8da..47634f191 100644 --- a/src/cairo-glx-context.c +++ b/src/cairo-glx-context.c @@ -94,9 +94,10 @@ _glx_release (void *abstract_ctx) { cairo_glx_context_t *ctx = abstract_ctx; - if (!ctx->has_multithread_makecurrent) { - glXMakeCurrent (ctx->display, None, None); - } + if (ctx->has_multithread_makecurrent || !ctx->base.thread_aware) + return; + + glXMakeCurrent (ctx->display, None, None); } static void