From: Pekka Paalanen <pekka.paala...@collabora.co.uk>

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.paala...@collabora.co.uk>
---
 src/compositor-drm.c | 14 ++++++++++++++
 src/compositor.c     |  2 +-
 src/compositor.h     |  1 +
 3 files changed, 16 insertions(+), 1 deletion(-)

diff --git a/src/compositor-drm.c b/src/compositor-drm.c
index 533eb0e..aac3d1d 100644
--- a/src/compositor-drm.c
+++ b/src/compositor-drm.c
@@ -712,6 +712,17 @@ finish_frame:
 }
 
 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)
 {
@@ -719,6 +730,7 @@ vblank_handler(int fd, unsigned int frame, unsigned int 
sec, unsigned int usec,
        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);
@@ -742,6 +754,8 @@ page_flip_handler(int fd, unsigned int frame,
        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 */
diff --git a/src/compositor.c b/src/compositor.c
index c11e82b..c05167d 100644
--- a/src/compositor.c
+++ b/src/compositor.c
@@ -1901,7 +1901,7 @@ weston_output_finish_frame(struct weston_output *output,
        refresh_nsec = 1000000000000UL / output->current_mode->refresh;
        weston_presentation_feedback_present_list(&output->feedback_list,
                                                  output, refresh_nsec, stamp,
-                                                 0);
+                                                 output->msc);
 
        output->frame_time = stamp->tv_sec * 1000 + stamp->tv_nsec / 1000000;
 
diff --git a/src/compositor.h b/src/compositor.h
index 0dcc414..c94f836 100644
--- a/src/compositor.h
+++ b/src/compositor.h
@@ -198,6 +198,7 @@ struct weston_output {
        struct wl_signal move_signal;
        int move_x, move_y;
        uint32_t frame_time; /* presentation timestamp in milliseconds */
+       uint64_t msc;        /* media stream counter */
        int disable_planes;
        int destroying;
        struct wl_list feedback_list;
-- 
1.8.3.2

_______________________________________________
wayland-devel mailing list
wayland-devel@lists.freedesktop.org
http://lists.freedesktop.org/mailman/listinfo/wayland-devel

Reply via email to