aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorKeith Packard2017-07-01 02:43:15 -0500
committerDave Airlie2017-12-17 18:04:02 -0600
commitd4331dda5b5969922c4f1e3ad6d53f23becb91ab (patch)
treef6ee7cae925d839993c7e23acc2d185fe2a9073c
parentc4171535389d72e9135c9615cecd07b346fd6d7e (diff)
downloadexternal-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.c37
-rw-r--r--xf86drm.h12
-rw-r--r--xf86drmMode.c9
3 files changed, 57 insertions, 1 deletions
diff --git a/xf86drm.c b/xf86drm.c
index deb76e4b..74b4e230 100644
--- a/xf86drm.c
+++ b/xf86drm.c
@@ -1695,6 +1695,43 @@ int drmUpdateDrawableInfo(int fd, drm_drawable_t handle,
1695 return 0; 1695 return 0;
1696} 1696}
1697 1697
1698int 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
1716int 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 *
diff --git a/xf86drm.h b/xf86drm.h
index 0dbf4941..7773d71a 100644
--- a/xf86drm.h
+++ b/xf86drm.h
@@ -636,6 +636,12 @@ extern int drmCtlUninstHandler(int fd);
636extern int drmSetClientCap(int fd, uint64_t capability, 636extern int drmSetClientCap(int fd, uint64_t capability,
637 uint64_t value); 637 uint64_t value);
638 638
639extern int drmCrtcGetSequence(int fd, uint32_t crtcId,
640 uint64_t *sequence, uint64_t *ns);
641extern 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 */
640extern int drmMap(int fd, 646extern 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);
728extern int drmSetMaster(int fd); 734extern int drmSetMaster(int fd);
729extern int drmDropMaster(int fd); 735extern int drmDropMaster(int fd);
730 736
731#define DRM_EVENT_CONTEXT_VERSION 3 737#define DRM_EVENT_CONTEXT_VERSION 4
732 738
733typedef struct _drmEventContext { 739typedef 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
760extern int drmHandleEvent(int fd, drmEventContextPtr evctx); 770extern 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 }