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

Dave Airlie airlied at gmail.com
Mon Jun 26 20:55:02 UTC 2017


ping?

Dave.

On 17 June 2017 at 11:06, 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


More information about the dri-devel mailing list