[PATCH libdrm 2/4] drm: add drmSyncobjWait wrapper
Chunming Zhou
zhoucm1 at amd.com
Fri Sep 29 02:12:46 UTC 2017
On 2017年09月29日 06:10, Marek Olšák wrote:
> From: Marek Olšák <marek.olsak at amd.com>
>
> ---
> include/drm/drm.h | 24 ++++++++++++++++++++++++
> xf86drm.c | 22 ++++++++++++++++++++++
> xf86drm.h | 3 +++
> 3 files changed, 49 insertions(+)
>
> diff --git a/include/drm/drm.h b/include/drm/drm.h
> index bf3674a..4da1667 100644
> --- a/include/drm/drm.h
> +++ b/include/drm/drm.h
> @@ -687,38 +687,57 @@ struct drm_prime_handle {
>
> /** Flags.. only applicable for handle->fd */
> __u32 flags;
>
> /** Returned dmabuf file descriptor */
> __s32 fd;
> };
>
> struct drm_syncobj_create {
> __u32 handle;
> +#define DRM_SYNCOBJ_CREATE_SIGNALED (1 << 0)
> __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)
Typo for '(1 << 1)' ?
With that fixes, the set is Reviewed-by: Chunming Zhou <david1.zhou at amd.com>
> struct drm_syncobj_handle {
> __u32 handle;
> __u32 flags;
>
> __s32 fd;
> __u32 pad;
> };
>
> +#define DRM_SYNCOBJ_WAIT_FLAGS_WAIT_ALL (1 << 0)
> +#define DRM_SYNCOBJ_WAIT_FLAGS_WAIT_FOR_SUBMIT (1 << 1)
> +struct drm_syncobj_wait {
> + __u64 handles;
> + /* absolute timeout */
> + __s64 timeout_nsec;
> + __u32 count_handles;
> + __u32 flags;
> + __u32 first_signaled; /* only valid when not waiting all */
> + __u32 pad;
> +};
> +
> +struct drm_syncobj_array {
> + __u64 handles;
> + __u32 count_handles;
> + __u32 pad;
> +};
> +
> #if defined(__cplusplus)
> }
> #endif
>
> #include "drm_mode.h"
>
> #if defined(__cplusplus)
> extern "C" {
> #endif
>
> @@ -827,20 +846,23 @@ extern "C" {
> #define DRM_IOCTL_MODE_OBJ_SETPROPERTY DRM_IOWR(0xBA, struct drm_mode_obj_set_property)
> #define DRM_IOCTL_MODE_CURSOR2 DRM_IOWR(0xBB, struct drm_mode_cursor2)
> #define DRM_IOCTL_MODE_ATOMIC DRM_IOWR(0xBC, struct drm_mode_atomic)
> #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)
> +#define DRM_IOCTL_SYNCOBJ_WAIT DRM_IOWR(0xC3, struct drm_syncobj_wait)
> +#define DRM_IOCTL_SYNCOBJ_RESET DRM_IOWR(0xC4, struct drm_syncobj_array)
> +#define DRM_IOCTL_SYNCOBJ_SIGNAL DRM_IOWR(0xC5, struct drm_syncobj_array)
>
> /**
> * Device specific ioctls should only be in their respective headers
> * The device specific ioctl range is from 0x40 to 0x9f.
> * Generic IOCTLS restart at 0xA0.
> *
> * \sa drmCommandNone(), drmCommandRead(), drmCommandWrite(), and
> * drmCommandReadWrite().
> */
> #define DRM_COMMAND_BASE 0x40
> @@ -869,20 +891,21 @@ struct drm_event {
> struct drm_event_vblank {
> struct drm_event base;
> __u64 user_data;
> __u32 tv_sec;
> __u32 tv_usec;
> __u32 sequence;
> __u32 crtc_id; /* 0 on older kernels that do not support this */
> };
>
> /* typedef area */
> +#ifndef __KERNEL__
> typedef struct drm_clip_rect drm_clip_rect_t;
> typedef struct drm_drawable_info drm_drawable_info_t;
> typedef struct drm_tex_region drm_tex_region_t;
> typedef struct drm_hw_lock drm_hw_lock_t;
> typedef struct drm_version drm_version_t;
> typedef struct drm_unique drm_unique_t;
> typedef struct drm_list drm_list_t;
> typedef struct drm_block drm_block_t;
> typedef struct drm_control drm_control_t;
> typedef enum drm_map_type drm_map_type_t;
> @@ -910,16 +933,17 @@ typedef struct drm_draw drm_draw_t;
> typedef struct drm_update_draw drm_update_draw_t;
> typedef struct drm_auth drm_auth_t;
> typedef struct drm_irq_busid drm_irq_busid_t;
> typedef enum drm_vblank_seq_type drm_vblank_seq_type_t;
>
> typedef struct drm_agp_buffer drm_agp_buffer_t;
> typedef struct drm_agp_binding drm_agp_binding_t;
> typedef struct drm_agp_info drm_agp_info_t;
> typedef struct drm_scatter_gather drm_scatter_gather_t;
> typedef struct drm_set_version drm_set_version_t;
> +#endif
>
> #if defined(__cplusplus)
> }
> #endif
>
> #endif
> diff --git a/xf86drm.c b/xf86drm.c
> index 6ea0112..8a32717 100644
> --- a/xf86drm.c
> +++ b/xf86drm.c
> @@ -4218,10 +4218,32 @@ int drmSyncobjExportSyncFile(int fd, uint32_t handle, int *sync_file_fd)
> 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;
> }
> +
> +int drmSyncobjWait(int fd, uint32_t *handles, unsigned num_handles,
> + int64_t timeout_nsec, unsigned flags,
> + uint32_t *first_signaled)
> +{
> + struct drm_syncobj_wait args;
> + int ret;
> +
> + memclear(args);
> + args.handles = (intptr_t)handles;
> + args.timeout_nsec = timeout_nsec;
> + args.count_handles = num_handles;
> + args.flags = flags;
> +
> + ret = drmIoctl(fd, DRM_IOCTL_SYNCOBJ_WAIT, &args);
> + if (ret < 0)
> + return ret;
> +
> + if (first_signaled)
> + *first_signaled = args.first_signaled;
> + return ret;
> +}
> diff --git a/xf86drm.h b/xf86drm.h
> index 2855a3e..ea650ef 100644
> --- a/xf86drm.h
> +++ b/xf86drm.h
> @@ -853,16 +853,19 @@ 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);
> +extern int drmSyncobjWait(int fd, uint32_t *handles, unsigned num_handles,
> + int64_t timeout_nsec, unsigned flags,
> + uint32_t *first_signaled);
>
> #if defined(__cplusplus)
> }
> #endif
>
> #endif
More information about the amd-gfx
mailing list