drm-uapi/v3d: extend interface for multiple semaphores support
Extends command submission ioctls to support multiple semaphores through generic ioctl extension design. In this approach, a multisync extension subclasses a generic ioctl extension struct (base) and enables more than one wait and signal semaphores. Multisync extension also uses v3d_queue to specify the wait_stage, i.e. which job should sync before start (wait semaphores). Signed-off-by: Melissa Wen <mwen@igalia.com> Reviewed-by: Iago Toral Quiroga <itoral@igalia.com> Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/13178>
This commit is contained in:
@@ -58,6 +58,67 @@ extern "C" {
|
|||||||
struct drm_v3d_perfmon_get_values)
|
struct drm_v3d_perfmon_get_values)
|
||||||
|
|
||||||
#define DRM_V3D_SUBMIT_CL_FLUSH_CACHE 0x01
|
#define DRM_V3D_SUBMIT_CL_FLUSH_CACHE 0x01
|
||||||
|
#define DRM_V3D_SUBMIT_EXTENSION 0x02
|
||||||
|
|
||||||
|
/* struct drm_v3d_extension - ioctl extensions
|
||||||
|
*
|
||||||
|
* Linked-list of generic extensions where the id identify which struct is
|
||||||
|
* pointed by ext_data. Therefore, DRM_V3D_EXT_ID_* is used on id to identify
|
||||||
|
* the extension type.
|
||||||
|
*/
|
||||||
|
struct drm_v3d_extension {
|
||||||
|
__u64 next;
|
||||||
|
__u32 id;
|
||||||
|
#define DRM_V3D_EXT_ID_MULTI_SYNC 0x01
|
||||||
|
__u32 flags; /* mbz */
|
||||||
|
};
|
||||||
|
|
||||||
|
/* struct drm_v3d_sem - wait/signal semaphore
|
||||||
|
*
|
||||||
|
* If binary semaphore, it only takes syncobj handle and ignores flags and
|
||||||
|
* point fields. Point is defined for timeline syncobj feature.
|
||||||
|
*/
|
||||||
|
struct drm_v3d_sem {
|
||||||
|
__u32 handle; /* syncobj */
|
||||||
|
/* rsv below, for future uses */
|
||||||
|
__u32 flags;
|
||||||
|
__u64 point; /* for timeline sem support */
|
||||||
|
__u64 mbz[2]; /* must be zero, rsv */
|
||||||
|
};
|
||||||
|
|
||||||
|
/* Enum for each of the V3D queues. */
|
||||||
|
enum v3d_queue {
|
||||||
|
V3D_BIN,
|
||||||
|
V3D_RENDER,
|
||||||
|
V3D_TFU,
|
||||||
|
V3D_CSD,
|
||||||
|
V3D_CACHE_CLEAN,
|
||||||
|
};
|
||||||
|
|
||||||
|
/**
|
||||||
|
* struct drm_v3d_multi_sync - ioctl extension to add support multiples
|
||||||
|
* syncobjs for commands submission.
|
||||||
|
*
|
||||||
|
* When an extension of DRM_V3D_EXT_ID_MULTI_SYNC id is defined, it points to
|
||||||
|
* this extension to define wait and signal dependencies, instead of single
|
||||||
|
* in/out sync entries on submitting commands. The field flags is used to
|
||||||
|
* determine the stage to set wait dependencies.
|
||||||
|
*/
|
||||||
|
struct drm_v3d_multi_sync {
|
||||||
|
struct drm_v3d_extension base;
|
||||||
|
/* Array of wait and signal semaphores */
|
||||||
|
__u64 in_syncs;
|
||||||
|
__u64 out_syncs;
|
||||||
|
|
||||||
|
/* Number of entries */
|
||||||
|
__u32 in_sync_count;
|
||||||
|
__u32 out_sync_count;
|
||||||
|
|
||||||
|
/* set the stage (v3d_queue) to sync */
|
||||||
|
__u32 wait_stage;
|
||||||
|
|
||||||
|
__u32 pad; /* mbz */
|
||||||
|
};
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* struct drm_v3d_submit_cl - ioctl argument for submitting commands to the 3D
|
* struct drm_v3d_submit_cl - ioctl argument for submitting commands to the 3D
|
||||||
@@ -135,12 +196,16 @@ struct drm_v3d_submit_cl {
|
|||||||
/* Number of BO handles passed in (size is that times 4). */
|
/* Number of BO handles passed in (size is that times 4). */
|
||||||
__u32 bo_handle_count;
|
__u32 bo_handle_count;
|
||||||
|
|
||||||
|
/* DRM_V3D_SUBMIT_* properties */
|
||||||
__u32 flags;
|
__u32 flags;
|
||||||
|
|
||||||
/* ID of the perfmon to attach to this job. 0 means no perfmon. */
|
/* ID of the perfmon to attach to this job. 0 means no perfmon. */
|
||||||
__u32 perfmon_id;
|
__u32 perfmon_id;
|
||||||
|
|
||||||
__u32 pad;
|
__u32 pad;
|
||||||
|
|
||||||
|
/* Pointer to an array of ioctl extensions*/
|
||||||
|
__u64 extensions;
|
||||||
};
|
};
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@@ -210,6 +275,7 @@ enum drm_v3d_param {
|
|||||||
DRM_V3D_PARAM_SUPPORTS_CSD,
|
DRM_V3D_PARAM_SUPPORTS_CSD,
|
||||||
DRM_V3D_PARAM_SUPPORTS_CACHE_FLUSH,
|
DRM_V3D_PARAM_SUPPORTS_CACHE_FLUSH,
|
||||||
DRM_V3D_PARAM_SUPPORTS_PERFMON,
|
DRM_V3D_PARAM_SUPPORTS_PERFMON,
|
||||||
|
DRM_V3D_PARAM_SUPPORTS_MULTISYNC_EXT,
|
||||||
};
|
};
|
||||||
|
|
||||||
struct drm_v3d_get_param {
|
struct drm_v3d_get_param {
|
||||||
@@ -248,6 +314,11 @@ struct drm_v3d_submit_tfu {
|
|||||||
__u32 in_sync;
|
__u32 in_sync;
|
||||||
/* Sync object to signal when the TFU job is done. */
|
/* Sync object to signal when the TFU job is done. */
|
||||||
__u32 out_sync;
|
__u32 out_sync;
|
||||||
|
|
||||||
|
__u32 flags;
|
||||||
|
|
||||||
|
/* Pointer to an array of ioctl extensions*/
|
||||||
|
__u64 extensions;
|
||||||
};
|
};
|
||||||
|
|
||||||
/* Submits a compute shader for dispatch. This job will block on any
|
/* Submits a compute shader for dispatch. This job will block on any
|
||||||
@@ -276,6 +347,13 @@ struct drm_v3d_submit_csd {
|
|||||||
|
|
||||||
/* ID of the perfmon to attach to this job. 0 means no perfmon. */
|
/* ID of the perfmon to attach to this job. 0 means no perfmon. */
|
||||||
__u32 perfmon_id;
|
__u32 perfmon_id;
|
||||||
|
|
||||||
|
/* Pointer to an array of ioctl extensions*/
|
||||||
|
__u64 extensions;
|
||||||
|
|
||||||
|
__u32 flags;
|
||||||
|
|
||||||
|
__u32 pad;
|
||||||
};
|
};
|
||||||
|
|
||||||
enum {
|
enum {
|
||||||
|
Reference in New Issue
Block a user