diff --git a/present/present_wnmd.c b/present/present_wnmd.c index 2c11e53f54fafa8a4a5dfc4b34ad51262375a719..8c31619a2b70effc7ffb10e2e5384a56668983b9 100644 --- a/present/present_wnmd.c +++ b/present/present_wnmd.c @@ -122,7 +122,8 @@ present_wnmd_free_idle_vblanks(WindowPtr window) present_vblank_ptr vblank, tmp; xorg_list_for_each_entry_safe(vblank, tmp, &window_priv->idle_queue, event_queue) { - present_wnmd_free_idle_vblank(vblank); + if (vblank->flip) + present_wnmd_free_idle_vblank(vblank); } if (window_priv->flip_active) { @@ -245,7 +246,12 @@ present_wnmd_event_notify(WindowPtr window, uint64_t event_id, uint64_t ust, uin xorg_list_for_each_entry(vblank, &window_priv->idle_queue, event_queue) { if (vblank->event_id == event_id) { - present_wnmd_free_idle_vblank(vblank); + if (vblank->flip) + present_wnmd_free_idle_vblank(vblank); + else + /* Copies which were executed but need their completion event sent */ + present_execute_post(vblank, ust, msc); + return; } } @@ -353,8 +359,6 @@ present_wnmd_check_flip_window (WindowPtr window) vblank->sync_flip, vblank->valid, 0, 0, &reason)) { vblank->flip = FALSE; vblank->reason = reason; - if (vblank->sync_flip) - vblank->exec_msc = vblank->target_msc; } } } @@ -454,6 +458,7 @@ present_wnmd_execute(present_vblank_ptr vblank, uint64_t ust, uint64_t crtc_msc) vblank->queued = FALSE; if (vblank->pixmap && vblank->window) { + ScreenPtr screen = window->drawable.pScreen; if (vblank->flip) { RegionPtr damage; @@ -479,7 +484,6 @@ present_wnmd_execute(present_vblank_ptr vblank, uint64_t ust, uint64_t crtc_msc) // ask the driver if (present_wnmd_flip(vblank->window, vblank->crtc, vblank->event_id, vblank->target_msc, vblank->pixmap, vblank->sync_flip, damage)) { - ScreenPtr screen = window->drawable.pScreen; WindowPtr toplvl_window = present_wnmd_toplvl_pixmap_window(vblank->window); PixmapPtr old_pixmap = screen->GetWindowPixmap(window); @@ -502,7 +506,6 @@ present_wnmd_execute(present_vblank_ptr vblank, uint64_t ust, uint64_t crtc_msc) */ window_priv->flip_pending = NULL; vblank->flip = FALSE; - vblank->exec_msc = vblank->target_msc; } DebugPresent(("\tc %p %" PRIu64 ": %08" PRIx32 " -> %08" PRIx32 "\n", vblank, crtc_msc, vblank->pixmap->drawable.id, vblank->window->drawable.id)); @@ -510,9 +513,12 @@ present_wnmd_execute(present_vblank_ptr vblank, uint64_t ust, uint64_t crtc_msc) present_wnmd_cancel_flip(window); present_execute_copy(vblank, crtc_msc); + assert(!vblank->queued); - if (vblank->queued) { - xorg_list_add(&vblank->event_queue, &window_priv->exec_queue); + if (present_wnmd_queue_vblank(screen, window, vblank->crtc, + vblank->event_id, crtc_msc + 1) + == Success) { + xorg_list_add(&vblank->event_queue, &window_priv->idle_queue); xorg_list_append(&vblank->window_list, &window_priv->vblank); return; @@ -632,8 +638,10 @@ present_wnmd_pixmap(WindowPtr window, if (!vblank) return BadAlloc; - if (vblank->flip && vblank->sync_flip) - vblank->exec_msc--; + /* WNMD presentations always complete (at least) one frame after they + * are executed + */ + vblank->exec_msc = vblank->target_msc - 1; xorg_list_append(&vblank->event_queue, &window_priv->exec_queue); vblank->queued = TRUE;