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
_______________________________________________
[email protected]: X.Org development
Archives: http://lists.x.org/archives/xorg-devel
Info: http://lists.x.org/mailman/listinfo/xorg-devel