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");
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:
goto error;
}
+ compositor->clock_id = CLOCK_MONOTONIC;
return compositor;
error:
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;
+}
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);
}
}
{
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);
uint32_t output_id_allocator;
pepper_bool_t update_scheduled;
+
+ clockid_t clock_id;
+ pepper_bool_t clock_used;
};
void
struct {
pepper_bool_t scheduled;
pepper_bool_t pending;
+ struct timespec time;
} frame;
pepper_list_t plane_list;
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);