summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAdam Jackson <ajax@redhat.com>2013-07-26 14:35:55 -0400
committerAdam Jackson <ajax@redhat.com>2013-08-02 07:27:28 -0400
commit8ace01a4b92e7c2a820b98bdacbe73a7e5a0d60b (patch)
treebcbbc4cc68dcd1ecfd66ea403ff3dc19462081b2
parentd5302bb597cd609908175008f1f307d5bbe315c1 (diff)
Rework current context trackingglx
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 <ajax@redhat.com>
-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