[PATCH] libdrm: add drm syncobj create/destroy/import/export

Dave Airlie airlied at gmail.com
Fri Sep 8 20:08:07 UTC 2017


On 9 Sep. 2017 2:30 am, "Marek Olšák" <maraeo at gmail.com> wrote:

What's the difference between HandleToFD and ExportSyncFile?


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.

A) is for process sharing
B) for interop with sync files

Dave.


Thanks,
Marek

On Sat, Jun 17, 2017 at 3:06 AM, Dave Airlie <airlied at gmail.com> wrote:
> From: Dave Airlie <airlied at redhat.com>
>
> These ioctls are now in drm next so add the first set of libdrm APIs.
>
> Signed-off-by: Dave Airlie <airlied at redhat.com>
> ---
>  include/drm/drm.h | 26 ++++++++++++++++++
>  xf86drm.c         | 81 ++++++++++++++++++++++++++++++
+++++++++++++++++++++++++
>  xf86drm.h         |  8 ++++++
>  3 files changed, 115 insertions(+)
>
> diff --git a/include/drm/drm.h b/include/drm/drm.h
> index 1e7a4bc..bf3674a 100644
> --- a/include/drm/drm.h
> +++ b/include/drm/drm.h
> @@ -642,6 +642,7 @@ struct drm_gem_open {
>  #define DRM_CAP_ADDFB2_MODIFIERS       0x10
>  #define DRM_CAP_PAGE_FLIP_TARGET       0x11
>  #define DRM_CAP_CRTC_IN_VBLANK_EVENT   0x12
> +#define DRM_CAP_SYNCOBJ                0x13
>
>  /** DRM_IOCTL_GET_CAP ioctl argument type */
>  struct drm_get_cap {
> @@ -691,6 +692,26 @@ struct drm_prime_handle {
>         __s32 fd;
>  };
>
> +struct drm_syncobj_create {
> +       __u32 handle;
> +       __u32 flags;
> +};
> +
> +struct drm_syncobj_destroy {
> +       __u32 handle;
> +       __u32 pad;
> +};
> +
> +#define DRM_SYNCOBJ_FD_TO_HANDLE_FLAGS_IMPORT_SYNC_FILE (1 << 0)
> +#define DRM_SYNCOBJ_HANDLE_TO_FD_FLAGS_EXPORT_SYNC_FILE (1 << 0)
> +struct drm_syncobj_handle {
> +       __u32 handle;
> +       __u32 flags;
> +
> +       __s32 fd;
> +       __u32 pad;
> +};
> +
>  #if defined(__cplusplus)
>  }
>  #endif
> @@ -809,6 +830,11 @@ extern "C" {
>  #define DRM_IOCTL_MODE_CREATEPROPBLOB  DRM_IOWR(0xBD, struct
drm_mode_create_blob)
>  #define DRM_IOCTL_MODE_DESTROYPROPBLOB DRM_IOWR(0xBE, struct
drm_mode_destroy_blob)
>
> +#define DRM_IOCTL_SYNCOBJ_CREATE       DRM_IOWR(0xBF, struct
drm_syncobj_create)
> +#define DRM_IOCTL_SYNCOBJ_DESTROY      DRM_IOWR(0xC0, struct
drm_syncobj_destroy)
> +#define DRM_IOCTL_SYNCOBJ_HANDLE_TO_FD DRM_IOWR(0xC1, struct
drm_syncobj_handle)
> +#define DRM_IOCTL_SYNCOBJ_FD_TO_HANDLE DRM_IOWR(0xC2, struct
drm_syncobj_handle)
> +
>  /**
>   * Device specific ioctls should only be in their respective headers
>   * The device specific ioctl range is from 0x40 to 0x9f.
> diff --git a/xf86drm.c b/xf86drm.c
> index 728ac78..2ac3f26 100644
> --- a/xf86drm.c
> +++ b/xf86drm.c
> @@ -4146,3 +4146,84 @@ char *drmGetDeviceNameFromFd2(int fd)
>      return strdup(node);
>  #endif
>  }
> +
> +int drmSyncobjCreate(int fd, uint32_t flags, uint32_t *handle)
> +{
> +    struct drm_syncobj_create args;
> +    int ret;
> +
> +    memclear(args);
> +    args.flags = flags;
> +    args.handle = 0;
> +    ret = drmIoctl(fd, DRM_IOCTL_SYNCOBJ_CREATE, &args);
> +    if (ret)
> +       return ret;
> +    *handle = args.handle;
> +    return 0;
> +}
> +
> +int drmSyncobjDestroy(int fd, uint32_t handle)
> +{
> +    struct drm_syncobj_destroy args;
> +
> +    memclear(args);
> +    args.handle = handle;
> +    return drmIoctl(fd, DRM_IOCTL_SYNCOBJ_DESTROY, &args);
> +}
> +
> +int drmSyncobjHandleToFD(int fd, uint32_t handle, int *obj_fd)
> +{
> +    struct drm_syncobj_handle args;
> +    int ret;
> +
> +    memclear(args);
> +    args.fd = -1;
> +    args.handle = handle;
> +    ret = drmIoctl(fd, DRM_IOCTL_SYNCOBJ_HANDLE_TO_FD, &args);
> +    if (ret)
> +       return ret;
> +    *obj_fd = args.fd;
> +    return 0;
> +}
> +
> +int drmSyncobjFDToHandle(int fd, int obj_fd, uint32_t *handle)
> +{
> +    struct drm_syncobj_handle args;
> +    int ret;
> +
> +    memclear(args);
> +    args.fd = obj_fd;
> +    args.handle = 0;
> +    ret = drmIoctl(fd, DRM_IOCTL_SYNCOBJ_FD_TO_HANDLE, &args);
> +    if (ret)
> +       return ret;
> +    *handle = args.handle;
> +    return 0;
> +}
> +
> +int drmSyncobjImportSyncFile(int fd, uint32_t handle, int sync_file_fd)
> +{
> +    struct drm_syncobj_handle args;
> +
> +    memclear(args);
> +    args.fd = sync_file_fd;
> +    args.handle = handle;
> +    args.flags = DRM_SYNCOBJ_FD_TO_HANDLE_FLAGS_IMPORT_SYNC_FILE;
> +    return drmIoctl(fd, DRM_IOCTL_SYNCOBJ_FD_TO_HANDLE, &args);
> +}
> +
> +int drmSyncobjExportSyncFile(int fd, uint32_t handle, int *sync_file_fd)
> +{
> +    struct drm_syncobj_handle args;
> +    int ret;
> +
> +    memclear(args);
> +    args.fd = -1;
> +    args.handle = handle;
> +    args.flags = DRM_SYNCOBJ_HANDLE_TO_FD_FLAGS_EXPORT_SYNC_FILE;
> +    ret = drmIoctl(fd, DRM_IOCTL_SYNCOBJ_HANDLE_TO_FD, &args);
> +    if (ret)
> +       return ret;
> +    *sync_file_fd = args.fd;
> +    return 0;
> +}
> diff --git a/xf86drm.h b/xf86drm.h
> index 74f54f1..2855a3e 100644
> --- a/xf86drm.h
> +++ b/xf86drm.h
> @@ -853,6 +853,14 @@ extern int drmGetDevices2(uint32_t flags,
drmDevicePtr devices[], int max_device
>
>  extern int drmDevicesEqual(drmDevicePtr a, drmDevicePtr b);
>
> +extern int drmSyncobjCreate(int fd, uint32_t flags, uint32_t *handle);
> +extern int drmSyncobjDestroy(int fd, uint32_t handle);
> +extern int drmSyncobjHandleToFD(int fd, uint32_t handle, int *obj_fd);
> +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);
> +
>  #if defined(__cplusplus)
>  }
>  #endif
> --
> 2.9.4
>
> _______________________________________________
> dri-devel mailing list
> dri-devel at lists.freedesktop.org
> https://lists.freedesktop.org/mailman/listinfo/dri-devel
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <https://lists.freedesktop.org/archives/dri-devel/attachments/20170909/34388d49/attachment.html>


More information about the dri-devel mailing list