xref: /aosp_15_r20/external/mesa3d/src/panfrost/vulkan/panvk_cmd_pool.c (revision 6104692788411f58d303aa86923a9ff6ecaded22)
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