From 6c296c1283d414087068accdbe456d917cb5d89d Mon Sep 17 00:00:00 2001 From: Connor Abbott Date: Thu, 11 Sep 2025 10:12:22 -0400 Subject: [PATCH] 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: --- src/freedreno/vulkan/tu_knl.cc | 11 ++++------- src/freedreno/vulkan/tu_knl.h | 11 ++++------- src/freedreno/vulkan/tu_knl_drm_msm.cc | 19 ++++++++----------- src/freedreno/vulkan/tu_knl_drm_virtio.cc | 19 ++++++++----------- src/freedreno/vulkan/tu_knl_kgsl.cc | 11 ++++------- src/freedreno/vulkan/tu_queue.cc | 4 ++-- 6 files changed, 30 insertions(+), 45 deletions(-) diff --git a/src/freedreno/vulkan/tu_knl.cc b/src/freedreno/vulkan/tu_knl.cc index 5b8a0a31626..e7833b2e269 100644 --- a/src/freedreno/vulkan/tu_knl.cc +++ b/src/freedreno/vulkan/tu_knl.cc @@ -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 * diff --git a/src/freedreno/vulkan/tu_knl.h b/src/freedreno/vulkan/tu_knl.h index f6e03883f92..df08c5b43b5 100644 --- a/src/freedreno/vulkan/tu_knl.h +++ b/src/freedreno/vulkan/tu_knl.h @@ -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); diff --git a/src/freedreno/vulkan/tu_knl_drm_msm.cc b/src/freedreno/vulkan/tu_knl_drm_msm.cc index 6cdbc36ca76..3bf4ada3457 100644 --- a/src/freedreno/vulkan/tu_knl_drm_msm.cc +++ b/src/freedreno/vulkan/tu_knl_drm_msm.cc @@ -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 diff --git a/src/freedreno/vulkan/tu_knl_drm_virtio.cc b/src/freedreno/vulkan/tu_knl_drm_virtio.cc index 4cbb0c51638..e063030d70f 100644 --- a/src/freedreno/vulkan/tu_knl_drm_virtio.cc +++ b/src/freedreno/vulkan/tu_knl_drm_virtio.cc @@ -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 diff --git a/src/freedreno/vulkan/tu_knl_kgsl.cc b/src/freedreno/vulkan/tu_knl_kgsl.cc index a16a5f9207d..eb19ef6753b 100644 --- a/src/freedreno/vulkan/tu_knl_kgsl.cc +++ b/src/freedreno/vulkan/tu_knl_kgsl.cc @@ -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); diff --git a/src/freedreno/vulkan/tu_queue.cc b/src/freedreno/vulkan/tu_queue.cc index 7c0580837d2..f0acb688b47 100644 --- a/src/freedreno/vulkan/tu_queue.cc +++ b/src/freedreno/vulkan/tu_queue.cc @@ -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); }