libweston: assert frame times never go backwards
Adding this check was prompted by
https://gitlab.freedesktop.org/wayland/weston/-/merge_requests/609
There is no reason to allow frame times jump backwards, and apparently
we already have code that makes that assumption.
DRM KMS uses CLOCK_MONOTONIC as the vblank and page flip timestamps,
which by definition cannot go backwards. Other backends call
weston_compositor_set_presentation_clock_software().
Frame times are also reported directly to Wayland clients via
presentation-time extension, and clients too will not expect that the
timestamp could go backwards.
So make sure time can never go backwards.
Signed-off-by: Pekka Paalanen <pekka.paalanen@collabora.com>
diff --git a/libweston/compositor.c b/libweston/compositor.c
index 6e96537..89f438a 100644
--- a/libweston/compositor.c
+++ b/libweston/compositor.c
@@ -3003,7 +3003,15 @@
int64_t msec_rel;
assert(output->repaint_status == REPAINT_AWAITING_COMPLETION);
- assert(stamp || (presented_flags & WP_PRESENTATION_FEEDBACK_INVALID));
+
+ /*
+ * If timestamp of latest vblank is given, it must always go forwards.
+ * If not given, INVALID flag must be set.
+ */
+ if (stamp)
+ assert(timespec_sub_to_nsec(stamp, &output->frame_time) >= 0);
+ else
+ assert(presented_flags & WP_PRESENTATION_FEEDBACK_INVALID);
weston_compositor_read_presentation_clock(compositor, &now);