On 08.02.2015 18:47, Chris Wilson wrote: > The vblank event request for a synchronous flip is scheduled for the > vblank before the target flip msc (so that the flip itself appears at > the right frame). If we cancel that flip and so wish to schedule a > copy instead, that copy needs to be postponed by a frame in order for it > be performed at the requested time. > > Signed-off-by: Chris Wilson <[email protected]> > --- > present/present.c | 16 +++++++++++++++- > present/present_priv.h | 1 + > 2 files changed, 16 insertions(+), 1 deletion(-) > > diff --git a/present/present.c b/present/present.c > index ce978f4..a53dc11 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++; > + } > + } > } > } > > @@ -585,6 +590,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 110c925..7db4321 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 */ >
Reviewed-by: Michel Dänzer <[email protected]> -- Earthling Michel Dänzer | http://www.amd.com Libre software enthusiast | Mesa and X developer _______________________________________________ [email protected]: X.Org development Archives: http://lists.x.org/archives/xorg-devel Info: http://lists.x.org/mailman/listinfo/xorg-devel
