[PATCH weston v2 06/11] Don't delay initial output paint

Daniel Stone daniels at collabora.com
Wed Mar 1 11:34:05 UTC 2017

On startup, we cannot lock on to the repaint timer because it is unknown
to us. We deal with this by claiming that the moment of entry into the
repaint loop is the moment a frame returned, causing finish_frame to
delay our initial repaint to (refresh_time - repaint_delay), typically
around 9ms of utterly wasted time.

Add an explicit stamp == NULL, to determine that we are just beginning
our repaint loop, that the timings are in fact totally invalid, and that
it would be beneficial to repaint the output immediately. This will only
trigger when the display had previously been disabled or the previous
state is unknown, e.g. at startup, or coming back from DPMS off.

Signed-off-by: Daniel Stone <daniels at collabora.com>
Reviewed-by: Pekka Paalanen <pekka.paalanen at collabora.co.uk>
 libweston/compositor-drm.c | 3 +--
 libweston/compositor.c     | 9 +++++++++
 2 files changed, 10 insertions(+), 2 deletions(-)

v2: Add assert to verify usage (Pekka).

diff --git a/libweston/compositor-drm.c b/libweston/compositor-drm.c
index 7f78699..9a2df16 100644
--- a/libweston/compositor-drm.c
+++ b/libweston/compositor-drm.c
@@ -882,8 +882,7 @@ drm_output_start_repaint_loop(struct weston_output *output_base)
 	/* if we cannot page-flip, immediately finish frame */
-	weston_compositor_read_presentation_clock(output_base->compositor, &ts);
-	weston_output_finish_frame(output_base, &ts,
+	weston_output_finish_frame(output_base, NULL,
diff --git a/libweston/compositor.c b/libweston/compositor.c
index 9eab0e2..57eafcd 100644
--- a/libweston/compositor.c
+++ b/libweston/compositor.c
@@ -2383,6 +2383,14 @@ weston_output_finish_frame(struct weston_output *output,
 	TL_POINT("core_repaint_finished", TLP_OUTPUT(output),
 		 TLP_VBLANK(stamp), TLP_END);
+	assert(stamp || (presented_flags & WP_PRESENTATION_FEEDBACK_INVALID));
+	/* If we haven't been supplied any timestamp at all, we don't have a
+	 * timebase to work against, so any delay just wastes time. Push a
+	 * repaint as soon as possible so we can get on with it. */
+	if (!stamp)
+		goto out;
 	refresh_nsec = millihz_to_nsec(output->current_mode->refresh);
 						  output, refresh_nsec, stamp,
@@ -2415,6 +2423,7 @@ weston_output_finish_frame(struct weston_output *output,
 	if (presented_flags == WP_PRESENTATION_FEEDBACK_INVALID && msec_rel < 0)
 		msec_rel += refresh_nsec / 1000000;
 	if (msec_rel < 1)

More information about the wayland-devel mailing list