You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

libdrm-page-flip.patch 4.9KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174
  1. diff --git a/libdrm/xf86drm.h b/libdrm/xf86drm.h
  2. index c1d173c..67bea37 100644
  3. --- a/libdrm/xf86drm.h
  4. +++ b/libdrm/xf86drm.h
  5. @@ -667,4 +667,22 @@ extern void drmMsg(const char *format, ...);
  6. extern int drmSetMaster(int fd);
  7. extern int drmDropMaster(int fd);
  8. +#define DRM_EVENT_CONTEXT_VERSION 1
  9. +
  10. +typedef struct _drmEventContext {
  11. +
  12. + /* This struct is versioned so we can add more pointers if we
  13. + * add more events. */
  14. + int version;
  15. +
  16. + void (*page_flip_handler)(int fd,
  17. + unsigned int frame,
  18. + unsigned int tv_sec,
  19. + unsigned int tv_usec,
  20. + void *user_data);
  21. +
  22. +} drmEventContext, *drmEventContextPtr;
  23. +
  24. +extern int drmHandleEvent(int fd, drmEventContextPtr evctx);
  25. +
  26. #endif
  27. diff --git a/libdrm/xf86drmMode.c b/libdrm/xf86drmMode.c
  28. index ea11207..f601a00 100644
  29. --- a/libdrm/xf86drmMode.c
  30. +++ b/libdrm/xf86drmMode.c
  31. @@ -664,3 +664,56 @@ int drmModeCrtcSetGamma(int fd, uint32_t crtc_id, uint32_t size,
  32. return 0;
  33. }
  34. +
  35. +int drmModePageFlip(int fd, uint32_t crtc_id, uint32_t fb_id, void *user_data)
  36. +{
  37. + struct drm_mode_page_flip flip;
  38. +
  39. + flip.fb_id = fb_id;
  40. + flip.crtc_id = crtc_id;
  41. + flip.user_data = VOID2U64(user_data);
  42. + flip.flags = 0;
  43. +
  44. + return drmIoctl(fd, DRM_IOCTL_MODE_PAGE_FLIP, &flip);
  45. +}
  46. +
  47. +int drmHandleEvent(int fd, drmEventContextPtr evctx)
  48. +{
  49. + char buffer[1024];
  50. + int len, i;
  51. + struct drm_event *e;
  52. + struct drm_event_page_flip *page_flip;
  53. +
  54. + /* The DRM read semantics guarantees that we always get only
  55. + * complete events. */
  56. +
  57. + len = read(fd, buffer, sizeof buffer);
  58. + if (len == 0)
  59. + return 0;
  60. + if (len < sizeof *e)
  61. + return -1;
  62. +
  63. + i = 0;
  64. + while (i < len) {
  65. + e = (struct drm_event *) &buffer[i];
  66. + switch (e->type) {
  67. + case DRM_EVENT_MODE_PAGE_FLIP:
  68. + if (evctx->version < 1 ||
  69. + evctx->page_flip_handler == NULL)
  70. + break;
  71. + page_flip = (struct drm_event_page_flip *) e;
  72. + evctx->page_flip_handler(fd,
  73. + page_flip->frame,
  74. + page_flip->tv_sec,
  75. + page_flip->tv_usec,
  76. + U642VOID (page_flip->user_data));
  77. + break;
  78. +
  79. + default:
  80. + break;
  81. + }
  82. + i += e->length;
  83. + }
  84. +
  85. + return 0;
  86. +}
  87. diff --git a/libdrm/xf86drmMode.h b/libdrm/xf86drmMode.h
  88. index 62304bb..fe64707 100644
  89. --- a/libdrm/xf86drmMode.h
  90. +++ b/libdrm/xf86drmMode.h
  91. @@ -259,8 +259,6 @@ typedef struct _drmModeConnector {
  92. uint32_t *encoders; /**< List of encoder ids */
  93. } drmModeConnector, *drmModeConnectorPtr;
  94. -
  95. -
  96. extern void drmModeFreeModeInfo( drmModeModeInfoPtr ptr );
  97. extern void drmModeFreeResources( drmModeResPtr ptr );
  98. extern void drmModeFreeFB( drmModeFBPtr ptr );
  99. @@ -362,3 +360,4 @@ extern int drmModeCrtcSetGamma(int fd, uint32_t crtc_id, uint32_t size,
  100. uint16_t *red, uint16_t *green, uint16_t *blue);
  101. extern int drmModeCrtcGetGamma(int fd, uint32_t crtc_id, uint32_t size,
  102. uint16_t *red, uint16_t *green, uint16_t *blue);
  103. +extern int drmModePageFlip(int fd, uint32_t crtc_id, uint32_t fb_id, void *user_data);
  104. diff --git a/shared-core/drm.h b/shared-core/drm.h
  105. index 97fab9a..8b504cb 100644
  106. --- a/shared-core/drm.h
  107. +++ b/shared-core/drm.h
  108. @@ -1113,6 +1113,7 @@ struct drm_gem_open {
  109. #define DRM_IOCTL_MODE_GETFB DRM_IOWR(0xAD, struct drm_mode_fb_cmd)
  110. #define DRM_IOCTL_MODE_ADDFB DRM_IOWR(0xAE, struct drm_mode_fb_cmd)
  111. #define DRM_IOCTL_MODE_RMFB DRM_IOWR(0xAF, uint32_t)
  112. +#define DRM_IOCTL_MODE_PAGE_FLIP DRM_IOW( 0xB0, struct drm_mode_page_flip)
  113. /*@}*/
  114. @@ -1128,6 +1129,30 @@ struct drm_gem_open {
  115. #define DRM_COMMAND_BASE 0x40
  116. #define DRM_COMMAND_END 0xA0
  117. +/**
  118. + * Header for events written back to userspace on the drm fd. The
  119. + * type defines the type of event, the length specifies the total
  120. + * length of the event (including the header), and user_data is
  121. + * typically a 64 bit value passed with the ioctl that triggered the
  122. + * event. A read on the drm fd will always only return complete
  123. + * events, that is, if for example the read buffer is 100 bytes, and
  124. + * there are two 64 byte events pending, only one will be returned.
  125. + */
  126. +struct drm_event {
  127. + uint32_t type;
  128. + uint32_t length;
  129. +};
  130. +
  131. +#define DRM_EVENT_MODE_PAGE_FLIP 0x01
  132. +
  133. +struct drm_event_page_flip {
  134. + struct drm_event base;
  135. + uint64_t user_data;
  136. + uint32_t tv_sec;
  137. + uint32_t tv_usec;
  138. + uint32_t frame;
  139. +};
  140. +
  141. /* typedef area */
  142. #ifndef __KERNEL__
  143. typedef struct drm_clip_rect drm_clip_rect_t;
  144. diff --git a/shared-core/drm_mode.h b/shared-core/drm_mode.h
  145. index 9b92733..bebe4e7 100644
  146. --- a/shared-core/drm_mode.h
  147. +++ b/shared-core/drm_mode.h
  148. @@ -270,4 +270,20 @@ struct drm_mode_crtc_lut {
  149. uint64_t blue;
  150. };
  151. +#define DRM_MODE_PAGE_FLIP_WAIT (1<<0) /* block on previous page flip */
  152. +#define DRM_MODE_PAGE_FLIP_FLAGS_MASK (DRM_MODE_PAGE_FLIP_WAIT)
  153. +
  154. +struct drm_mode_page_flip {
  155. + /** Handle of new front buffer */
  156. + uint32_t fb_id;
  157. + uint32_t crtc_id;
  158. +
  159. + /* 64 bit cookie returned to userspace in the page flip event. */
  160. + uint64_t user_data;
  161. + /**
  162. + * page flip flags (wait on flip only for now)
  163. + */
  164. + uint32_t flags;
  165. +};
  166. +
  167. #endif