Commit 22037358 authored by Axel Davy's avatar Axel Davy Committed by Adam Jackson

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: 's avatarAxel Davy <axel.davy@ens.fr>
Reviewed-by: 's avatarMichel Dänzer <michel.daenzer@amd.com>
parent 3f35909a
......@@ -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) {
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment