diff options
author | Kai Chen <[email protected]> | 2017-08-07 08:34:51 -0700 |
---|---|---|
committer | Andres Gomez <[email protected]> | 2017-08-25 16:03:37 +0300 |
commit | 81a1ecda15bba5d16812226ffafe60f36f2ac21e (patch) | |
tree | 6719990e0d3556347a5b1db1e615332c1940670b /src | |
parent | 52b0ad8666b4f9c4acd206ae231b62ee1b91561b (diff) |
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 <[email protected]>
Reviewed-by: Daniel Stone <[email protected]>
CC: <[email protected]>
(cherry picked from commit 151188d1e330a7a5f110bbc8251680121a1a84a6)
Diffstat (limited to 'src')
-rw-r--r-- | src/egl/drivers/dri2/platform_wayland.c | 9 |
1 files changed, 7 insertions, 2 deletions
diff --git a/src/egl/drivers/dri2/platform_wayland.c b/src/egl/drivers/dri2/platform_wayland.c index b8af6ef2531..e5a867b6f02 100644 --- a/src/egl/drivers/dri2/platform_wayland.c +++ b/src/egl/drivers/dri2/platform_wayland.c @@ -370,8 +370,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; } |