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);