diff options
author | Keith Packard | 2017-07-01 02:43:15 -0500 |
---|---|---|
committer | Dave Airlie | 2017-12-17 18:04:02 -0600 |
commit | d4331dda5b5969922c4f1e3ad6d53f23becb91ab (patch) | |
tree | f6ee7cae925d839993c7e23acc2d185fe2a9073c | |
parent | c4171535389d72e9135c9615cecd07b346fd6d7e (diff) | |
download | external-libdrm-d4331dda5b5969922c4f1e3ad6d53f23becb91ab.tar.gz external-libdrm-d4331dda5b5969922c4f1e3ad6d53f23becb91ab.tar.xz external-libdrm-d4331dda5b5969922c4f1e3ad6d53f23becb91ab.zip |
drm: Add CrtcGetSequence and CrtcQueueSequence IOCTLs [v2]
These provide a crtc-id based interface to get the current sequence
(frame) number and to queue an event to be delivered at a specific sequence.
v2: Remove FIRST_PIXEL_OUT flag. This has been removed from the
proposed kernel API
Signed-off-by: Keith Packard <keithp@keithp.com>
Signed-off-by: Dave Airlie <airlied@redhat.com>
-rw-r--r-- | xf86drm.c | 37 | ||||
-rw-r--r-- | xf86drm.h | 12 | ||||
-rw-r--r-- | xf86drmMode.c | 9 |
3 files changed, 57 insertions, 1 deletions
@@ -1695,6 +1695,43 @@ int drmUpdateDrawableInfo(int fd, drm_drawable_t handle, | |||
1695 | return 0; | 1695 | return 0; |
1696 | } | 1696 | } |
1697 | 1697 | ||
1698 | int drmCrtcGetSequence(int fd, uint32_t crtcId, uint64_t *sequence, uint64_t *ns) | ||
1699 | { | ||
1700 | struct drm_crtc_get_sequence get_seq; | ||
1701 | int ret; | ||
1702 | |||
1703 | memclear(get_seq); | ||
1704 | get_seq.crtc_id = crtcId; | ||
1705 | ret = drmIoctl(fd, DRM_IOCTL_CRTC_GET_SEQUENCE, &get_seq); | ||
1706 | if (ret) | ||
1707 | return ret; | ||
1708 | |||
1709 | if (sequence) | ||
1710 | *sequence = get_seq.sequence; | ||
1711 | if (ns) | ||
1712 | *ns = get_seq.sequence_ns; | ||
1713 | return 0; | ||
1714 | } | ||
1715 | |||
1716 | int drmCrtcQueueSequence(int fd, uint32_t crtcId, uint32_t flags, uint64_t sequence, | ||
1717 | uint64_t *sequence_queued, uint64_t user_data) | ||
1718 | { | ||
1719 | struct drm_crtc_queue_sequence queue_seq; | ||
1720 | int ret; | ||
1721 | |||
1722 | memclear(queue_seq); | ||
1723 | queue_seq.crtc_id = crtcId; | ||
1724 | queue_seq.flags = flags; | ||
1725 | queue_seq.sequence = sequence; | ||
1726 | queue_seq.user_data = user_data; | ||
1727 | |||
1728 | ret = drmIoctl(fd, DRM_IOCTL_CRTC_QUEUE_SEQUENCE, &queue_seq); | ||
1729 | if (ret == 0 && sequence_queued) | ||
1730 | *sequence_queued = queue_seq.sequence; | ||
1731 | |||
1732 | return ret; | ||
1733 | } | ||
1734 | |||
1698 | /** | 1735 | /** |
1699 | * Acquire the AGP device. | 1736 | * Acquire the AGP device. |
1700 | * | 1737 | * |
@@ -636,6 +636,12 @@ extern int drmCtlUninstHandler(int fd); | |||
636 | extern int drmSetClientCap(int fd, uint64_t capability, | 636 | extern int drmSetClientCap(int fd, uint64_t capability, |
637 | uint64_t value); | 637 | uint64_t value); |
638 | 638 | ||
639 | extern int drmCrtcGetSequence(int fd, uint32_t crtcId, | ||
640 | uint64_t *sequence, uint64_t *ns); | ||
641 | extern int drmCrtcQueueSequence(int fd, uint32_t crtcId, | ||
642 | uint32_t flags, uint64_t sequence, | ||
643 | uint64_t *sequence_queued, | ||
644 | uint64_t user_data); | ||
639 | /* General user-level programmer's API: authenticated client and/or X */ | 645 | /* General user-level programmer's API: authenticated client and/or X */ |
640 | extern int drmMap(int fd, | 646 | extern int drmMap(int fd, |
641 | drm_handle_t handle, | 647 | drm_handle_t handle, |
@@ -728,7 +734,7 @@ extern void drmMsg(const char *format, ...) DRM_PRINTFLIKE(1, 2); | |||
728 | extern int drmSetMaster(int fd); | 734 | extern int drmSetMaster(int fd); |
729 | extern int drmDropMaster(int fd); | 735 | extern int drmDropMaster(int fd); |
730 | 736 | ||
731 | #define DRM_EVENT_CONTEXT_VERSION 3 | 737 | #define DRM_EVENT_CONTEXT_VERSION 4 |
732 | 738 | ||
733 | typedef struct _drmEventContext { | 739 | typedef struct _drmEventContext { |
734 | 740 | ||
@@ -755,6 +761,10 @@ typedef struct _drmEventContext { | |||
755 | unsigned int crtc_id, | 761 | unsigned int crtc_id, |
756 | void *user_data); | 762 | void *user_data); |
757 | 763 | ||
764 | void (*sequence_handler)(int fd, | ||
765 | uint64_t sequence, | ||
766 | uint64_t ns, | ||
767 | uint64_t user_data); | ||
758 | } drmEventContext, *drmEventContextPtr; | 768 | } drmEventContext, *drmEventContextPtr; |
759 | 769 | ||
760 | extern int drmHandleEvent(int fd, drmEventContextPtr evctx); | 770 | extern int drmHandleEvent(int fd, drmEventContextPtr evctx); |
diff --git a/xf86drmMode.c b/xf86drmMode.c index eddad8c4..15957ffc 100644 --- a/xf86drmMode.c +++ b/xf86drmMode.c | |||
@@ -889,6 +889,7 @@ int drmHandleEvent(int fd, drmEventContextPtr evctx) | |||
889 | int len, i; | 889 | int len, i; |
890 | struct drm_event *e; | 890 | struct drm_event *e; |
891 | struct drm_event_vblank *vblank; | 891 | struct drm_event_vblank *vblank; |
892 | struct drm_event_crtc_sequence *seq; | ||
892 | void *user_data; | 893 | void *user_data; |
893 | 894 | ||
894 | /* The DRM read semantics guarantees that we always get only | 895 | /* The DRM read semantics guarantees that we always get only |
@@ -933,6 +934,14 @@ int drmHandleEvent(int fd, drmEventContextPtr evctx) | |||
933 | vblank->tv_usec, | 934 | vblank->tv_usec, |
934 | user_data); | 935 | user_data); |
935 | break; | 936 | break; |
937 | case DRM_EVENT_CRTC_SEQUENCE: | ||
938 | seq = (struct drm_event_crtc_sequence *) e; | ||
939 | if (evctx->version >= 4 && evctx->sequence_handler) | ||
940 | evctx->sequence_handler(fd, | ||
941 | seq->sequence, | ||
942 | seq->time_ns, | ||
943 | seq->user_data); | ||
944 | break; | ||
936 | default: | 945 | default: |
937 | break; | 946 | break; |
938 | } | 947 | } |