diff options
author | Axel Davy <axel.davy@ens.fr> | 2015-11-04 18:42:42 +0100 |
---|---|---|
committer | Adam Jackson <ajax@redhat.com> | 2015-11-09 15:47:01 -0500 |
commit | 2203735887ab548b3ee004400d1b89149aae412c (patch) | |
tree | 4e109bc2eb28924986c5dfcc23327ed2deb44bc9 | |
parent | 3f35909acba117dc8934920d788c7ce612bce444 (diff) |
present: Fix Async swap logic
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.
v2: Fix indentation and simplify checks for Async flips
Signed-off-by: Axel Davy <axel.davy@ens.fr>
Reviewed-by: Michel Dänzer <michel.daenzer@amd.com>
-rw-r--r-- | present/present.c | 25 |
1 files changed, 13 insertions, 12 deletions
diff --git a/present/present.c b/present/present.c index 5900c2289..beb01dcbd 100644 --- a/present/present.c +++ b/present/present.c @@ -836,19 +836,20 @@ 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 (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 ((screen_priv->info->capabilities & PresentCapabilityAsync) && + present_check_flip (target_crtc, window, pixmap, FALSE, valid, x_off, y_off)) + { + vblank->flip = TRUE; + } } if (wait_fence) { |