[PATCH weston v2 1/2] compositor, backends: weston_compositor_read_presentation_clock

Pekka Paalanen ppaalanen at gmail.com
Wed Mar 18 06:27:21 PDT 2015


From: Pekka Paalanen <pekka.paalanen at collabora.co.uk>

Create a new function weston_compositor_read_presentation_clock() to
wrap the clock_gettime() call for the Presentation clock.

Reading the presentation clock is never supposed to fail, but if it
does, this will notify about it. I have not seen it fail yet, though.

This prepares for new testing features in the future that might allow
controlling the presentation clock. Right now it is just a convenience
function for clock_gettime().

All presentation clock readers are converted to call this new function
except rpi-backend's rpi_flippipe_update_complete(), because it gets its
clock id via a thread-safe mechanism. There shouldn't be anything really
thread-unsafe in weston_compositor_read_presentation_clock() at the
moment, but might be in the future, and weston core is not expected to
need to be thread-safe.

This is based on the original patch by
Cc: Derek Foreman <derekf at osg.samsung.com>

Signed-off-by: Pekka Paalanen <pekka.paalanen at collabora.co.uk>
---
 src/compositor-drm.c      |  2 +-
 src/compositor-fbdev.c    |  4 ++--
 src/compositor-headless.c |  4 ++--
 src/compositor-rdp.c      |  4 ++--
 src/compositor-rpi.c      |  2 +-
 src/compositor-x11.c      |  4 ++--
 src/compositor.c          | 33 +++++++++++++++++++++++++++++++++
 src/compositor.h          |  5 +++++
 8 files changed, 48 insertions(+), 10 deletions(-)

diff --git a/src/compositor-drm.c b/src/compositor-drm.c
index ed4eabf..15152b0 100644
--- a/src/compositor-drm.c
+++ b/src/compositor-drm.c
@@ -723,7 +723,7 @@ drm_output_start_repaint_loop(struct weston_output *output_base)
 
 finish_frame:
 	/* if we cannot page-flip, immediately finish frame */
-	clock_gettime(compositor->base.presentation_clock, &ts);
+	weston_compositor_read_presentation_clock(&compositor->base, &ts);
 	weston_output_finish_frame(output_base, &ts,
 				   PRESENTATION_FEEDBACK_INVALID);
 }
diff --git a/src/compositor-fbdev.c b/src/compositor-fbdev.c
index eedf252..b4c1390 100644
--- a/src/compositor-fbdev.c
+++ b/src/compositor-fbdev.c
@@ -117,7 +117,7 @@ fbdev_output_start_repaint_loop(struct weston_output *output)
 {
 	struct timespec ts;
 
-	clock_gettime(output->compositor->presentation_clock, &ts);
+	weston_compositor_read_presentation_clock(output->compositor, &ts);
 	weston_output_finish_frame(output, &ts, PRESENTATION_FEEDBACK_INVALID);
 }
 
@@ -223,7 +223,7 @@ finish_frame_handler(void *data)
 	struct fbdev_output *output = data;
 	struct timespec ts;
 
-	clock_gettime(output->base.compositor->presentation_clock, &ts);
+	weston_compositor_read_presentation_clock(output->base.compositor, &ts);
 	weston_output_finish_frame(&output->base, &ts, 0);
 
 	return 1;
diff --git a/src/compositor-headless.c b/src/compositor-headless.c
index d4d25fa..1b1d327 100644
--- a/src/compositor-headless.c
+++ b/src/compositor-headless.c
@@ -58,7 +58,7 @@ headless_output_start_repaint_loop(struct weston_output *output)
 {
 	struct timespec ts;
 
-	clock_gettime(output->compositor->presentation_clock, &ts);
+	weston_compositor_read_presentation_clock(output->compositor, &ts);
 	weston_output_finish_frame(output, &ts, PRESENTATION_FEEDBACK_INVALID);
 }
 
@@ -68,7 +68,7 @@ finish_frame_handler(void *data)
 	struct headless_output *output = data;
 	struct timespec ts;
 
-	clock_gettime(output->base.compositor->presentation_clock, &ts);
+	weston_compositor_read_presentation_clock(output->base.compositor, &ts);
 	weston_output_finish_frame(&output->base, &ts, 0);
 
 	return 1;
