[PATCH] present: Fix Async swap logic
Axel Davy
axel.davy at ens.fr
Tue Nov 3 00:14:51 PST 2015
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.davy at 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;
+ }
}
if (wait_fence) {
--
2.6.2
More information about the xorg-devel
mailing list