diff options
| -rw-r--r-- | libdrm/xf86drm.h | 6 | ||||
| -rw-r--r-- | libdrm/xf86drmMode.c | 25 | ||||
| -rw-r--r-- | libdrm/xf86drmMode.h | 2 | ||||
| -rw-r--r-- | shared-core/drm.h | 2 | ||||
| -rw-r--r-- | shared-core/drm_mode.h | 11 | 
5 files changed, 45 insertions, 1 deletions
| 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); diff --git a/shared-core/drm.h b/shared-core/drm.h index 089e184a..c381874f 100644 --- a/shared-core/drm.h +++ b/shared-core/drm.h @@ -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; diff --git a/shared-core/drm_mode.h b/shared-core/drm_mode.h index 9b92733d..fceac3c8 100644 --- a/shared-core/drm_mode.h +++ b/shared-core/drm_mode.h @@ -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 | 
