diff options
Diffstat (limited to 'src/glamor_egl.c')
-rw-r--r-- | src/glamor_egl.c | 39 |
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; } |