[PATCH Mesa] Enable throttling in SwapBuffers

Axel Davy axel.davy at ens.fr
Tue Dec 3 08:04:10 PST 2013


flush_with_flags, when available, allows the driver to throttle.
Using this suppress input lag issues that can be observed in heavy
rendering situations on non-intel cards.

Signed-off-by: Axel Davy <axel.davy at ens.fr>
---
We must fight input lag, since we can have situations where
the sent buffer hasn't been touched yet at all by the driver.
In this corner case, there is no lock on the buffer, and Weston
would display the buffer which has not been rendered yet.

 src/egl/drivers/dri2/platform_wayland.c | 14 +++++++++++++-
 1 file changed, 13 insertions(+), 1 deletion(-)

diff --git a/src/egl/drivers/dri2/platform_wayland.c b/src/egl/drivers/dri2/platform_wayland.c
index f9065bb..7e3733b 100644
--- a/src/egl/drivers/dri2/platform_wayland.c
+++ b/src/egl/drivers/dri2/platform_wayland.c
@@ -557,6 +557,8 @@ dri2_swap_buffers_with_damage(_EGLDriver *drv,
 {
    struct dri2_egl_display *dri2_dpy = dri2_egl_display(disp);
    struct dri2_egl_surface *dri2_surf = dri2_egl_surface(draw);
+   _EGLContext *ctx;
+   struct dri2_egl_context *dri2_ctx;
    int i, ret = 0;
 
    while (dri2_surf->frame_callback && ret != -1)
@@ -612,7 +614,17 @@ dri2_swap_buffers_with_damage(_EGLDriver *drv,
 
    wl_surface_commit(dri2_surf->wl_win->surface);
 
-   (*dri2_dpy->flush->flush)(dri2_surf->dri_drawable);
+   if (dri2_dpy->flush->base.version >= 4)
+   {
+      ctx = _eglGetCurrentContext();
+      dri2_ctx = dri2_egl_context(ctx);
+      (*dri2_dpy->flush->flush_with_flags)(dri2_ctx->dri_context,
+                                           dri2_surf->dri_drawable,
+                                           __DRI2_FLUSH_DRAWABLE,
+                                           __DRI2_THROTTLE_SWAPBUFFER);
+   }
+   else
+      (*dri2_dpy->flush->flush)(dri2_surf->dri_drawable);
    (*dri2_dpy->flush->invalidate)(dri2_surf->dri_drawable);
 
    return EGL_TRUE;
-- 
1.8.1.2



More information about the wayland-devel mailing list