compositor, backends: weston_compositor_read_presentation_clock
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@osg.samsung.com> Signed-off-by: Pekka Paalanen <pekka.paalanen@collabora.co.uk> Reviewed-By: Derek Foreman <derekf@osg.samsung.com> Reviewed-by: Bryce Harrington <bryce@osg.samsung.com>
This commit is contained in:
@@ -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);
|
||||
}
|
||||
|
||||
@@ -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);
|
||||
}
|
||||
|
||||
@@ -202,7 +202,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;
|
||||
|
||||
@@ -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;
|
||||
|
||||
@@ -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;
|
||||
|
||||
@@ -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);
|
||||
}
|
||||
|
||||
|
||||
@@ -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;
|
||||
|
||||
@@ -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)
|
||||
{
|
||||
|
||||
@@ -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,
|
||||
|
||||
Reference in New Issue
Block a user