[Mesa-dev] [PATCH] egl/wayland: Ensure we get a back buffer
Pekka Paalanen
ppaalanen at gmail.com
Tue May 16 10:32:58 UTC 2017
On Tue, 16 May 2017 11:02:22 +0100
Daniel Stone <daniels at collabora.com> wrote:
> Commit 9ca6711faa03 changed the Wayland winsys to only block for the
> frame callback inside SwapBuffers, rather than get_back_bo. get_back_bo
> would perform a single non-blocking Wayland event dispatch, to try to
> find any release events which we had pulled off the wire but not
> actually processed. The blocking dispatch was moved to SwapBuffers.
>
> This removed a guarantee that we would've processed all events inside
> get_back_bo(), and introduced a failure whereby the server could've sent
> a buffer release event, but we wouldn't have read it. In clients
> unconstrained by SwapInterval (rendering ~as fast as possible), which
> were being displayed on a hardware overlay (buffer release delayed),
Hi,
hardware overlay, or as in the bug report, on the primary plane, i.e.
the only composite-bypass case in pre-atomic Weston available without
hacks.
> this could lead to get_back_bo() failing because there were no free
> buffers available to it.
>
> The drawing rightly failed, but this was papered over because of the
> path in eglSwapBuffers() which attempts to guarantee a BO, in order to
> support calling SwapBuffers twice in a row with no rendering actually
> having been performed.
>
> Since eglSwapBuffers will perform a blocking dispatch of Wayland
> events, a buffer release would have arrived by that point, and we
> could then choose a buffer to post to the server. The effect was that
> frames were displayed out-of-order, since we grabbed a frame with random
> past content to display to the compositor.
>
> Ideally get_back_bo() failing should store a failure flag inside the
> surface and cause the next SwapBuffers to fail, but for the meantime,
> restore the correct behaviour such that get_back_bo() no longer fails.
>
> Signed-off-by: Daniel Stone <daniels at collabora.com>
> Reported-by: Eero Tamminen <eero.t.tamminen at intel.com>
> Bugzilla: https://bugs.freedesktop.org/show_bug.cgi?id=98833
> Fixes: 9ca6711faa03 ("Revert "wayland: Block for the frame callback in get_back_bo not dri2_swap_buffers"")
> ---
> src/egl/drivers/dri2/platform_wayland.c | 10 +++++++++-
> 1 file changed, 9 insertions(+), 1 deletion(-)
>
> diff --git a/src/egl/drivers/dri2/platform_wayland.c b/src/egl/drivers/dri2/platform_wayland.c
> index 52ab9f7579..7837790bdb 100644
> --- a/src/egl/drivers/dri2/platform_wayland.c
> +++ b/src/egl/drivers/dri2/platform_wayland.c
> @@ -353,7 +353,7 @@ get_back_bo(struct dri2_egl_surface *dri2_surf)
> /* There might be a buffer release already queued that wasn't processed */
> wl_display_dispatch_queue_pending(dri2_dpy->wl_dpy, dri2_surf->wl_queue);
>
> - if (dri2_surf->back == NULL) {
> + while (dri2_surf->back == NULL) {
> for (i = 0; i < ARRAY_SIZE(dri2_surf->color_buffers); i++) {
> /* Get an unlocked buffer, preferrably one with a dri_buffer
> * already allocated. */
> @@ -364,6 +364,14 @@ get_back_bo(struct dri2_egl_surface *dri2_surf)
> else if (dri2_surf->back->dri_image == NULL)
> dri2_surf->back = &dri2_surf->color_buffers[i];
> }
> +
> + if (dri2_surf->back)
> + continue;
Would 'break' be more readable?
> +
> + /* 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)
> + return -1;
> }
>
> if (dri2_surf->back == NULL)
The swrast path does not need fixing, because there buffer release can
never be delayed due to composite bypass, right?
Nothing looks suspicious to me, so:
Acked-by: Pekka Paalanen <pekka.paalanen at collabora.co.uk>
Thanks,
pq
-------------- next part --------------
A non-text attachment was scrubbed...
Name: not available
Type: application/pgp-signature
Size: 833 bytes
Desc: OpenPGP digital signature
URL: <https://lists.freedesktop.org/archives/mesa-dev/attachments/20170516/35df278e/attachment.sig>
More information about the mesa-dev
mailing list