compositor-drm: deliver frame seq for feedback

Add 'msc' field to weston_output to maintain the refresh counter, and
use it in presentation_feedback.presented.

Make compositor-drm update the per-output refresh counter with the
values reported by DRM. If the DRM reported value jumps backwards,
assume it wrapped around once.

Other backends do not update weston_output::msc, and there
presentation_feedback will always deliver refresh counter as zero.

Signed-off-by: Pekka Paalanen <pekka.paalanen@collabora.co.uk>
v3 Reviewed-by: Mario Kleiner <mario.kleiner.de@gmail.com>
diff --git a/src/compositor-drm.c b/src/compositor-drm.c
index 626a2de..07b83a7 100644
--- a/src/compositor-drm.c
+++ b/src/compositor-drm.c
@@ -726,6 +726,17 @@
 }
 
 static void
+drm_output_update_msc(struct drm_output *output, unsigned int seq)
+{
+	uint64_t msc_hi = output->base.msc >> 32;
+
+	if (seq < (output->base.msc & 0xffffffff))
+		msc_hi++;
+
+	output->base.msc = (msc_hi << 32) + seq;
+}
+
+static void
 vblank_handler(int fd, unsigned int frame, unsigned int sec, unsigned int usec,
 	       void *data)
 {
@@ -733,6 +744,7 @@
 	struct drm_output *output = s->output;
 	struct timespec ts;
 
+	drm_output_update_msc(output, frame);
 	output->vblank_pending = 0;
 
 	drm_output_release_fb(output, s->current);
@@ -756,6 +768,8 @@
 	struct drm_output *output = (struct drm_output *) data;
 	struct timespec ts;
 
+	drm_output_update_msc(output, frame);
+
 	/* We don't set page_flip_pending on start_repaint_loop, in that case
 	 * we just want to page flip to the current buffer to get an accurate
 	 * timestamp */