mirror of
https://gitlab.freedesktop.org/mesa/mesa.git
synced 2025-12-20 22:30:12 +01:00
nvk/queue: Only initialize the necessary engines
Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/27205>
This commit is contained in:
parent
ced7c5193e
commit
f0fad6ed17
3 changed files with 40 additions and 15 deletions
|
|
@ -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;
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -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);
|
||||||
|
|
|
||||||
|
|
@ -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) {
|
||||||
|
|
|
||||||
Loading…
Add table
Reference in a new issue