1 /*
2 * Copyright © 2021 Collabora Ltd.
3 *
4 * Derived from tu_cmd_buffer.c which is:
5 * Copyright © 2016 Red Hat.
6 * Copyright © 2016 Bas Nieuwenhuizen
7 * Copyright © 2015 Intel Corporation
8 *
9 * SPDX-License-Identifier: MIT
10 */
11
12 #include "panvk_cmd_pool.h"
13 #include "panvk_device.h"
14 #include "panvk_entrypoints.h"
15
16 #include "vk_alloc.h"
17 #include "vk_log.h"
18
19 VKAPI_ATTR VkResult VKAPI_CALL
panvk_CreateCommandPool(VkDevice _device,const VkCommandPoolCreateInfo * pCreateInfo,const VkAllocationCallbacks * pAllocator,VkCommandPool * pCmdPool)20 panvk_CreateCommandPool(VkDevice _device,
21 const VkCommandPoolCreateInfo *pCreateInfo,
22 const VkAllocationCallbacks *pAllocator,
23 VkCommandPool *pCmdPool)
24 {
25 VK_FROM_HANDLE(panvk_device, device, _device);
26 struct panvk_cmd_pool *pool;
27
28 pool = vk_alloc2(&device->vk.alloc, pAllocator, sizeof(*pool), 8,
29 VK_SYSTEM_ALLOCATION_SCOPE_OBJECT);
30 if (pool == NULL)
31 return vk_error(device, VK_ERROR_OUT_OF_HOST_MEMORY);
32
33 VkResult result =
34 vk_command_pool_init(&device->vk, &pool->vk, pCreateInfo, pAllocator);
35 if (result != VK_SUCCESS) {
36 vk_free2(&device->vk.alloc, pAllocator, pool);
37 return result;
38 }
39
40 panvk_bo_pool_init(&pool->cs_bo_pool);
41 panvk_bo_pool_init(&pool->desc_bo_pool);
42 panvk_bo_pool_init(&pool->varying_bo_pool);
43 panvk_bo_pool_init(&pool->tls_bo_pool);
44 list_inithead(&pool->push_sets);
45 *pCmdPool = panvk_cmd_pool_to_handle(pool);
46 return VK_SUCCESS;
47 }
48
49 VKAPI_ATTR void VKAPI_CALL
panvk_DestroyCommandPool(VkDevice _device,VkCommandPool commandPool,const VkAllocationCallbacks * pAllocator)50 panvk_DestroyCommandPool(VkDevice _device, VkCommandPool commandPool,
51 const VkAllocationCallbacks *pAllocator)
52 {
53 VK_FROM_HANDLE(panvk_device, device, _device);
54 VK_FROM_HANDLE(panvk_cmd_pool, pool, commandPool);
55
56 if (!pool)
57 return;
58
59 vk_command_pool_finish(&pool->vk);
60
61 panvk_bo_pool_cleanup(&pool->cs_bo_pool);
62 panvk_bo_pool_cleanup(&pool->desc_bo_pool);
63 panvk_bo_pool_cleanup(&pool->varying_bo_pool);
64 panvk_bo_pool_cleanup(&pool->tls_bo_pool);
65
66 list_for_each_entry_safe(struct panvk_cmd_pool_obj, obj, &pool->push_sets,
67 node) {
68 list_del(&obj->node);
69 vk_free(&pool->vk.alloc, obj);
70 }
71
72 vk_free2(&device->vk.alloc, pAllocator, pool);
73 }
74