diff --git a/src/compositor-rdp.c b/src/compositor-rdp.c
index 1c3f988..6955d49 100644
--- a/src/compositor-rdp.c
+++ b/src/compositor-rdp.c
@@ -307,7 +307,7 @@ rdp_output_start_repaint_loop(struct weston_output *output)
 {
 	struct timespec ts;
 
-	clock_gettime(output->compositor->presentation_clock, &ts);
+	weston_compositor_read_presentation_clock(output->compositor, &ts);
 	weston_output_finish_frame(output, &ts, PRESENTATION_FEEDBACK_INVALID);
 }
 
@@ -353,7 +353,7 @@ finish_frame_handler(void *data)
 	struct rdp_output *output = data;
 	struct timespec ts;
 
-	clock_gettime(output->base.compositor->presentation_clock, &ts);
+	weston_compositor_read_presentation_clock(output->base.compositor, &ts);
 	weston_output_finish_frame(&output->base, &ts, 0);
 
 	return 1;
diff --git a/src/compositor-rpi.c b/src/compositor-rpi.c
index 2d72686..08d5105 100644
--- a/src/compositor-rpi.c
+++ b/src/compositor-rpi.c
@@ -217,7 +217,7 @@ rpi_output_start_repaint_loop(struct weston_output *output)
 	struct timespec ts;
 
 	/* XXX: do a phony dispmanx update and trigger on its completion? */
-	clock_gettime(output->compositor->presentation_clock, &ts);
+	weston_compositor_read_presentation_clock(output->compositor, &ts);
 	weston_output_finish_frame(output, &ts, PRESENTATION_FEEDBACK_INVALID);
 }
 
diff --git a/src/compositor-x11.c b/src/compositor-x11.c
index e9735c5..e89acb7 100644
--- a/src/compositor-x11.c
+++ b/src/compositor-x11.c
@@ -346,7 +346,7 @@ x11_output_start_repaint_loop(struct weston_output *output)
 {
 	struct timespec ts;
 
-	clock_gettime(output->compositor->presentation_clock, &ts);
+	weston_compositor_read_presentation_clock(output->compositor, &ts);
 	weston_output_finish_frame(output, &ts, PRESENTATION_FEEDBACK_INVALID);
 }
 
@@ -458,7 +458,7 @@ finish_frame_handler(void *data)
 	struct x11_output *output = data;
 	struct timespec ts;
 
-	clock_gettime(output->base.compositor->presentation_clock, &ts);
+	weston_compositor_read_presentation_clock(output->base.compositor, &ts);
 	weston_output_finish_frame(&output->base, &ts, 0);
 
 	return 1;
diff --git a/src/compositor.c b/src/compositor.c
index 60b7ee4..e060be1 100644
--- a/src/compositor.c
+++ b/src/compositor.c
@@ -4618,6 +4618,39 @@ weston_compositor_set_presentation_clock_software(
 	return -1;
 }
 
+/** Read the current time from the Presentation clock
+ *
+ * \param compositor
+ * \param ts[out] The current time.
+ *
+ * \note Reading the current time in user space is always imprecise to some
+ * degree.
+ *
+ * This function is never meant to fail. If reading the clock does fail,
+ * an error message is logged and a zero time is returned. Callers are not
+ * supposed to detect or react to failures.
+ */
+WL_EXPORT void
+weston_compositor_read_presentation_clock(
+			const struct weston_compositor *compositor,
+			struct timespec *ts)
+{
+	static bool warned;
+	int ret;
+
+	ret = clock_gettime(compositor->presentation_clock, ts);
+	if (ret < 0) {
+		ts->tv_sec = 0;
+		ts->tv_nsec = 0;
+
+		if (!warned)
+			weston_log("Error: failure to read "
+				   "the presentation clock %#x: '%m' (%d)\n",
+				   compositor->presentation_clock, errno);
+		warned = true;
+	}
+}
+
 WL_EXPORT void
 weston_version(int *major, int *minor, int *micro)
 {
diff --git a/src/compositor.h b/src/compositor.h
index 76b0778..2e6ef9d 100644
--- a/src/compositor.h
+++ b/src/compositor.h
@@ -1343,6 +1343,11 @@ int
 weston_compositor_set_presentation_clock_software(
 					struct weston_compositor *compositor);
 void
+weston_compositor_read_presentation_clock(
+			const struct weston_compositor *compositor,
+			struct timespec *ts);
+
+void
 weston_compositor_shutdown(struct weston_compositor *ec);
 void
 weston_compositor_exit_with_code(struct weston_compositor *compositor,
-- 
2.0.5



More information about the wayland-devel mailing list