nvk: Dynamically allocate queues
Some checks are pending
macOS-CI / macOS-CI (dri) (push) Waiting to run
macOS-CI / macOS-CI (xlib) (push) Waiting to run

Change our queue creation to be dynamically allocated. This helps make the code
cleaner and neater for KHR_maint9, and also gives us flexibility when we support
multiple queues/multiple queue families.

Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/36139>
This commit is contained in:
Mohamed Ahmed 2025-07-15 22:10:25 +03:00 committed by Marge Bot
parent ce2bb61dbe
commit 5d987de708
4 changed files with 36 additions and 20 deletions

View file

@ -266,10 +266,13 @@ nvk_CreateDevice(VkPhysicalDevice physicalDevice,
goto fail_slm;
}
result = nvk_queue_init(dev, &dev->queue,
&pCreateInfo->pQueueCreateInfos[0], 0);
if (result != VK_SUCCESS)
goto fail_vab_memory;
for (unsigned i = 0; i < pCreateInfo->queueCreateInfoCount; i++) {
for (unsigned q = 0; q < pCreateInfo->pQueueCreateInfos[i].queueCount; q++) {
result = nvk_queue_create(dev, &pCreateInfo->pQueueCreateInfos[i], q);
if (result != VK_SUCCESS)
goto fail_queues;
}
}
struct vk_pipeline_cache_create_info cache_info = {
.weak_ref = true,
@ -277,7 +280,7 @@ nvk_CreateDevice(VkPhysicalDevice physicalDevice,
dev->vk.mem_cache = vk_pipeline_cache_create(&dev->vk, &cache_info, NULL);
if (dev->vk.mem_cache == NULL) {
result = VK_ERROR_OUT_OF_HOST_MEMORY;
goto fail_queue;
goto fail_queues;
}
result = nvk_device_init_meta(dev);
@ -290,9 +293,11 @@ nvk_CreateDevice(VkPhysicalDevice physicalDevice,
fail_mem_cache:
vk_pipeline_cache_destroy(dev->vk.mem_cache, NULL);
fail_queue:
nvk_queue_finish(dev, &dev->queue);
fail_vab_memory:
fail_queues:
vk_foreach_queue_safe(iter, &dev->vk) {
struct nvk_queue *queue = container_of(iter, struct nvk_queue, vk);
nvk_queue_destroy(dev, queue);
}
if (dev->vab_memory)
nvkmd_mem_unref(dev->vab_memory);
fail_slm:
@ -338,7 +343,12 @@ nvk_DestroyDevice(VkDevice _device, const VkAllocationCallbacks *pAllocator)
nvk_device_finish_meta(dev);
vk_pipeline_cache_destroy(dev->vk.mem_cache, NULL);
nvk_queue_finish(dev, &dev->queue);
vk_foreach_queue_safe(iter, &dev->vk) {
struct nvk_queue *queue = container_of(iter, struct nvk_queue, vk);
nvk_queue_destroy(dev, queue);
}
if (dev->vab_memory)
nvkmd_mem_unref(dev->vab_memory);

View file

@ -50,8 +50,6 @@ struct nvk_device {
struct nvk_slm_area slm;
struct nvkmd_mem *vab_memory;
struct nvk_queue queue;
struct vk_meta_device meta;
struct nvk_shader *copy_queries;

View file

@ -398,9 +398,9 @@ get_queue_global_priority(const VkDeviceQueueCreateInfo *pCreateInfo)
}
VkResult
nvk_queue_init(struct nvk_device *dev, struct nvk_queue *queue,
const VkDeviceQueueCreateInfo *pCreateInfo,
uint32_t index_in_family)
nvk_queue_create(struct nvk_device *dev,
const VkDeviceQueueCreateInfo *pCreateInfo,
uint32_t index_in_family)
{
const struct nvk_physical_device *pdev = nvk_device_physical(dev);
VkResult result;
@ -427,9 +427,14 @@ nvk_queue_init(struct nvk_device *dev, struct nvk_queue *queue,
if (global_priority > VK_QUEUE_GLOBAL_PRIORITY_MEDIUM)
return VK_ERROR_NOT_PERMITTED;
struct nvk_queue *queue = vk_zalloc(&dev->vk.alloc, sizeof(struct nvk_queue),
8, VK_SYSTEM_ALLOCATION_SCOPE_DEVICE);
if (!queue)
return VK_ERROR_OUT_OF_HOST_MEMORY;
result = vk_queue_init(&queue->vk, &dev->vk, pCreateInfo, index_in_family);
if (result != VK_SUCCESS)
return result;
goto fail_alloc;
nvk_queue_state_init(&queue->state);
@ -500,12 +505,14 @@ fail_exec_ctx:
fail_init:
nvk_queue_state_finish(dev, &queue->state);
vk_queue_finish(&queue->vk);
fail_alloc:
vk_free(&dev->vk.alloc, queue);
return result;
}
void
nvk_queue_finish(struct nvk_device *dev, struct nvk_queue *queue)
nvk_queue_destroy(struct nvk_device *dev, struct nvk_queue *queue)
{
nvk_mem_stream_sync(dev, &queue->push_stream, queue->exec_ctx);
nvk_mem_stream_finish(dev, &queue->push_stream);
@ -519,4 +526,5 @@ nvk_queue_finish(struct nvk_device *dev, struct nvk_queue *queue)
if (queue->exec_ctx != NULL)
nvkmd_ctx_destroy(queue->exec_ctx);
vk_queue_finish(&queue->vk);
vk_free(&dev->vk.alloc, queue);
}

View file

@ -59,11 +59,11 @@ nvk_queue_device(struct nvk_queue *queue)
return (struct nvk_device *)queue->vk.base.device;
}
VkResult nvk_queue_init(struct nvk_device *dev, struct nvk_queue *queue,
const VkDeviceQueueCreateInfo *pCreateInfo,
uint32_t index_in_family);
VkResult nvk_queue_create(struct nvk_device *dev,
const VkDeviceQueueCreateInfo *pCreateInfo,
uint32_t index_in_family);
void nvk_queue_finish(struct nvk_device *dev, struct nvk_queue *queue);
void nvk_queue_destroy(struct nvk_device *dev, struct nvk_queue *queue);
VkResult nvk_push_draw_state_init(struct nvk_queue *queue,
struct nv_push *p);