Message ID | 20181128145055.4178-3-christian.koenig@amd.com (mailing list archive) |
---|---|
State | New, archived |
Headers | show |
Series | [libdrm,1/5] new syncobj extension v2 | expand |
On 2018年11月28日 22:50, Christian König wrote: > From: Chunming Zhou <david1.zhou@amd.com> > > v2: drop export/import > > Signed-off-by: Chunming Zhou <david1.zhou@amd.com> > --- > xf86drm.c | 44 ++++++++++++++++++++++++++++++++++++++++++++ > xf86drm.h | 8 ++++++++ > 2 files changed, 52 insertions(+) > > diff --git a/xf86drm.c b/xf86drm.c > index 71ad54ba..afa2f466 100644 > --- a/xf86drm.c > +++ b/xf86drm.c > @@ -4277,3 +4277,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, We should change 'uint64_t *point' to 'uint64_t **points', otherwise, userspace always needs a copy to their own variable. -David > + 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) > }
Am 29.11.18 um 10:28 schrieb zhoucm1: > > > On 2018年11月28日 22:50, Christian König wrote: >> From: Chunming Zhou <david1.zhou@amd.com> >> >> v2: drop export/import >> >> Signed-off-by: Chunming Zhou <david1.zhou@amd.com> >> --- >> xf86drm.c | 44 ++++++++++++++++++++++++++++++++++++++++++++ >> xf86drm.h | 8 ++++++++ >> 2 files changed, 52 insertions(+) >> >> diff --git a/xf86drm.c b/xf86drm.c >> index 71ad54ba..afa2f466 100644 >> --- a/xf86drm.c >> +++ b/xf86drm.c >> @@ -4277,3 +4277,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, > We should change 'uint64_t *point' to 'uint64_t **points', otherwise, > userspace always needs a copy to their own variable. No, that was something I intentionally changed. It's irrelevant if userspace or kernel copies the variable and it is better suited in userspace to do this. Christian. > > -David >> + 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) >> } >
diff --git a/xf86drm.c b/xf86drm.c index 71ad54ba..afa2f466 100644 --- a/xf86drm.c +++ b/xf86drm.c @@ -4277,3 +4277,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) }