Signed-off-by: Chunming Zhou <david1.zhou@xxxxxxx> --- xf86drm.c | 78 +++++++++++++++++++++++++++++++++++++++++++++++++++++++ xf86drm.h | 8 ++++++ 2 files changed, 86 insertions(+) diff --git a/xf86drm.c b/xf86drm.c index 49150d74..13f36b04 100644 --- a/xf86drm.c +++ b/xf86drm.c @@ -4212,6 +4212,40 @@ drm_public int drmSyncobjExportSyncFile(int fd, uint32_t handle, return 0; } +drm_public int drmSyncobjImportSyncFile2(int fd, uint32_t handle, + uint64_t point, + int sync_file_fd) +{ + struct drm_syncobj_handle2 args; + + memclear(args); + args.fd = sync_file_fd; + args.handle = handle; + args.point = point; + args.flags = DRM_SYNCOBJ_FD_TO_HANDLE_FLAGS_IMPORT_SYNC_FILE; + return drmIoctl(fd, DRM_IOCTL_SYNCOBJ_FD_TO_HANDLE2, &args); +} + +drm_public int drmSyncobjExportSyncFile2(int fd, uint32_t handle, + uint64_t point, + int *sync_file_fd) +{ + struct drm_syncobj_handle2 args; + int ret; + + memclear(args); + args.fd = -1; + args.handle = handle; + args.point = point; + args.flags = DRM_SYNCOBJ_HANDLE_TO_FD_FLAGS_EXPORT_SYNC_FILE; + ret = drmIoctl(fd, DRM_IOCTL_SYNCOBJ_HANDLE_TO_FD2, &args); + if (ret) + return ret; + *sync_file_fd = args.fd; + return 0; +} + + drm_public int drmSyncobjWait(int fd, uint32_t *handles, unsigned num_handles, int64_t timeout_nsec, unsigned flags, uint32_t *first_signaled) @@ -4261,3 +4295,47 @@ drm_public int drmSyncobjSignal(int fd, const uint32_t *handles, ret = drmIoctl(fd, DRM_IOCTL_SYNCOBJ_SIGNAL, &args); return ret; } + +drm_public int drmSyncobjTimelineWait(int fd, uint32_t *handles, uint64_t *points, + unsigned num_handles, + int64_t timeout_nsec, unsigned flags, + uint32_t *first_signaled) +{ + struct drm_syncobj_timeline_wait args; + int ret; + + memclear(args); + args.handles = (uintptr_t)handles; + args.points = (uint64_t)(uintptr_t)points; + args.timeout_nsec = timeout_nsec; + args.count_handles = num_handles; + args.flags = flags; + + ret = drmIoctl(fd, DRM_IOCTL_SYNCOBJ_TIMELINE_WAIT, &args); + if (ret < 0) + return -errno; + + if (first_signaled) + *first_signaled = args.first_signaled; + return ret; +} + + +drm_public int drmSyncobjQuery(int fd, uint32_t *handles, uint64_t *points, + uint32_t handle_count) +{ + struct drm_syncobj_timeline_query args; + int ret; + + memclear(args); + args.handles = (uintptr_t)handles; + args.points = (uint64_t)(uintptr_t)points; + args.count_handles = handle_count; + + ret = drmIoctl(fd, DRM_IOCTL_SYNCOBJ_QUERY, &args); + if (ret) + return ret; + return 0; +} + + diff --git a/xf86drm.h b/xf86drm.h index 7773d71a..2dae1694 100644 --- a/xf86drm.h +++ b/xf86drm.h @@ -870,11 +870,19 @@ extern int drmSyncobjFDToHandle(int fd, int obj_fd, uint32_t *handle); extern int drmSyncobjImportSyncFile(int fd, uint32_t handle, int sync_file_fd); extern int drmSyncobjExportSyncFile(int fd, uint32_t handle, int *sync_file_fd); +extern int drmSyncobjImportSyncFile2(int fd, uint32_t handle, uint64_t point, int sync_file_fd); +extern int drmSyncobjExportSyncFile2(int fd, uint32_t handle, uint64_t point, int *sync_file_fd); extern int drmSyncobjWait(int fd, uint32_t *handles, unsigned num_handles, int64_t timeout_nsec, unsigned flags, uint32_t *first_signaled); extern int drmSyncobjReset(int fd, const uint32_t *handles, uint32_t handle_count); extern int drmSyncobjSignal(int fd, const uint32_t *handles, uint32_t handle_count); +extern int drmSyncobjTimelineWait(int fd, uint32_t *handles, uint64_t *points, + unsigned num_handles, + int64_t timeout_nsec, unsigned flags, + uint32_t *first_signaled); +extern int drmSyncobjQuery(int fd, uint32_t *handles, uint64_t *points, + uint32_t handle_count); #if defined(__cplusplus) } -- 2.17.1 _______________________________________________ dri-devel mailing list dri-devel@xxxxxxxxxxxxxxxxxxxxx https://lists.freedesktop.org/mailman/listinfo/dri-devel