From b7df04ebc048e18417a13d577d977d6e36c8a8ca Mon Sep 17 00:00:00 2001 From: Mario Kleiner <mario.kleiner.de@gmail.com> Date: Sun, 21 Jun 2015 21:25:15 +0200 Subject: [PATCH] compositor: Respect repaint-window when restarting repaint loop. If a stopped repaint loop gets restarted due to posting of new damage, and this restart of the repaint loop happens late in the video refresh cycle, ie. already inside the repaint-window and thereby after the composition deadline for the current frame, then defer the actual output repaint to the composition deadline of the next video refresh cycle by setting the repaint timer accordingly. This tries to make sure that: a) Client(s) posting damage timely before the composition deadline (video refresh duration - "repaint-window" duration) of the current refresh cycle will trigger a repaint within the current refresh cycle, thereby avoiding one extra frame of compositor lag due to the needed restart of the repaint loop if the loop was stopped. This allows them to benefit from the earlier "instant repaint restart" commit to keep latency low. b) Late clients which post damage close to the end of a refresh cycle can't race other clients if the repaint loop is restarted. Instead they will get deferred to the next compositor cycle, just as if the repaint loop would have been already running - the semantic of the "repaint-window" parameter is preserved. This is especially important to prevent a very late client from triggering a repaint very close to the vblank, which would cause the compositor to certainly miss the vblank and skip one frame and then cause a delay of another frame for other clients which posted their damage in time for the following frame. Iow. this provides clients with a more predictable compositor timing and makes it easier for them to latch onto the compositors repaint cycle. Signed-off-by: Mario Kleiner <mario.kleiner.de@gmail.com> Reviewed-by: Pekka Paalanen <pekka.paalanen@collabora.co.uk> --- src/compositor.c | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/src/compositor.c b/src/compositor.c index ea507e8ca..acaa4336f 100644 --- a/src/compositor.c +++ b/src/compositor.c @@ -2373,6 +2373,13 @@ weston_output_finish_frame(struct weston_output *output, msec = 0; } + /* Called from restart_repaint_loop and restart happens already after + * the deadline given by repaint_msec? In that case we delay until + * the deadline of the next frame, to give clients a more predictable + * timing of the repaint cycle to lock on. */ + if (presented_flags == PRESENTATION_FEEDBACK_INVALID && msec < 0) + msec += refresh_nsec / 1000000; + if (msec < 1) output_repaint_timer_handler(output); else -- GitLab