summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--src/glamor.h1
-rw-r--r--src/glamor_egl.c39
-rw-r--r--src/glamor_utils.h3
3 files changed, 26 insertions, 17 deletions
diff --git a/src/glamor.h b/src/glamor.h
index 0509523..59183d3 100644
--- a/src/glamor.h
+++ b/src/glamor.h
@@ -152,6 +152,7 @@ extern _X_EXPORT PixmapPtr glamor_create_pixmap(ScreenPtr screen, int w, int h,
extern _X_EXPORT void glamor_egl_screen_init(ScreenPtr screen);
extern _X_EXPORT void glamor_egl_make_current(ScreenPtr screen);
+extern _X_EXPORT void glamor_egl_make_foreign_current(ScreenPtr screen, void *ctx);
extern _X_EXPORT void glamor_egl_restore_context(ScreenPtr screen);
/* @glamor_egl_exchange_buffers: Exchange the underlying buffers(KHR image,fbo).
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;
}
diff --git a/src/glamor_utils.h b/src/glamor_utils.h
index 263e3ba..c6af8c0 100644
--- a/src/glamor_utils.h
+++ b/src/glamor_utils.h
@@ -1798,7 +1798,6 @@ static inline void glamor_make_current(ScreenPtr screen)
static inline void glamor_restore_current(ScreenPtr screen)
{
- glamor_egl_restore_context(screen);
}
static inline glamor_gl_dispatch *
@@ -1813,8 +1812,6 @@ glamor_get_dispatch(glamor_screen_private *glamor_priv)
static inline void
glamor_put_dispatch(glamor_screen_private *glamor_priv)
{
- if (glamor_priv->flags & GLAMOR_USE_EGL_SCREEN)
- glamor_restore_current(glamor_priv->screen);
}
#endif