On Tue, Nov 03, 2015 at 09:14:51AM +0100, Axel Davy wrote: > According to the spec, PresentOptionAsync should only > trigger a different behaviour when the target msc has been reached. > > In this case if the driver is able to do async swaps, we use > them to avoid a screen copy. > > When the target msc hasn't been reached yet, we want to use sync swaps. > > Signed-off-by: Axel Davy <axel.d...@ens.fr> > --- > I'm not sure for indentation, I tried to do the same than previous check > present/present.c | 29 ++++++++++++++++------------- > 1 file changed, 16 insertions(+), 13 deletions(-) > > diff --git a/present/present.c b/present/present.c > index beb4ff0..3b8679c 100644 > --- a/present/present.c > +++ b/present/present.c > @@ -836,19 +836,22 @@ 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) > - target_msc--; > + 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) { -- Chris Wilson, Intel Open Source Technology Centre _______________________________________________ xorg-devel@lists.x.org: X.Org development Archives: http://lists.x.org/archives/xorg-devel Info: http://lists.x.org/mailman/listinfo/xorg-devel