[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