[Mesa-dev] [PATCH] egl: Flush the Wayland display queue after calling attach/damage/commit

Giulio Camuffo giuliocamuffo at gmail.com
Thu Aug 22 06:14:02 PDT 2013


eglSwapBuffers() should result in a call to wl_display_flush since it
may be called by a rendering thread, and it cannot rely on the main
loop to call it. The main loop may indeed be stuck on a
wl_display_dispatch() call which blocks until there are events, and
if the redraw is triggered by an application internal event
(timer, ...) the attach/damage/commit calls done by egl will not be
followed by a wl_display_flush call, resulting in the frame not
reaching the compositor.
Thanks to Daniel Stone for the initial direction.

Cc: mesa-stable at lists.freedesktop.org
---

Please Cc me, I'm not subscribed to the list

 src/egl/drivers/dri2/egl_dri2.h         | 1 +
 src/egl/drivers/dri2/platform_wayland.c | 6 +++++-
 2 files changed, 6 insertions(+), 1 deletion(-)

diff --git a/src/egl/drivers/dri2/egl_dri2.h b/src/egl/drivers/dri2/egl_dri2.h
index fba5f81..caaee02 100644
--- a/src/egl/drivers/dri2/egl_dri2.h
+++ b/src/egl/drivers/dri2/egl_dri2.h
@@ -176,6 +176,7 @@ struct dri2_egl_surface
    int                    dy;
    struct wl_callback    *frame_callback;
    int			  format;
+   struct wl_display     *wl_display;
 #endif
 
 #ifdef HAVE_DRM_PLATFORM
diff --git a/src/egl/drivers/dri2/platform_wayland.c b/src/egl/drivers/dri2/platform_wayland.c
index 1d417bb..1b10f71 100644
--- a/src/egl/drivers/dri2/platform_wayland.c
+++ b/src/egl/drivers/dri2/platform_wayland.c
@@ -146,6 +146,8 @@ dri2_create_surface(_EGLDriver *drv, _EGLDisplay *disp, EGLint type,
 
       dri2_surf->base.Width =  -1;
       dri2_surf->base.Height = -1;
+
+      dri2_surf->wl_display = dri2_dpy->wl_dpy;
       break;
    default: 
       goto cleanup_surf;
@@ -532,6 +534,8 @@ dri2_swap_buffers_with_damage(_EGLDriver *drv,
    dri2_surf->current = dri2_surf->back;
    dri2_surf->back = NULL;
 
+   (*dri2_dpy->flush->flush)(dri2_surf->dri_drawable);
+
    create_wl_buffer(dri2_surf);
 
    wl_surface_attach(dri2_surf->wl_win->surface,
@@ -558,8 +562,8 @@ dri2_swap_buffers_with_damage(_EGLDriver *drv,
    }
 
    wl_surface_commit(dri2_surf->wl_win->surface);
+   wl_display_flush(dri2_surf->wl_display);
 
-   (*dri2_dpy->flush->flush)(dri2_surf->dri_drawable);
    (*dri2_dpy->flush->invalidate)(dri2_surf->dri_drawable);
 
    return EGL_TRUE;
-- 
1.8.3.4



More information about the mesa-dev mailing list