commit 943d5ba069efe28332cce14a36574361e50691fd
parent d305f919485298557389679c8cbebf481fda36c5
Author: Michael Forney <mforney@mforney.org>
Date: Wed, 11 Sep 2013 17:25:00 -0700
drm: Calculate frame time from page flip event
Diffstat:
3 files changed, 14 insertions(+), 11 deletions(-)
diff --git a/libswc/compositor.c b/libswc/compositor.c
@@ -274,20 +274,15 @@ static void handle_drm_event(struct wl_listener * listener, void * data)
{
case SWC_DRM_PAGE_FLIP:
{
- struct swc_output * output = event->data;
+ struct swc_drm_event_data * event_data = event->data;
struct swc_surface * surface;
- struct timeval timeval;
- uint32_t time;
- gettimeofday(&timeval, NULL);
- time = timeval.tv_sec * 1000 + timeval.tv_usec / 1000;
-
- compositor->pending_flips &= ~SWC_OUTPUT_MASK(output);
+ compositor->pending_flips &= ~SWC_OUTPUT_MASK(event_data->output);
if (compositor->pending_flips == 0)
{
wl_list_for_each(surface, &compositor->surfaces, link)
- swc_surface_send_frame_callbacks(surface, time);
+ swc_surface_send_frame_callbacks(surface, event_data->time);
}
/* If we had scheduled updates that couldn't run because we were
diff --git a/libswc/drm.c b/libswc/drm.c
@@ -255,12 +255,14 @@ static void handle_page_flip(int fd, unsigned int sequence, unsigned int sec,
unsigned int usec, void * data)
{
struct swc_output * output = data;
-
- printf("page flip\n");
+ struct swc_drm_event_data event_data = {
+ .time = sec * 1000 + usec / 1000,
+ .output = output
+ };
/* XXX: It doesn't make sense for multiple things to be listening for page
* flips (or does it?). Maybe this should be a callback instead? */
- swc_send_event(&output->drm->event_signal, SWC_DRM_PAGE_FLIP, output);
+ swc_send_event(&output->drm->event_signal, SWC_DRM_PAGE_FLIP, &event_data);
}
static drmEventContext event_context = {
diff --git a/libswc/drm.h b/libswc/drm.h
@@ -13,6 +13,12 @@ enum swc_drm_event
SWC_DRM_PAGE_FLIP
};
+struct swc_drm_event_data
+{
+ uint32_t time;
+ struct swc_output * output;
+};
+
struct swc_drm
{
int fd;