diff --git a/present/present_priv.h b/present/present_priv.h index dabf4c9d0..7f9d82d8d 100644 --- a/present/present_priv.h +++ b/present/present_priv.h @@ -469,7 +469,7 @@ present_vblank_create(WindowPtr window, const uint32_t *capabilities, present_notify_ptr notifies, int num_notifies, - uint64_t *target_msc, + uint64_t target_msc, uint64_t crtc_msc); void diff --git a/present/present_scmd.c b/present/present_scmd.c index fa800e99c..a5a36f2a2 100644 --- a/present/present_scmd.c +++ b/present/present_scmd.c @@ -732,12 +732,15 @@ present_scmd_pixmap(WindowPtr window, screen_priv->info ? &screen_priv->info->capabilities : NULL, notifies, num_notifies, - &target_msc, + target_msc, crtc_msc); if (!vblank) return BadAlloc; + if (vblank->flip && vblank->sync_flip) + target_msc--; + xorg_list_append(&vblank->event_queue, &present_exec_queue); vblank->queued = TRUE; if (msc_is_after(target_msc, crtc_msc)) { diff --git a/present/present_vblank.c b/present/present_vblank.c index 2c124f4bb..a4b70c0d9 100644 --- a/present/present_vblank.c +++ b/present/present_vblank.c @@ -57,7 +57,7 @@ present_vblank_create(WindowPtr window, const uint32_t *capabilities, present_notify_ptr notifies, int num_notifies, - uint64_t *target_msc, + uint64_t target_msc, uint64_t crtc_msc) { ScreenPtr screen = window->drawable.pScreen; @@ -100,7 +100,7 @@ present_vblank_create(WindowPtr window, vblank->x_off = x_off; vblank->y_off = y_off; - vblank->target_msc = *target_msc; + vblank->target_msc = target_msc; vblank->crtc = target_crtc; vblank->msc_offset = window_priv->msc_offset; vblank->notifies = notifies; @@ -111,12 +111,11 @@ present_vblank_create(WindowPtr window, if (pixmap != NULL && !(options & PresentOptionCopy) && capabilities) { - if (msc_is_after(*target_msc, crtc_msc) && + if (msc_is_after(target_msc, crtc_msc) && screen_priv->check_flip (target_crtc, window, pixmap, TRUE, valid, x_off, y_off, &reason)) { vblank->flip = TRUE; vblank->sync_flip = TRUE; - *target_msc = *target_msc - 1; } else if ((*capabilities & PresentCapabilityAsync) && screen_priv->check_flip (target_crtc, window, pixmap, FALSE, valid, x_off, y_off, &reason)) { @@ -139,7 +138,7 @@ present_vblank_create(WindowPtr window, if (pixmap) DebugPresent(("q %" PRIu64 " %p %" PRIu64 ": %08" PRIx32 " -> %08" PRIx32 " (crtc %p) flip %d vsync %d serial %d\n", - vblank->event_id, vblank, *target_msc, + vblank->event_id, vblank, target_msc, vblank->pixmap->drawable.id, vblank->window->drawable.id, target_crtc, vblank->flip, vblank->sync_flip, vblank->serial)); return vblank; diff --git a/present/present_wnmd.c b/present/present_wnmd.c index b0d79b80f..922b877e7 100644 --- a/present/present_wnmd.c +++ b/present/present_wnmd.c @@ -645,11 +645,14 @@ present_wnmd_pixmap(WindowPtr window, &screen_priv->wnmd_info->capabilities, notifies, num_notifies, - &target_msc, + target_msc, crtc_msc); if (!vblank) return BadAlloc; + if (vblank->flip && vblank->sync_flip) + target_msc--; + xorg_list_append(&vblank->event_queue, &window_priv->exec_queue); vblank->queued = TRUE; if (crtc_msc < target_msc) {