From b80bcffba6175c53ebe1f1bd02730de0338cc039 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Kristian=20H=C3=B8gsberg?= Date: Thu, 12 Nov 2009 14:06:45 -0500 Subject: libdrm: add libdrm support for page flip ioctl --- libdrm/xf86drm.h | 6 ++++++ libdrm/xf86drmMode.c | 25 ++++++++++++++++++++++++- libdrm/xf86drmMode.h | 2 ++ 3 files changed, 32 insertions(+), 1 deletion(-) (limited to 'libdrm') diff --git a/libdrm/xf86drm.h b/libdrm/xf86drm.h index 2cb9c9e9..0c1fcbbf 100644 --- a/libdrm/xf86drm.h +++ b/libdrm/xf86drm.h @@ -682,6 +682,12 @@ typedef struct _drmEventContext { unsigned int tv_usec, void *user_data); + void (*page_flip_handler)(int fd, + unsigned int sequence, + unsigned int tv_sec, + unsigned int tv_usec, + void *user_data); + } drmEventContext, *drmEventContextPtr; extern int drmHandleEvent(int fd, drmEventContextPtr evctx); diff --git a/libdrm/xf86drmMode.c b/libdrm/xf86drmMode.c index 6d85113a..e9516851 100644 --- a/libdrm/xf86drmMode.c +++ b/libdrm/xf86drmMode.c @@ -700,7 +700,17 @@ int drmHandleEvent(int fd, drmEventContextPtr evctx) vblank->tv_usec, U642VOID (vblank->user_data)); break; - + case DRM_EVENT_FLIP_COMPLETE: + if (evctx->version < 1 || + evctx->page_flip_handler == NULL) + break; + vblank = (struct drm_event_vblank *) e; + evctx->page_flip_handler(fd, + vblank->sequence, + vblank->tv_sec, + vblank->tv_usec, + U642VOID (vblank->user_data)); + break; default: break; } @@ -710,3 +720,16 @@ int drmHandleEvent(int fd, drmEventContextPtr evctx) return 0; } +int drmModePageFlip(int fd, uint32_t crtc_id, uint32_t fb_id, + uint32_t flags, void *user_data) +{ + struct drm_mode_crtc_page_flip flip; + + flip.fb_id = fb_id; + flip.crtc_id = crtc_id; + flip.user_data = VOID2U64(user_data); + flip.flags = flags; + flip.reserved = 0; + + return drmIoctl(fd, DRM_IOCTL_MODE_PAGE_FLIP, &flip); +} diff --git a/libdrm/xf86drmMode.h b/libdrm/xf86drmMode.h index 62304bb9..705369fe 100644 --- a/libdrm/xf86drmMode.h +++ b/libdrm/xf86drmMode.h @@ -362,3 +362,5 @@ extern int drmModeCrtcSetGamma(int fd, uint32_t crtc_id, uint32_t size, uint16_t *red, uint16_t *green, uint16_t *blue); extern int drmModeCrtcGetGamma(int fd, uint32_t crtc_id, uint32_t size, uint16_t *red, uint16_t *green, uint16_t *blue); +extern int drmModePageFlip(int fd, uint32_t crtc_id, uint32_t fb_id, + uint32_t flags, void *user_data); -- cgit v1.2.3