pepper: Implement compositor clock
authorTaekyun Kim <tkq.kim@samsung.com>
Wed, 2 Sep 2015 07:34:18 +0000 (16:34 +0900)
committer손정훈 <jh13.son@samsung.com>
Wed, 2 Sep 2015 10:04:50 +0000 (19:04 +0900)
Change-Id: I1fe399204e9bf9f9e02401bd7e796886ddada408

src/lib/drm/drm-common.c
src/lib/pepper/compositor.c
src/lib/pepper/output.c
src/lib/pepper/pepper-internal.h
src/lib/pepper/pepper.h

index 3eeab5c..9b95d9f 100644 (file)
@@ -99,6 +99,8 @@ pepper_drm_create(pepper_compositor_t *compositor, struct udev *udev, const char
     int                     ret;
     struct wl_event_loop   *loop;
     drm_magic_t             magic;
+    uint64_t                cap;
+    clockid_t               clock_id;
 
     drm = calloc(1, sizeof(pepper_drm_t));
     PEPPER_CHECK(drm, goto error, "calloc() failed.\n");
@@ -168,6 +170,17 @@ pepper_drm_create(pepper_compositor_t *compositor, struct udev *udev, const char
     drm_init_planes(drm);
     udev_device_unref(udev_device);
 
+    /* Try to set clock. */
+    ret = drmGetCap(drm->fd, DRM_CAP_TIMESTAMP_MONOTONIC, &cap);
+
+    if (ret == 0 && cap == 1)
+        clock_id = CLOCK_MONOTONIC;
+    else
+        clock_id = CLOCK_REALTIME;
+
+    if (!pepper_compositor_set_clock_id(compositor, clock_id))
+        goto error;
+
     return drm;
 
 error:
index 4b7bf19..6412c23 100644 (file)
@@ -107,6 +107,7 @@ pepper_compositor_create(const char *socket_name)
         goto error;
     }
 
+    compositor->clock_id = CLOCK_MONOTONIC;
     return compositor;
 
 error:
@@ -190,3 +191,33 @@ pepper_compositor_pick_view(pepper_compositor_t *compositor,
 
     return NULL;
 }
+
+PEPPER_API pepper_bool_t
+pepper_compositor_set_clock_id(pepper_compositor_t *compositor, clockid_t id)
+{
+    struct timespec ts;
+
+    if (compositor->clock_used)
+    {
+        if (compositor->clock_id == id)
+            return PEPPER_TRUE;
+    }
+
+    if (clock_gettime(id, &ts) < 0)
+        return PEPPER_FALSE;
+
+    compositor->clock_id = id;
+    compositor->clock_used = PEPPER_TRUE;
+
+    return PEPPER_TRUE;
+}
+
+PEPPER_API pepper_bool_t
+pepper_compositor_get_time(pepper_compositor_t *compositor, struct timespec *ts)
+{
+    if (clock_gettime(compositor->clock_id, ts) < 0)
+        return PEPPER_FALSE;
+
+    compositor->clock_used = PEPPER_TRUE;
+    return PEPPER_TRUE;
+}
index 15904ae..36ae445 100644 (file)
@@ -150,7 +150,9 @@ output_repaint(pepper_output_t *output)
     pepper_list_for_each(view, &output->view_list, link)
     {
         /* TODO: Output time stamp and presentation feedback. */
-        pepper_surface_send_frame_callback_done(view->surface, 0);
+        pepper_surface_send_frame_callback_done(view->surface,
+                                                output->frame.time.tv_sec * 1000 +
+                                                output->frame.time.tv_nsec / 1000000);
     }
 }
 
@@ -193,6 +195,11 @@ pepper_output_finish_frame(pepper_output_t *output, struct timespec *ts)
 {
     output->frame.pending = PEPPER_FALSE;
 
+    if (ts)
+        output->frame.time = *ts;
+    else
+        pepper_compositor_get_time(output->compositor, &output->frame.time);
+
     /* TODO: Better repaint scheduling by putting a delay before repaint. */
     if (output->frame.scheduled)
         output_repaint(output);
index d617a9b..e0579dd 100644 (file)
@@ -62,6 +62,9 @@ struct pepper_compositor
 
     uint32_t            output_id_allocator;
     pepper_bool_t       update_scheduled;
+
+    clockid_t           clock_id;
+    pepper_bool_t       clock_used;
 };
 
 void
@@ -91,6 +94,7 @@ struct pepper_output
     struct {
         pepper_bool_t           scheduled;
         pepper_bool_t           pending;
+        struct timespec         time;
     } frame;
 
     pepper_list_t               plane_list;
index 62928fd..265b016 100644 (file)
@@ -270,6 +270,12 @@ PEPPER_API pepper_view_t *
 pepper_compositor_pick_view(pepper_compositor_t *compositor,
                             double x, double y, double *vx, double *vy);
 
+PEPPER_API pepper_bool_t
+pepper_compositor_set_clock_id(pepper_compositor_t *compositor, clockid_t id);
+
+PEPPER_API pepper_bool_t
+pepper_compositor_get_time(pepper_compositor_t *compositor, struct timespec *ts);
+
 /* Output. */
 PEPPER_API void
 pepper_output_destroy(pepper_output_t *output);