summaryrefslogtreecommitdiff
path: root/src/glamor_egl.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/glamor_egl.c')
-rw-r--r--src/glamor_egl.c39
1 files changed, 25 insertions, 14 deletions
diff --git a/src/glamor_egl.c b/src/glamor_egl.c
index 6883b59..61589bb 100644
--- a/src/glamor_egl.c
+++ b/src/glamor_egl.c
@@ -74,9 +74,15 @@ glamor_identify(int flags)
glamor_name);
}
+/*
+ * We're currently assuming that the glamor2d and glamor3d contexts are all in
+ * the same thread.
+ */
+static EGLContext global_current_context;
+
struct glamor_egl_screen_private {
EGLDisplay display;
- EGLContext context;
+ EGLContext context; /* glamor's own context */
EGLint major, minor;
CreateScreenResourcesProcPtr CreateScreenResources;
@@ -114,35 +120,41 @@ glamor_egl_get_display(ScreenPtr screen)
return glamor_egl_get_screen_private(xf86ScreenToScrn(screen))->display;
}
-_X_EXPORT void
-glamor_egl_make_current(ScreenPtr screen)
+static void
+glamor_do_make_current(ScreenPtr screen, EGLContext ctx)
{
ScrnInfoPtr scrn = xf86ScreenToScrn(screen);
struct glamor_egl_screen_private *glamor_egl =
glamor_egl_get_screen_private(scrn);
- if (glamor_egl->gl_context_depth++)
- return;
-
- if (glamor_egl->context != eglGetCurrentContext()) {
- eglMakeCurrent(glamor_egl->display, EGL_NO_SURFACE,
- EGL_NO_SURFACE, EGL_NO_CONTEXT);
+ if (ctx != global_current_context) {
if (!eglMakeCurrent(glamor_egl->display,
- EGL_NO_SURFACE, EGL_NO_SURFACE,
- glamor_egl->context)) {
+ EGL_NO_SURFACE, EGL_NO_SURFACE, ctx)) {
FatalError("Failed to make EGL context current\n");
}
+ global_current_context = ctx;
}
}
_X_EXPORT void
-glamor_egl_restore_context(ScreenPtr screen)
+glamor_egl_make_current(ScreenPtr screen)
{
ScrnInfoPtr scrn = xf86ScreenToScrn(screen);
struct glamor_egl_screen_private *glamor_egl =
glamor_egl_get_screen_private(scrn);
- --glamor_egl->gl_context_depth;
+ glamor_do_make_current(screen, glamor_egl->context);
+}
+
+_X_EXPORT void
+glamor_egl_make_foreign_current(ScreenPtr screen, void *ctx)
+{
+ glamor_do_make_current(screen, ctx);
+}
+
+_X_EXPORT void
+glamor_egl_restore_context(ScreenPtr screen)
+{
}
static EGLImageKHR
@@ -301,7 +313,6 @@ glamor_egl_create_textured_pixmap(PixmapPtr pixmap, int handle, int stride)
ret = TRUE;
done:
- glamor_egl_restore_context(screen);
return ret;
}