mirror of
https://gitlab.freedesktop.org/mesa/mesa.git
synced 2026-04-25 17:50:39 +02:00
nvk: Dynamically allocate queues
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:
parent
ce2bb61dbe
commit
5d987de708
4 changed files with 36 additions and 20 deletions
|
|
@ -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);
|
||||
|
||||
|
|
|
|||
|
|
@ -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;
|
||||
|
|
|
|||
|
|
@ -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);
|
||||
}
|
||||
|
|
|
|||
|
|
@ -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);
|
||||
|
|
|
|||
Loading…
Add table
Reference in a new issue