From 3166b14bd895f1831459af43b202ae479e19a627 Mon Sep 17 00:00:00 2001 From: Yiwei Zhang Date: Mon, 11 Sep 2023 00:31:27 -0700 Subject: [PATCH] venus: drop device, family, index, flags tracking from vn_queue Signed-off-by: Yiwei Zhang Part-of: --- src/virtio/vulkan/vn_device.c | 7 +--- src/virtio/vulkan/vn_queue.c | 62 +++++++++++++++++++---------------- src/virtio/vulkan/vn_queue.h | 5 --- src/virtio/vulkan/vn_wsi.c | 15 ++++----- 4 files changed, 42 insertions(+), 47 deletions(-) diff --git a/src/virtio/vulkan/vn_device.c b/src/virtio/vulkan/vn_device.c index d352825408d..e6fcfa41b02 100644 --- a/src/virtio/vulkan/vn_device.c +++ b/src/virtio/vulkan/vn_device.c @@ -24,7 +24,7 @@ static void vn_queue_fini(struct vn_queue *queue) { - VkDevice dev_handle = vn_device_to_handle(queue->device); + VkDevice dev_handle = vk_device_to_handle(queue->base.base.base.device); if (queue->wait_fence != VK_NULL_HANDLE) { vn_DestroyFence(dev_handle, queue->wait_fence, NULL); @@ -76,11 +76,6 @@ vn_queue_init(struct vn_device *dev, vn_async_vkGetDeviceQueue2(dev->instance, vn_device_to_handle(dev), &device_queue_info, &queue_handle); - queue->device = dev; - queue->family = queue_info->queueFamilyIndex; - queue->index = queue_index; - queue->flags = queue_info->flags; - return VK_SUCCESS; } diff --git a/src/virtio/vulkan/vn_queue.c b/src/virtio/vulkan/vn_queue.c index c255d0d0b1c..0b9a06774f9 100644 --- a/src/virtio/vulkan/vn_queue.c +++ b/src/virtio/vulkan/vn_queue.c @@ -201,6 +201,10 @@ static VkResult vn_queue_submission_fix_batch_semaphores(struct vn_queue_submission *submit, uint32_t batch_index) { + struct vk_queue *queue_vk = vk_queue_from_handle(submit->queue_handle); + VkDevice dev_handle = vk_device_to_handle(queue_vk->base.device); + struct vn_device *dev = vn_device_from_handle(dev_handle); + uint32_t wait_count = vn_get_wait_semaphore_count(submit, batch_index); uint32_t signal_count = vn_get_signal_semaphore_count(submit, batch_index); @@ -212,8 +216,6 @@ vn_queue_submission_fix_batch_semaphores(struct vn_queue_submission *submit, if (payload->type != VN_SYNC_TYPE_IMPORTED_SYNC_FD) continue; - struct vn_queue *queue = vn_queue_from_handle(submit->queue_handle); - struct vn_device *dev = queue->device; if (!vn_semaphore_wait_external(dev, sem)) return VK_ERROR_DEVICE_LOST; @@ -224,8 +226,8 @@ vn_queue_submission_fix_batch_semaphores(struct vn_queue_submission *submit, .semaphore = sem_handle, .resourceId = 0, }; - vn_async_vkImportSemaphoreResourceMESA( - dev->instance, vn_device_to_handle(dev), &res_info); + vn_async_vkImportSemaphoreResourceMESA(dev->instance, dev_handle, + &res_info); } bool batch_has_sem_feedback = false; @@ -283,7 +285,7 @@ static VkResult vn_queue_submission_alloc_storage(struct vn_queue_submission *submit) { struct vn_queue *queue = vn_queue_from_handle(submit->queue_handle); - const VkAllocationCallbacks *alloc = &queue->device->base.base.alloc; + const VkAllocationCallbacks *alloc = &queue->base.base.base.device->alloc; size_t batch_size = 0; size_t cmd_size = 0; size_t alloc_size = 0; @@ -395,7 +397,8 @@ vn_set_sem_feedback_cmd(struct vn_queue *queue, VkCommandBuffer *cmd_handle) { VkResult result; - struct vn_device *dev = queue->device; + struct vk_queue *queue_vk = &queue->base.base; + struct vn_device *dev = (void *)queue_vk->base.device; const VkAllocationCallbacks *alloc = &dev->base.base.alloc; struct vn_feedback_src *free_feedback_src = NULL; @@ -432,8 +435,8 @@ vn_set_sem_feedback_cmd(struct vn_queue *queue, vn_feedback_set_counter(free_feedback_src->src_slot, counter); - for (uint32_t i = 0; i < queue->device->queue_family_count; i++) { - if (queue->device->queue_families[i] == queue->family) { + for (uint32_t i = 0; i < dev->queue_family_count; i++) { + if (dev->queue_families[i] == queue_vk->queue_family_index) { *cmd_handle = free_feedback_src->commands[i]; return VK_SUCCESS; } @@ -541,10 +544,13 @@ vn_queue_submission_add_semaphore_feedback( static const VkCommandBuffer * vn_get_fence_feedback_cmd(struct vn_queue *queue, struct vn_fence *fence) { + struct vk_queue *queue_vk = &queue->base.base; + struct vn_device *dev = (void *)queue_vk->base.device; + assert(fence->feedback.slot); - for (uint32_t i = 0; i < queue->device->queue_family_count; i++) { - if (queue->device->queue_families[i] == queue->family) + for (uint32_t i = 0; i < dev->queue_family_count; i++) { + if (dev->queue_families[i] == queue_vk->queue_family_index) return &fence->feedback.commands[i]; } @@ -714,9 +720,8 @@ vn_queue_sem_recycle_src_feedback(VkDevice dev_handle, VkSemaphore sem_handle) static void vn_queue_recycle_src_feedback(struct vn_queue_submission *submit) { - struct vn_queue *queue = vn_queue_from_handle(submit->queue_handle); - struct vn_device *dev = queue->device; - VkDevice dev_handle = vn_device_to_handle(dev); + struct vk_queue *queue_vk = vk_queue_from_handle(submit->queue_handle); + VkDevice dev_handle = vk_device_to_handle(queue_vk->base.device); for (uint32_t batch_index = 0; batch_index < submit->batch_count; batch_index++) { @@ -743,7 +748,7 @@ static void vn_queue_submission_cleanup(struct vn_queue_submission *submit) { struct vn_queue *queue = vn_queue_from_handle(submit->queue_handle); - const VkAllocationCallbacks *alloc = &queue->device->base.base.alloc; + const VkAllocationCallbacks *alloc = &queue->base.base.base.device->alloc; /* TODO clean up pending src feedbacks on failure? */ if (submit->has_feedback_semaphore) @@ -776,14 +781,14 @@ vn_queue_submission_prepare_submit(struct vn_queue_submission *submit) static void vn_queue_wsi_present(struct vn_queue_submission *submit) { - struct vn_queue *queue = vn_queue_from_handle(submit->queue_handle); - struct vn_device *dev = queue->device; - struct vn_instance *instance = queue->device->instance; + struct vk_queue *queue_vk = vk_queue_from_handle(submit->queue_handle); + struct vn_device *dev = (void *)queue_vk->base.device; + struct vn_instance *instance = dev->instance; if (!submit->wsi_mem) return; - if (dev->instance->renderer->info.has_implicit_fencing) { + if (instance->renderer->info.has_implicit_fencing) { struct vn_renderer_submit_batch batch = { .ring_idx = submit->external_payload.ring_idx, }; @@ -821,7 +826,7 @@ static VkResult vn_queue_submit(struct vn_queue_submission *submit) { struct vn_queue *queue = vn_queue_from_handle(submit->queue_handle); - struct vn_device *dev = queue->device; + struct vn_device *dev = (void *)queue->base.base.base.device; struct vn_instance *instance = dev->instance; VkResult result; @@ -838,7 +843,7 @@ vn_queue_submit(struct vn_queue_submission *submit) */ result = vn_queue_submission_prepare_submit(submit); if (result != VK_SUCCESS) - return vn_error(dev->instance, result); + return vn_error(instance, result); /* skip no-op submit */ if (!submit->batch_count && submit->fence_handle == VK_NULL_HANDLE) @@ -857,7 +862,7 @@ vn_queue_submit(struct vn_queue_submission *submit) if (result != VK_SUCCESS) { vn_queue_submission_cleanup(submit); - return vn_error(dev->instance, result); + return vn_error(instance, result); } } else { struct vn_instance_submit_command instance_submit; @@ -872,7 +877,7 @@ vn_queue_submit(struct vn_queue_submission *submit) } if (!instance_submit.ring_seqno_valid) { vn_queue_submission_cleanup(submit); - return vn_error(dev->instance, VK_ERROR_DEVICE_LOST); + return vn_error(instance, VK_ERROR_DEVICE_LOST); } submit->external_payload.ring_seqno_valid = true; submit->external_payload.ring_seqno = instance_submit.ring_seqno; @@ -952,7 +957,7 @@ static VkResult vn_queue_bind_sparse_submit(struct vn_queue_submission *submit) { struct vn_queue *queue = vn_queue_from_handle(submit->queue_handle); - struct vn_device *dev = queue->device; + struct vn_device *dev = (void *)queue->base.base.base.device; struct vn_instance *instance = dev->instance; VkResult result; @@ -961,7 +966,7 @@ vn_queue_bind_sparse_submit(struct vn_queue_submission *submit) instance, submit->queue_handle, submit->batch_count, submit->sparse_batches, submit->fence_handle); if (result != VK_SUCCESS) - return vn_error(dev->instance, result); + return vn_error(instance, result); } else { struct vn_instance_submit_command instance_submit; vn_submit_vkQueueBindSparse(instance, 0, submit->queue_handle, @@ -969,7 +974,7 @@ vn_queue_bind_sparse_submit(struct vn_queue_submission *submit) submit->fence_handle, &instance_submit); if (!instance_submit.ring_seqno_valid) - return vn_error(dev->instance, VK_ERROR_DEVICE_LOST); + return vn_error(instance, VK_ERROR_DEVICE_LOST); } return VK_SUCCESS; @@ -980,7 +985,7 @@ vn_queue_bind_sparse_submit_batch(struct vn_queue_submission *submit, uint32_t batch_index) { struct vn_queue *queue = vn_queue_from_handle(submit->queue_handle); - VkDevice dev_handle = vn_device_to_handle(queue->device); + VkDevice dev_handle = vk_device_to_handle(queue->base.base.base.device); const VkBindSparseInfo *sparse_info = &submit->sparse_batches[batch_index]; const VkSemaphore *signal_sem = sparse_info->pSignalSemaphores; uint32_t signal_sem_count = sparse_info->signalSemaphoreCount; @@ -1171,7 +1176,8 @@ vn_QueueWaitIdle(VkQueue _queue) { VN_TRACE_FUNC(); struct vn_queue *queue = vn_queue_from_handle(_queue); - VkDevice dev_handle = vn_device_to_handle(queue->device); + VkDevice dev_handle = vk_device_to_handle(queue->base.base.base.device); + struct vn_device *dev = vn_device_from_handle(dev_handle); VkResult result; /* lazily create queue wait fence for queue idle waiting */ @@ -1194,7 +1200,7 @@ vn_QueueWaitIdle(VkQueue _queue) vn_WaitForFences(dev_handle, 1, &queue->wait_fence, true, UINT64_MAX); vn_ResetFences(dev_handle, 1, &queue->wait_fence); - return vn_result(queue->device->instance, result); + return vn_result(dev->instance, result); } /* fence commands */ diff --git a/src/virtio/vulkan/vn_queue.h b/src/virtio/vulkan/vn_queue.h index 4ff925c8863..d212c5c186c 100644 --- a/src/virtio/vulkan/vn_queue.h +++ b/src/virtio/vulkan/vn_queue.h @@ -18,11 +18,6 @@ struct vn_queue { struct vn_queue_base base; - struct vn_device *device; - uint32_t family; - uint32_t index; - uint32_t flags; - /* only used if renderer supports multiple timelines */ uint32_t ring_idx; diff --git a/src/virtio/vulkan/vn_wsi.c b/src/virtio/vulkan/vn_wsi.c index e73bfe2cefc..8f61abec7d4 100644 --- a/src/virtio/vulkan/vn_wsi.c +++ b/src/virtio/vulkan/vn_wsi.c @@ -267,24 +267,23 @@ VkResult vn_QueuePresentKHR(VkQueue _queue, const VkPresentInfoKHR *pPresentInfo) { VN_TRACE_FUNC(); - struct vn_queue *queue = vn_queue_from_handle(_queue); + struct vk_queue *queue_vk = vk_queue_from_handle(_queue); + struct vn_device *dev = (void *)queue_vk->base.device; - VkResult result = - wsi_common_queue_present(&queue->device->physical_device->wsi_device, - vn_device_to_handle(queue->device), _queue, - queue->family, pPresentInfo); + VkResult result = wsi_common_queue_present( + &dev->physical_device->wsi_device, vn_device_to_handle(dev), _queue, + queue_vk->queue_family_index, pPresentInfo); if (VN_DEBUG(WSI) && result != VK_SUCCESS) { for (uint32_t i = 0; i < pPresentInfo->swapchainCount; i++) { const VkResult r = pPresentInfo->pResults ? pPresentInfo->pResults[i] : result; - vn_log(queue->device->instance, - "swapchain %p: presented image %d: %s", + vn_log(dev->instance, "swapchain %p: presented image %d: %s", VN_WSI_PTR(pPresentInfo->pSwapchains[i]), pPresentInfo->pImageIndices[i], vk_Result_to_str(r)); } } - return vn_result(queue->device->instance, result); + return vn_result(dev->instance, result); } VkResult