From: Pekka Paalanen <[email protected]> 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 <[email protected]> Signed-off-by: Pekka Paalanen <[email protected]> --- 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 _______________________________________________ wayland-devel mailing list [email protected] http://lists.freedesktop.org/mailman/listinfo/wayland-devel
