diff --git a/xf86drm.h b/xf86drm.h index 6d91dfbd..8db40bdd 100644 --- a/xf86drm.h +++ b/xf86drm.h @@ -770,7 +770,7 @@ extern int drmSetMaster(int fd); extern int drmDropMaster(int fd); extern int drmIsMaster(int fd); -#define DRM_EVENT_CONTEXT_VERSION 4 +#define DRM_EVENT_CONTEXT_VERSION 5 typedef struct _drmEventContext { @@ -801,6 +801,11 @@ typedef struct _drmEventContext { uint64_t sequence, uint64_t ns, uint64_t user_data); + + void (*atomic_hw_done_handler)(int fd, + unsigned int tv_sec, + unsigned int tv_usec, + void *user_data); } drmEventContext, *drmEventContextPtr; extern int drmHandleEvent(int fd, drmEventContextPtr evctx); diff --git a/xf86drmMode.c b/xf86drmMode.c index a4873a0f..108649ab 100644 --- a/xf86drmMode.c +++ b/xf86drmMode.c @@ -1036,6 +1036,7 @@ drm_public int drmHandleEvent(int fd, drmEventContextPtr evctx) struct drm_event *e; struct drm_event_vblank *vblank; struct drm_event_crtc_sequence *seq; + struct drm_event_atomic_hw_done *atomic_hw_done; void *user_data; /* The DRM read semantics guarantees that we always get only @@ -1088,6 +1089,16 @@ drm_public int drmHandleEvent(int fd, drmEventContextPtr evctx) seq->time_ns, seq->user_data); break; + case DRM_EVENT_ATOMIC_HW_DONE: + atomic_hw_done = (struct drm_event_atomic_hw_done *) e; + user_data = U642VOID (atomic_hw_done->user_data); + + if (evctx->version >= 5 && evctx->atomic_hw_done_handler) + evctx->atomic_hw_done_handler(fd, + atomic_hw_done->tv_sec, + atomic_hw_done->tv_usec, + user_data); + break; default: break; }