diff --git a/src/nouveau/vulkan/nvk_device.c b/src/nouveau/vulkan/nvk_device.c index 48921add5d1..fcd6c513537 100644 --- a/src/nouveau/vulkan/nvk_device.c +++ b/src/nouveau/vulkan/nvk_device.c @@ -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); diff --git a/src/nouveau/vulkan/nvk_device.h b/src/nouveau/vulkan/nvk_device.h index 30c99ecc4e4..39d8a4f9f70 100644 --- a/src/nouveau/vulkan/nvk_device.h +++ b/src/nouveau/vulkan/nvk_device.h @@ -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; diff --git a/src/nouveau/vulkan/nvk_queue.c b/src/nouveau/vulkan/nvk_queue.c index 31613f244aa..58bce592216 100644 --- a/src/nouveau/vulkan/nvk_queue.c +++ b/src/nouveau/vulkan/nvk_queue.c @@ -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); } diff --git a/src/nouveau/vulkan/nvk_queue.h b/src/nouveau/vulkan/nvk_queue.h index 1aba8232ccf..01122ab41dc 100644 --- a/src/nouveau/vulkan/nvk_queue.h +++ b/src/nouveau/vulkan/nvk_queue.h @@ -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);