mirror of
https://gitlab.freedesktop.org/mesa/mesa.git
synced 2026-05-03 20:48:08 +02:00
tu: Pass tu_queue to kernel create/destroy functions
Refactor this since we're about to create more than one kernel queue per Vulkan queue on drm/msm. Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/37304>
This commit is contained in:
parent
fff9f0a0e6
commit
6c296c1283
6 changed files with 30 additions and 45 deletions
|
|
@ -304,18 +304,15 @@ tu_device_check_status(struct vk_device *vk_device)
|
|||
}
|
||||
|
||||
int
|
||||
tu_drm_submitqueue_new(struct tu_device *dev,
|
||||
enum tu_queue_type type,
|
||||
int priority,
|
||||
uint32_t *queue_id)
|
||||
tu_drm_submitqueue_new(struct tu_device *dev, struct tu_queue *queue)
|
||||
{
|
||||
return dev->instance->knl->submitqueue_new(dev, type, priority, queue_id);
|
||||
return dev->instance->knl->submitqueue_new(dev, queue);
|
||||
}
|
||||
|
||||
void
|
||||
tu_drm_submitqueue_close(struct tu_device *dev, uint32_t queue_id)
|
||||
tu_drm_submitqueue_close(struct tu_device *dev, struct tu_queue *queue)
|
||||
{
|
||||
dev->instance->knl->submitqueue_close(dev, queue_id);
|
||||
dev->instance->knl->submitqueue_close(dev, queue);
|
||||
}
|
||||
|
||||
void *
|
||||
|
|
|
|||
|
|
@ -118,8 +118,8 @@ struct tu_knl {
|
|||
int (*device_get_gpu_timestamp)(struct tu_device *dev, uint64_t *ts);
|
||||
int (*device_get_suspend_count)(struct tu_device *dev, uint64_t *suspend_count);
|
||||
VkResult (*device_check_status)(struct tu_device *dev);
|
||||
int (*submitqueue_new)(struct tu_device *dev, enum tu_queue_type type, int priority, uint32_t *queue_id);
|
||||
void (*submitqueue_close)(struct tu_device *dev, uint32_t queue_id);
|
||||
int (*submitqueue_new)(struct tu_device *dev, struct tu_queue *queue);
|
||||
void (*submitqueue_close)(struct tu_device *dev, struct tu_queue *queue);
|
||||
VkResult (*bo_init)(struct tu_device *dev, struct vk_object_base *base,
|
||||
struct tu_bo **out_bo, uint64_t size, uint64_t client_iova,
|
||||
VkMemoryPropertyFlags mem_property,
|
||||
|
|
@ -288,13 +288,10 @@ VkResult
|
|||
tu_device_check_status(struct vk_device *vk_device);
|
||||
|
||||
int
|
||||
tu_drm_submitqueue_new(struct tu_device *dev,
|
||||
enum tu_queue_type type,
|
||||
int priority,
|
||||
uint32_t *queue_id);
|
||||
tu_drm_submitqueue_new(struct tu_device *dev, struct tu_queue *queue);
|
||||
|
||||
void
|
||||
tu_drm_submitqueue_close(struct tu_device *dev, uint32_t queue_id);
|
||||
tu_drm_submitqueue_close(struct tu_device *dev, struct tu_queue *queue);
|
||||
|
||||
void *
|
||||
tu_submit_create(struct tu_device *dev);
|
||||
|
|
|
|||
|
|
@ -333,19 +333,16 @@ msm_device_check_status(struct tu_device *device)
|
|||
}
|
||||
|
||||
static int
|
||||
msm_submitqueue_new(struct tu_device *dev,
|
||||
enum tu_queue_type type,
|
||||
int priority,
|
||||
uint32_t *queue_id)
|
||||
msm_submitqueue_new(struct tu_device *dev, struct tu_queue *queue)
|
||||
{
|
||||
assert(priority >= 0 &&
|
||||
priority < dev->physical_device->submitqueue_priority_count);
|
||||
assert(queue->priority >= 0 &&
|
||||
queue->priority < dev->physical_device->submitqueue_priority_count);
|
||||
struct drm_msm_submitqueue req = {
|
||||
.flags = type == TU_QUEUE_SPARSE ? MSM_SUBMITQUEUE_VM_BIND :
|
||||
.flags = queue->type == TU_QUEUE_SPARSE ? MSM_SUBMITQUEUE_VM_BIND :
|
||||
(dev->physical_device->info->chip >= 7 &&
|
||||
dev->physical_device->has_preemption ?
|
||||
MSM_SUBMITQUEUE_ALLOW_PREEMPT : 0),
|
||||
.prio = priority,
|
||||
.prio = queue->priority,
|
||||
};
|
||||
|
||||
int ret = drmCommandWriteRead(dev->fd,
|
||||
|
|
@ -353,15 +350,15 @@ msm_submitqueue_new(struct tu_device *dev,
|
|||
if (ret)
|
||||
return ret;
|
||||
|
||||
*queue_id = req.id;
|
||||
queue->msm_queue_id = req.id;
|
||||
return 0;
|
||||
}
|
||||
|
||||
static void
|
||||
msm_submitqueue_close(struct tu_device *dev, uint32_t queue_id)
|
||||
msm_submitqueue_close(struct tu_device *dev, struct tu_queue *queue)
|
||||
{
|
||||
drmCommandWrite(dev->fd, DRM_MSM_SUBMITQUEUE_CLOSE,
|
||||
&queue_id, sizeof(uint32_t));
|
||||
&queue->msm_queue_id, sizeof(uint32_t));
|
||||
}
|
||||
|
||||
static void
|
||||
|
|
|
|||
|
|
@ -345,37 +345,34 @@ virtio_device_check_status(struct tu_device *device)
|
|||
}
|
||||
|
||||
static int
|
||||
virtio_submitqueue_new(struct tu_device *dev,
|
||||
enum tu_queue_type type,
|
||||
int priority,
|
||||
uint32_t *queue_id)
|
||||
virtio_submitqueue_new(struct tu_device *dev, struct tu_queue *queue)
|
||||
{
|
||||
MESA_TRACE_FUNC();
|
||||
|
||||
assert(priority >= 0 &&
|
||||
priority < dev->physical_device->submitqueue_priority_count);
|
||||
assert(queue->priority >= 0 &&
|
||||
queue->priority < dev->physical_device->submitqueue_priority_count);
|
||||
|
||||
struct drm_msm_submitqueue req = {
|
||||
.flags = type == TU_QUEUE_SPARSE ? MSM_SUBMITQUEUE_VM_BIND :
|
||||
.flags = queue->type == TU_QUEUE_SPARSE ? MSM_SUBMITQUEUE_VM_BIND :
|
||||
(dev->physical_device->info->chip >= 7 &&
|
||||
dev->physical_device->has_preemption ?
|
||||
MSM_SUBMITQUEUE_ALLOW_PREEMPT : 0),
|
||||
.prio = priority,
|
||||
.prio = queue->priority,
|
||||
};
|
||||
|
||||
int ret = virtio_simple_ioctl(dev->vdev->vdrm, DRM_IOCTL_MSM_SUBMITQUEUE_NEW, &req);
|
||||
if (ret)
|
||||
return ret;
|
||||
|
||||
*queue_id = req.id;
|
||||
queue->msm_queue_id = req.id;
|
||||
return 0;
|
||||
}
|
||||
|
||||
static void
|
||||
virtio_submitqueue_close(struct tu_device *dev, uint32_t queue_id)
|
||||
virtio_submitqueue_close(struct tu_device *dev, struct tu_queue *queue)
|
||||
{
|
||||
MESA_TRACE_FUNC();
|
||||
virtio_simple_ioctl(dev->vdev->vdrm, DRM_IOCTL_MSM_SUBMITQUEUE_CLOSE, &queue_id);
|
||||
virtio_simple_ioctl(dev->vdev->vdrm, DRM_IOCTL_MSM_SUBMITQUEUE_CLOSE, &queue->msm_queue_id);
|
||||
}
|
||||
|
||||
static bool
|
||||
|
|
|
|||
|
|
@ -50,10 +50,7 @@ safe_ioctl(int fd, unsigned long request, void *arg)
|
|||
}
|
||||
|
||||
static int
|
||||
kgsl_submitqueue_new(struct tu_device *dev,
|
||||
enum tu_queue_type type,
|
||||
int priority,
|
||||
uint32_t *queue_id)
|
||||
kgsl_submitqueue_new(struct tu_device *dev, struct tu_queue *queue)
|
||||
{
|
||||
struct kgsl_drawctxt_create req = {
|
||||
.flags = KGSL_CONTEXT_SAVE_GMEM |
|
||||
|
|
@ -65,16 +62,16 @@ kgsl_submitqueue_new(struct tu_device *dev,
|
|||
if (ret)
|
||||
return ret;
|
||||
|
||||
*queue_id = req.drawctxt_id;
|
||||
queue->msm_queue_id = req.drawctxt_id;
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
static void
|
||||
kgsl_submitqueue_close(struct tu_device *dev, uint32_t queue_id)
|
||||
kgsl_submitqueue_close(struct tu_device *dev, struct tu_queue *queue)
|
||||
{
|
||||
struct kgsl_drawctxt_destroy req = {
|
||||
.drawctxt_id = queue_id,
|
||||
.drawctxt_id = queue->msm_queue_id,
|
||||
};
|
||||
|
||||
safe_ioctl(dev->physical_device->local_fd, IOCTL_KGSL_DRAWCTXT_DESTROY, &req);
|
||||
|
|
|
|||
|
|
@ -366,7 +366,7 @@ tu_queue_init(struct tu_device *device,
|
|||
(type == TU_QUEUE_SPARSE) ? queue_submit_sparse : queue_submit;
|
||||
queue->type = type;
|
||||
|
||||
int ret = tu_drm_submitqueue_new(device, type, priority, &queue->msm_queue_id);
|
||||
int ret = tu_drm_submitqueue_new(device, queue);
|
||||
if (ret)
|
||||
return vk_startup_errorf(device->instance, VK_ERROR_INITIALIZATION_FAILED,
|
||||
"submitqueue create failed");
|
||||
|
|
@ -380,6 +380,6 @@ void
|
|||
tu_queue_finish(struct tu_queue *queue)
|
||||
{
|
||||
vk_queue_finish(&queue->vk);
|
||||
tu_drm_submitqueue_close(queue->device, queue->msm_queue_id);
|
||||
tu_drm_submitqueue_close(queue->device, queue);
|
||||
}
|
||||
|
||||
|
|
|
|||
Loading…
Add table
Reference in a new issue