OSDN Git Service

egl_softpipe: Do not flush unlinked context.
authorChia-I Wu <olvaffe@gmail.com>
Thu, 20 Aug 2009 11:35:28 +0000 (19:35 +0800)
committerBrian Paul <brianp@vmware.com>
Fri, 21 Aug 2009 14:34:34 +0000 (08:34 -0600)
An unlinked context is destroyed after _eglMakeCurrent.  Flushing such
context would cause segfault.

Signed-off-by: Chia-I Wu <olvaffe@gmail.com>
src/gallium/winsys/egl_xlib/egl_xlib.c

index 1fcdd2d..96f460f 100644 (file)
@@ -424,14 +424,19 @@ xlib_eglMakeCurrent(_EGLDriver *drv, _EGLDisplay *dpy,
    struct xlib_egl_context *context = lookup_context(ctx);
    struct xlib_egl_surface *draw_surf = lookup_surface(draw);
    struct xlib_egl_surface *read_surf = lookup_surface(read);
-   struct st_context *oldctx = st_get_current();
+   struct st_context *oldcontext = NULL;
+   _EGLContext *oldctx;
+
+   oldctx = _eglGetCurrentContext();
+   if (oldctx && _eglIsContextLinked(oldctx))
+      oldcontext = st_get_current();
 
    if (!_eglMakeCurrent(drv, dpy, draw, read, ctx))
       return EGL_FALSE;
 
    /* Flush before switching context.  Check client API? */
-   if (oldctx)
-      st_flush(oldctx, PIPE_FLUSH_RENDER_CACHE | PIPE_FLUSH_FRAME, NULL);
+   if (oldcontext)
+      st_flush(oldcontext, PIPE_FLUSH_RENDER_CACHE | PIPE_FLUSH_FRAME, NULL);
    st_make_current((context ? context->Context : NULL),
                    (draw_surf ? draw_surf->Framebuffer : NULL),
                    (read_surf ? read_surf->Framebuffer : NULL));