Mesa (master): egl/wayland: Use roundtrips when awaiting buffer release
Daniel Stone
daniels at kemper.freedesktop.org
Fri Aug 25 08:57:15 UTC 2017
Module: Mesa
Branch: master
Commit: 151188d1e330a7a5f110bbc8251680121a1a84a6
URL: http://cgit.freedesktop.org/mesa/mesa/commit/?id=151188d1e330a7a5f110bbc8251680121a1a84a6
Author: Kai Chen <kai.chen at intel.com>
Date: Mon Aug 7 08:34:51 2017 -0700
egl/wayland: Use roundtrips when awaiting buffer release
In get_back_bo, we use wl_display_dispatch_queue() to block and wait for
a buffer release event. However, not all Wayland compositors flush the
client socket on posting a buffer-release event, so by only blocking
client-side, we may block indefinitely, or at least need to wait for an
input event / frame completion to arrive for the compositor to flush.
We now use dispatch_queue as a first pass, but if our entire buffer pool
is exhausted, use a roundtrip (an immediately-triggered wl_callback) to
ensure that the compositor flushes out our release event immediately.
[daniels: Modified comment and commit message.]
Signed-off-by: Kai Chen <kai.chen at intel.com>
Reviewed-by: Daniel Stone <daniels at collabora.com>
CC: <mesa-stable at lists.freedesktop.org>
---
src/egl/drivers/dri2/platform_wayland.c | 9 +++++++--
1 file changed, 7 insertions(+), 2 deletions(-)
diff --git a/src/egl/drivers/dri2/platform_wayland.c b/src/egl/drivers/dri2/platform_wayland.c
index 15dc9390cb..0b6cd1d116 100644
--- a/src/egl/drivers/dri2/platform_wayland.c
+++ b/src/egl/drivers/dri2/platform_wayland.c
@@ -383,8 +383,13 @@ get_back_bo(struct dri2_egl_surface *dri2_surf)
break;
/* If we don't have a buffer, then block on the server to release one for
- * us, and try again. */
- if (wl_display_dispatch_queue(dri2_dpy->wl_dpy, dri2_surf->wl_queue) < 0)
+ * us, and try again. wl_display_dispatch_queue will process any pending
+ * events, however not all servers flush on issuing a buffer release
+ * event. So, we spam the server with roundtrips as they always cause a
+ * client flush.
+ */
+ if (wl_display_roundtrip_queue(dri2_dpy->wl_dpy,
+ dri2_surf->wl_queue) < 0)
return -1;
}
More information about the mesa-commit
mailing list