From 8ace01a4b92e7c2a820b98bdacbe73a7e5a0d60b Mon Sep 17 00:00:00 2001 From: Adam Jackson Date: Fri, 26 Jul 2013 14:35:55 -0400 Subject: Rework current context tracking Since xserver's GLX is now hosted on real GL, we need to unify current tracking in glamor, and to tell glamor when we've changed the EGL context out from under it. Signed-off-by: Adam Jackson --- src/glamor.h | 1 + src/glamor_egl.c | 39 +++++++++++++++++++++++++-------------- 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 -- cgit v1.2.3