[PATCH] present: Fix Async swap logic

Axel Davy axel.davy at ens.fr
Wed Nov 4 01:48:40 PST 2015


On 04/11/2015 10:40, Chris Wilson wrote:
> On Tue, Nov 03, 2015 at 09:14:51AM +0100, Axel Davy wrote:
>> +    if (pixmap != NULL &&
>> +        !(options & PresentOptionCopy) &&
>> +        screen_priv->info) {
>> +        if (target_msc > crtc_msc &&
>> +            present_check_flip (target_crtc, window, pixmap, TRUE, valid, x_off, y_off))
>> +        {
>> +          vblank->flip = TRUE;
>> +          vblank->sync_flip = TRUE;
>> +          target_msc--;
>> +        } else if (target_msc == crtc_msc &&
>> +            (options & PresentOptionAsync) &&
>> +            (screen_priv->info->capabilities & PresentCapabilityAsync) &&
>> +            present_check_flip (target_crtc, window, pixmap, FALSE, valid, x_off, y_off))
>> +        {
>> +          vblank->flip = TRUE;
>> +        }
>>       }
> For reference, this is how I fixed the async flip + swap elision:
>
> t a/present/present.c b/present/present.c
> index e9ccfb8..32522af 100644
> --- a/present/present.c
> +++ b/present/present.c
> @@ -861,19 +861,19 @@ present_pixmap(WindowPtr window,
>       vblank->notifies = notifies;
>       vblank->num_notifies = num_notifies;
>   
> -    if (!(options & PresentOptionAsync))
> -        vblank->sync_flip = TRUE;
> -
> -    if (!(options & PresentOptionCopy) &&
> -        !((options & PresentOptionAsync) &&
> -          (!screen_priv->info ||
> -           !(screen_priv->info->capabilities & PresentCapabilityAsync))) &&
> -        pixmap != NULL &&
> -        present_check_flip (target_crtc, window, pixmap, vblank->sync_flip, valid, x_off, y_off))
> -    {
> -        vblank->flip = TRUE;
> -        if (vblank->sync_flip)
> +    if (!(options & PresentOptionCopy) && pixmap != NULL) {
> +        if (options & PresentOptionAsync &&
> +            (screen_priv->info &&
> +             screen_priv->info->capabilities & PresentCapabilityAsync) &&
> +            present_check_flip (target_crtc, window, pixmap, FALSE, valid, x_off, y_off)) {
> +            vblank->flip = TRUE;
> +        }
> +        else if (present_check_flip (target_crtc, window, pixmap, TRUE, valid, x_off, y_off)) {
> +            vblank->flip = TRUE;
> +            vblank->sync_flip = TRUE;
>               target_msc--;
> +        } else if (options & PresentOptionAsync)
> +            target_msc++;
>       }
>   
>       if (wait_fence) {
>
>
Hi,

Could you explain:
. Why you increase target_msc when the Async option is requested ?
. Why you check for Async flips first (isn't sync flips better when 
possible) ?

To me the Async option isn't related particularly to Async flips. Async 
flips is just an optimization to handle it without a copy in the case 
you would need one.


http://cgit.freedesktop.org/xorg/proto/presentproto/tree/presentproto.txt#n212
Given the spec, I believe when target_msc > crtc_msc, the behaviour 
should be the same with or without the flag, and thus you shouldn't 
increase target_msc.

Yours,

Axel Davy


More information about the xorg-devel mailing list