diff options
-rw-r--r-- | src/glamor.h | 1 | ||||
-rw-r--r-- | src/glamor_egl.c | 39 | ||||
-rw-r--r-- | src/glamor_utils.h | 3 |
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 |