nvk/queue: Only initialize the necessary engines
Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/27205>
This commit is contained in:

committed by
Marge Bot

parent
ced7c5193e
commit
f0fad6ed17
@@ -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;
|
||||
|
||||
|
@@ -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);
|
||||
|
@@ -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) {
|
||||
|
Reference in New Issue
Block a user