nvk/queue: Only initialize the necessary engines

Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/27205>
This commit is contained in:
Faith Ekstrand 2024-01-19 17:11:06 -06:00 committed by Marge Bot
parent ced7c5193e
commit f0fad6ed17
3 changed files with 40 additions and 15 deletions

View file

@ -314,7 +314,8 @@ nvk_queue_submit(struct vk_queue *vk_queue,
} }
static VkResult 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_device *dev = nvk_queue_device(queue);
struct nvk_physical_device *pdev = nvk_device_physical(dev); struct nvk_physical_device *pdev = nvk_device_physical(dev);
@ -337,13 +338,17 @@ nvk_queue_init_context_state(struct nvk_queue *queue)
}); });
} }
if (queue_flags & VK_QUEUE_GRAPHICS_BIT) {
result = nvk_push_draw_state_init(dev, p); result = nvk_push_draw_state_init(dev, p);
if (result != VK_SUCCESS) if (result != VK_SUCCESS)
return result; return result;
}
if (queue_flags & VK_QUEUE_COMPUTE_BIT) {
result = nvk_push_dispatch_state_init(dev, p); result = nvk_push_dispatch_state_init(dev, p);
if (result != VK_SUCCESS) if (result != VK_SUCCESS)
return result; return result;
}
return nvk_queue_submit_simple(queue, nv_push_dw_count(&push), return nvk_queue_submit_simple(queue, nv_push_dw_count(&push),
push_data, 0, NULL); push_data, 0, NULL);
@ -354,8 +359,23 @@ nvk_queue_init(struct nvk_device *dev, struct nvk_queue *queue,
const VkDeviceQueueCreateInfo *pCreateInfo, const VkDeviceQueueCreateInfo *pCreateInfo,
uint32_t index_in_family) uint32_t index_in_family)
{ {
struct nvk_physical_device *pdev = nvk_device_physical(dev);
VkResult result; 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); result = vk_queue_init(&queue->vk, &dev->vk, pCreateInfo, index_in_family);
if (result != VK_SUCCESS) if (result != VK_SUCCESS)
return result; return result;
@ -364,11 +384,11 @@ nvk_queue_init(struct nvk_device *dev, struct nvk_queue *queue,
nvk_queue_state_init(&queue->state); 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) if (result != VK_SUCCESS)
goto fail_init; goto fail_init;
result = nvk_queue_init_context_state(queue); result = nvk_queue_init_context_state(queue, queue_flags);
if (result != VK_SUCCESS) if (result != VK_SUCCESS)
goto fail_drm; goto fail_drm;

View file

@ -82,7 +82,8 @@ VkResult nvk_queue_submit_simple(struct nvk_queue *queue,
struct nouveau_ws_bo **extra_bos); struct nouveau_ws_bo **extra_bos);
VkResult nvk_queue_init_drm_nouveau(struct nvk_device *dev, 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, void nvk_queue_finish_drm_nouveau(struct nvk_device *dev,
struct nvk_queue *queue); struct nvk_queue *queue);

View file

@ -291,15 +291,19 @@ push_submit(struct nvk_queue *queue, struct push_builder *pb, bool sync)
VkResult VkResult
nvk_queue_init_drm_nouveau(struct nvk_device *dev, nvk_queue_init_drm_nouveau(struct nvk_device *dev,
struct nvk_queue *queue) struct nvk_queue *queue,
VkQueueFlags queue_flags)
{ {
VkResult result; VkResult result;
int err; int err;
const enum nouveau_ws_engines engines = enum nouveau_ws_engines engines = 0;
NOUVEAU_WS_ENGINE_COPY | if (queue_flags & VK_QUEUE_GRAPHICS_BIT)
NOUVEAU_WS_ENGINE_3D | engines |= NOUVEAU_WS_ENGINE_3D;
NOUVEAU_WS_ENGINE_COMPUTE; 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); err = nouveau_ws_context_create(dev->ws_dev, engines, &queue->drm.ws_ctx);
if (err != 0) { if (err != 0) {