[PATCH 2/2] present: Fix presentation of flips out of order

Mario Kleiner mario.kleiner.de at gmail.com
Fri May 8 16:24:19 PDT 2015


On 02/14/2015 10:58 AM, Chris Wilson wrote:
> The flip queue currently only holds events submitted to the driver for
> flipping, awaiting the completion notifier. It is short. We therefore
> can speed up interrupt processing by keeping the small number of events
> ready to be flipped on the end of the flip queue. By appending the
> events to the flip_queue in the order that they become ready, we also
> resolve one issue causing Present to display frames out of order.
>
> Signed-off-by: Chris Wilson <chris at chris-wilson.co.uk>
> ---
>   present/present.c | 9 ++++++---
>   1 file changed, 6 insertions(+), 3 deletions(-)
>
> diff --git a/present/present.c b/present/present.c
> index b132f4d..bce41f4 100644
> --- a/present/present.c
> +++ b/present/present.c
> @@ -327,10 +327,10 @@ present_re_execute(present_vblank_ptr vblank)
>   static void
>   present_flip_try_ready(ScreenPtr screen)
>   {
> -    present_vblank_ptr  vblank, tmp;
> +    present_vblank_ptr  vblank;
>
> -    xorg_list_for_each_entry_safe(vblank, tmp, &present_exec_queue, event_queue) {
> -        if (vblank->flip_ready) {
> +    xorg_list_for_each_entry(vblank, &present_flip_queue, event_queue) {
> +        if (vblank->queued) {
>               present_re_execute(vblank);
>               return;
>           }
> @@ -623,6 +623,8 @@ present_execute(present_vblank_ptr vblank, uint64_t ust, uint64_t crtc_msc)
>               DebugPresent(("\tr %lld %p (pending %p unflip %lld)\n",
>                             vblank->event_id, vblank,
>                             screen_priv->flip_pending, screen_priv->unflip_event_id));
> +            xorg_list_del(&vblank->event_queue);
> +            xorg_list_append(&vblank->event_queue, &present_flip_queue);
>               vblank->flip_ready = TRUE;
>               return;
>           }
> @@ -938,6 +940,7 @@ present_abort_vblank(ScreenPtr screen, RRCrtcPtr crtc, uint64_t event_id, uint64
>       xorg_list_for_each_entry(vblank, &present_flip_queue, event_queue) {
>           if (vblank->event_id == event_id) {
>               xorg_list_del(&vblank->event_queue);
> +            vblank->queued = FALSE;
>               return;
>           }
>       }
>

Ditto here. Looks good to me, also no problems during testing on top of 
current master, so

Reviewed-and-tested-by: Mario Kleiner <mario.kleiner.de at gmail.com>

-mario


More information about the xorg-devel mailing list