From f0fad6ed1710db7cfcc2ff27bd18cd86d25ceeb4 Mon Sep 17 00:00:00 2001 From: Faith Ekstrand Date: Fri, 19 Jan 2024 17:11:06 -0600 Subject: [PATCH] nvk/queue: Only initialize the necessary engines Part-of: --- src/nouveau/vulkan/nvk_queue.c | 38 +++++++++++++++++----- src/nouveau/vulkan/nvk_queue.h | 3 +- src/nouveau/vulkan/nvk_queue_drm_nouveau.c | 14 +++++--- 3 files changed, 40 insertions(+), 15 deletions(-) diff --git a/src/nouveau/vulkan/nvk_queue.c b/src/nouveau/vulkan/nvk_queue.c index 2e9c76317de..a4851dd90f9 100644 --- a/src/nouveau/vulkan/nvk_queue.c +++ b/src/nouveau/vulkan/nvk_queue.c @@ -314,7 +314,8 @@ nvk_queue_submit(struct vk_queue *vk_queue, } static VkResult -nvk_queue_init_context_state(struct nvk_queue *queue) +nvk_queue_init_context_state(struct nvk_queue *queue, + VkQueueFlags queue_flags) { struct nvk_device *dev = nvk_queue_device(queue); struct nvk_physical_device *pdev = nvk_device_physical(dev); @@ -337,13 +338,17 @@ nvk_queue_init_context_state(struct nvk_queue *queue) }); } - result = nvk_push_draw_state_init(dev, p); - if (result != VK_SUCCESS) - return result; + if (queue_flags & VK_QUEUE_GRAPHICS_BIT) { + result = nvk_push_draw_state_init(dev, p); + if (result != VK_SUCCESS) + return result; + } - result = nvk_push_dispatch_state_init(dev, p); - if (result != VK_SUCCESS) - return result; + if (queue_flags & VK_QUEUE_COMPUTE_BIT) { + result = nvk_push_dispatch_state_init(dev, p); + if (result != VK_SUCCESS) + return result; + } return nvk_queue_submit_simple(queue, nv_push_dw_count(&push), push_data, 0, NULL); @@ -354,8 +359,23 @@ nvk_queue_init(struct nvk_device *dev, struct nvk_queue *queue, const VkDeviceQueueCreateInfo *pCreateInfo, uint32_t index_in_family) { + struct nvk_physical_device *pdev = nvk_device_physical(dev); VkResult result; + assert(pCreateInfo->queueFamilyIndex < pdev->queue_family_count); + const struct nvk_queue_family *queue_family = + &pdev->queue_families[pCreateInfo->queueFamilyIndex]; + + VkQueueFlags queue_flags = queue_family->queue_flags; + + /* We rely on compute shaders for queries */ + if (queue_family->queue_flags & VK_QUEUE_GRAPHICS_BIT) + queue_flags |= VK_QUEUE_COMPUTE_BIT; + + /* We currently rely on 3D engine MMEs for indirect dispatch */ + if (queue_family->queue_flags & VK_QUEUE_COMPUTE_BIT) + queue_flags |= VK_QUEUE_GRAPHICS_BIT; + result = vk_queue_init(&queue->vk, &dev->vk, pCreateInfo, index_in_family); if (result != VK_SUCCESS) return result; @@ -364,11 +384,11 @@ nvk_queue_init(struct nvk_device *dev, struct nvk_queue *queue, nvk_queue_state_init(&queue->state); - result = nvk_queue_init_drm_nouveau(dev, queue); + result = nvk_queue_init_drm_nouveau(dev, queue, queue_flags); if (result != VK_SUCCESS) goto fail_init; - result = nvk_queue_init_context_state(queue); + result = nvk_queue_init_context_state(queue, queue_flags); if (result != VK_SUCCESS) goto fail_drm; diff --git a/src/nouveau/vulkan/nvk_queue.h b/src/nouveau/vulkan/nvk_queue.h index 862c91287af..d97ff00503c 100644 --- a/src/nouveau/vulkan/nvk_queue.h +++ b/src/nouveau/vulkan/nvk_queue.h @@ -82,7 +82,8 @@ VkResult nvk_queue_submit_simple(struct nvk_queue *queue, struct nouveau_ws_bo **extra_bos); VkResult nvk_queue_init_drm_nouveau(struct nvk_device *dev, - struct nvk_queue *queue); + struct nvk_queue *queue, + VkQueueFlags queue_flags); void nvk_queue_finish_drm_nouveau(struct nvk_device *dev, struct nvk_queue *queue); diff --git a/src/nouveau/vulkan/nvk_queue_drm_nouveau.c b/src/nouveau/vulkan/nvk_queue_drm_nouveau.c index 09fcdd48c12..6ea7b2f5ac9 100644 --- a/src/nouveau/vulkan/nvk_queue_drm_nouveau.c +++ b/src/nouveau/vulkan/nvk_queue_drm_nouveau.c @@ -291,15 +291,19 @@ push_submit(struct nvk_queue *queue, struct push_builder *pb, bool sync) VkResult nvk_queue_init_drm_nouveau(struct nvk_device *dev, - struct nvk_queue *queue) + struct nvk_queue *queue, + VkQueueFlags queue_flags) { VkResult result; int err; - const enum nouveau_ws_engines engines = - NOUVEAU_WS_ENGINE_COPY | - NOUVEAU_WS_ENGINE_3D | - NOUVEAU_WS_ENGINE_COMPUTE; + enum nouveau_ws_engines engines = 0; + if (queue_flags & VK_QUEUE_GRAPHICS_BIT) + engines |= NOUVEAU_WS_ENGINE_3D; + if (queue_flags & VK_QUEUE_COMPUTE_BIT) + engines |= NOUVEAU_WS_ENGINE_COMPUTE; + if (queue_flags & VK_QUEUE_TRANSFER_BIT) + engines |= NOUVEAU_WS_ENGINE_COPY; err = nouveau_ws_context_create(dev->ws_dev, engines, &queue->drm.ws_ctx); if (err != 0) {