<div dir="auto"><div><br><div class="gmail_extra"><br><div class="gmail_quote">On 9 Sep. 2017 2:30 am, "Marek Olšák" <<a href="mailto:maraeo@gmail.com">maraeo@gmail.com</a>> wrote:<br type="attribution"><blockquote class="quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">What's the difference between HandleToFD and ExportSyncFile?<br></blockquote></div></div></div><div dir="auto"><br></div><div dir="auto">One just gives you an FD for sharing the syncobj itself, the other exports the syncobj state into a sync file and you get to do sync file stuff with it.</div><div dir="auto"><br></div><div dir="auto">A) is for process sharing</div><div dir="auto">B) for interop with sync files</div><div dir="auto"><br></div><div dir="auto">Dave.</div><div dir="auto"><br></div><div dir="auto"><div class="gmail_extra"><div class="gmail_quote"><blockquote class="quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">
<br>
Thanks,<br>
Marek<br>
<div class="elided-text"><br>
On Sat, Jun 17, 2017 at 3:06 AM, Dave Airlie <<a href="mailto:airlied@gmail.com">airlied@gmail.com</a>> wrote:<br>
> From: Dave Airlie <<a href="mailto:airlied@redhat.com">airlied@redhat.com</a>><br>
><br>
> These ioctls are now in drm next so add the first set of libdrm APIs.<br>
><br>
> Signed-off-by: Dave Airlie <<a href="mailto:airlied@redhat.com">airlied@redhat.com</a>><br>
> ---<br>
>  include/drm/drm.h | 26 ++++++++++++++++++<br>
>  xf86drm.c         | 81 ++++++++++++++++++++++++++++++<wbr>+++++++++++++++++++++++++<br>
>  xf86drm.h         |  8 ++++++<br>
>  3 files changed, 115 insertions(+)<br>
><br>
> diff --git a/include/drm/drm.h b/include/drm/drm.h<br>
> index 1e7a4bc..bf3674a 100644<br>
> --- a/include/drm/drm.h<br>
> +++ b/include/drm/drm.h<br>
> @@ -642,6 +642,7 @@ struct drm_gem_open {<br>
>  #define DRM_CAP_ADDFB2_MODIFIERS       0x10<br>
>  #define DRM_CAP_PAGE_FLIP_TARGET       0x11<br>
>  #define DRM_CAP_CRTC_IN_VBLANK_EVENT   0x12<br>
> +#define DRM_CAP_SYNCOBJ                0x13<br>
><br>
>  /** DRM_IOCTL_GET_CAP ioctl argument type */<br>
>  struct drm_get_cap {<br>
> @@ -691,6 +692,26 @@ struct drm_prime_handle {<br>
>         __s32 fd;<br>
>  };<br>
><br>
> +struct drm_syncobj_create {<br>
> +       __u32 handle;<br>
> +       __u32 flags;<br>
> +};<br>
> +<br>
> +struct drm_syncobj_destroy {<br>
> +       __u32 handle;<br>
> +       __u32 pad;<br>
> +};<br>
> +<br>
> +#define DRM_SYNCOBJ_FD_TO_HANDLE_<wbr>FLAGS_IMPORT_SYNC_FILE (1 << 0)<br>
> +#define DRM_SYNCOBJ_HANDLE_TO_FD_<wbr>FLAGS_EXPORT_SYNC_FILE (1 << 0)<br>
> +struct drm_syncobj_handle {<br>
> +       __u32 handle;<br>
> +       __u32 flags;<br>
> +<br>
> +       __s32 fd;<br>
> +       __u32 pad;<br>
> +};<br>
> +<br>
>  #if defined(__cplusplus)<br>
>  }<br>
>  #endif<br>
> @@ -809,6 +830,11 @@ extern "C" {<br>
>  #define DRM_IOCTL_MODE_CREATEPROPBLOB  DRM_IOWR(0xBD, struct drm_mode_create_blob)<br>
>  #define DRM_IOCTL_MODE_DESTROYPROPBLOB DRM_IOWR(0xBE, struct drm_mode_destroy_blob)<br>
><br>
> +#define DRM_IOCTL_SYNCOBJ_CREATE       DRM_IOWR(0xBF, struct drm_syncobj_create)<br>
> +#define DRM_IOCTL_SYNCOBJ_DESTROY      DRM_IOWR(0xC0, struct drm_syncobj_destroy)<br>
> +#define DRM_IOCTL_SYNCOBJ_HANDLE_TO_FD DRM_IOWR(0xC1, struct drm_syncobj_handle)<br>
> +#define DRM_IOCTL_SYNCOBJ_FD_TO_HANDLE DRM_IOWR(0xC2, struct drm_syncobj_handle)<br>
> +<br>
>  /**<br>
>   * Device specific ioctls should only be in their respective headers<br>
>   * The device specific ioctl range is from 0x40 to 0x9f.<br>
> diff --git a/xf86drm.c b/xf86drm.c<br>
> index 728ac78..2ac3f26 100644<br>
> --- a/xf86drm.c<br>
> +++ b/xf86drm.c<br>
> @@ -4146,3 +4146,84 @@ char *drmGetDeviceNameFromFd2(int fd)<br>
>      return strdup(node);<br>
>  #endif<br>
>  }<br>
> +<br>
> +int drmSyncobjCreate(int fd, uint32_t flags, uint32_t *handle)<br>
> +{<br>
> +    struct drm_syncobj_create args;<br>
> +    int ret;<br>
> +<br>
> +    memclear(args);<br>
> +    args.flags = flags;<br>
> +    args.handle = 0;<br>
> +    ret = drmIoctl(fd, DRM_IOCTL_SYNCOBJ_CREATE, &args);<br>
> +    if (ret)<br>
> +       return ret;<br>
> +    *handle = args.handle;<br>
> +    return 0;<br>
> +}<br>
> +<br>
> +int drmSyncobjDestroy(int fd, uint32_t handle)<br>
> +{<br>
> +    struct drm_syncobj_destroy args;<br>
> +<br>
> +    memclear(args);<br>
> +    args.handle = handle;<br>
> +    return drmIoctl(fd, DRM_IOCTL_SYNCOBJ_DESTROY, &args);<br>
> +}<br>
> +<br>
> +int drmSyncobjHandleToFD(int fd, uint32_t handle, int *obj_fd)<br>
> +{<br>
> +    struct drm_syncobj_handle args;<br>
> +    int ret;<br>
> +<br>
> +    memclear(args);<br>
> +    args.fd = -1;<br>
> +    args.handle = handle;<br>
> +    ret = drmIoctl(fd, DRM_IOCTL_SYNCOBJ_HANDLE_TO_<wbr>FD, &args);<br>
> +    if (ret)<br>
> +       return ret;<br>
> +    *obj_fd = args.fd;<br>
> +    return 0;<br>
> +}<br>
> +<br>
> +int drmSyncobjFDToHandle(int fd, int obj_fd, uint32_t *handle)<br>
> +{<br>
> +    struct drm_syncobj_handle args;<br>
> +    int ret;<br>
> +<br>
> +    memclear(args);<br>
> +    args.fd = obj_fd;<br>
> +    args.handle = 0;<br>
> +    ret = drmIoctl(fd, DRM_IOCTL_SYNCOBJ_FD_TO_<wbr>HANDLE, &args);<br>
> +    if (ret)<br>
> +       return ret;<br>
> +    *handle = args.handle;<br>
> +    return 0;<br>
> +}<br>
> +<br>
> +int drmSyncobjImportSyncFile(int fd, uint32_t handle, int sync_file_fd)<br>
> +{<br>
> +    struct drm_syncobj_handle args;<br>
> +<br>
> +    memclear(args);<br>
> +    args.fd = sync_file_fd;<br>
> +    args.handle = handle;<br>
> +    args.flags = DRM_SYNCOBJ_FD_TO_HANDLE_<wbr>FLAGS_IMPORT_SYNC_FILE;<br>
> +    return drmIoctl(fd, DRM_IOCTL_SYNCOBJ_FD_TO_<wbr>HANDLE, &args);<br>
> +}<br>
> +<br>
> +int drmSyncobjExportSyncFile(int fd, uint32_t handle, int *sync_file_fd)<br>
> +{<br>
> +    struct drm_syncobj_handle args;<br>
> +    int ret;<br>
> +<br>
> +    memclear(args);<br>
> +    args.fd = -1;<br>
> +    args.handle = handle;<br>
> +    args.flags = DRM_SYNCOBJ_HANDLE_TO_FD_<wbr>FLAGS_EXPORT_SYNC_FILE;<br>
> +    ret = drmIoctl(fd, DRM_IOCTL_SYNCOBJ_HANDLE_TO_<wbr>FD, &args);<br>
> +    if (ret)<br>
> +       return ret;<br>
> +    *sync_file_fd = args.fd;<br>
> +    return 0;<br>
> +}<br>
> diff --git a/xf86drm.h b/xf86drm.h<br>
> index 74f54f1..2855a3e 100644<br>
> --- a/xf86drm.h<br>
> +++ b/xf86drm.h<br>
> @@ -853,6 +853,14 @@ extern int drmGetDevices2(uint32_t flags, drmDevicePtr devices[], int max_device<br>
><br>
>  extern int drmDevicesEqual(drmDevicePtr a, drmDevicePtr b);<br>
><br>
> +extern int drmSyncobjCreate(int fd, uint32_t flags, uint32_t *handle);<br>
> +extern int drmSyncobjDestroy(int fd, uint32_t handle);<br>
> +extern int drmSyncobjHandleToFD(int fd, uint32_t handle, int *obj_fd);<br>
> +extern int drmSyncobjFDToHandle(int fd, int obj_fd, uint32_t *handle);<br>
> +<br>
> +extern int drmSyncobjImportSyncFile(int fd, uint32_t handle, int sync_file_fd);<br>
> +extern int drmSyncobjExportSyncFile(int fd, uint32_t handle, int *sync_file_fd);<br>
> +<br>
>  #if defined(__cplusplus)<br>
>  }<br>
>  #endif<br>
> --<br>
> 2.9.4<br>
><br>
> ______________________________<wbr>_________________<br>
> dri-devel mailing list<br>
> <a href="mailto:dri-devel@lists.freedesktop.org">dri-devel@lists.freedesktop.<wbr>org</a><br>
> <a href="https://lists.freedesktop.org/mailman/listinfo/dri-devel" rel="noreferrer" target="_blank">https://lists.freedesktop.org/<wbr>mailman/listinfo/dri-devel</a><br>
</div></blockquote></div><br></div></div></div>