OSDN Git Service

libdrm: add libdrm support for page flip ioctl
authorKristian Høgsberg <krh@sasori.(none)>
Thu, 12 Nov 2009 19:06:45 +0000 (14:06 -0500)
committerJesse Barnes <jbarnes@virtuousgeek.org>
Fri, 20 Nov 2009 22:53:27 +0000 (14:53 -0800)
libdrm/xf86drm.h
libdrm/xf86drmMode.c
libdrm/xf86drmMode.h
shared-core/drm.h
shared-core/drm_mode.h

index 2cb9c9e..0c1fcbb 100644 (file)
@@ -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);
index 6d85113..e951685 100644 (file)
@@ -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);
+}
index 62304bb..705369f 100644 (file)
@@ -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);
index 089e184..c381874 100644 (file)
@@ -795,6 +795,7 @@ struct drm_gem_open {
 #define DRM_IOCTL_MODE_GETFB           DRM_IOWR(0xAD, struct drm_mode_fb_cmd)
 #define DRM_IOCTL_MODE_ADDFB           DRM_IOWR(0xAE, struct drm_mode_fb_cmd)
 #define DRM_IOCTL_MODE_RMFB            DRM_IOWR(0xAF, uint32_t)
+#define DRM_IOCTL_MODE_PAGE_FLIP       DRM_IOWR(0xB0, struct drm_mode_crtc_page_flip)
 
 /*@}*/
 
@@ -827,6 +828,7 @@ struct drm_event {
 };
 
 #define DRM_EVENT_VBLANK 0x01
+#define DRM_EVENT_FLIP_COMPLETE 0x02
 
 struct drm_event_vblank {
        struct drm_event base;
index 9b92733..fceac3c 100644 (file)
@@ -270,4 +270,15 @@ struct drm_mode_crtc_lut {
        uint64_t blue;
 };
 
+#define DRM_MODE_PAGE_FLIP_EVENT 0x01
+#define DRM_MODE_PAGE_FLIP_FLAGS DRM_MODE_PAGE_FLIP_EVENT
+
+struct drm_mode_crtc_page_flip {
+       uint32_t crtc_id;
+       uint32_t fb_id;
+       uint32_t flags;
+       uint32_t reserved;
+       uint64_t user_data;
+};
+
 #endif