diff --git a/present/present.c b/present/present.c index 7af6bb7b8..c55a56e7c 100644 --- a/present/present.c +++ b/present/present.c @@ -549,8 +549,13 @@ present_check_flip_window (WindowPtr window) /* Now check any queued vblanks */ xorg_list_for_each_entry(vblank, &window_priv->vblank, window_list) { - if (vblank->queued && vblank->flip && !present_check_flip(vblank->crtc, window, vblank->pixmap, vblank->sync_flip, NULL, 0, 0)) + if (vblank->queued && vblank->flip && !present_check_flip(vblank->crtc, window, vblank->pixmap, vblank->sync_flip, NULL, 0, 0)) { vblank->flip = FALSE; + if (vblank->sync_flip) { + vblank->requeue = TRUE; + vblank->target_msc++; + } + } } } @@ -584,6 +589,15 @@ present_execute(present_vblank_ptr vblank, uint64_t ust, uint64_t crtc_msc) present_screen_priv_ptr screen_priv = present_screen_priv(screen); uint8_t mode; + if (vblank->requeue) { + vblank->requeue = FALSE; + if (Success == present_queue_vblank(screen, + vblank->crtc, + vblank->event_id, + vblank->target_msc)) + return; + } + if (vblank->wait_fence) { if (!present_fence_check_triggered(vblank->wait_fence)) { present_fence_set_callback(vblank->wait_fence, present_wait_fence_triggered, vblank); diff --git a/present/present_priv.h b/present/present_priv.h index d007fdb24..0d16cfaba 100644 --- a/present/present_priv.h +++ b/present/present_priv.h @@ -70,6 +70,7 @@ struct present_vblank { present_notify_ptr notifies; int num_notifies; Bool queued; /* on present_exec_queue */ + Bool requeue; /* on queue, but target_msc has changed */ Bool flip; /* planning on using flip */ Bool flip_ready; /* wants to flip, but waiting for previous flip or unflip */ Bool sync_flip; /* do flip synchronous to vblank */