diff --git a/src/panfrost/vulkan/meson.build b/src/panfrost/vulkan/meson.build index 4420bb13b59..5844183f194 100644 --- a/src/panfrost/vulkan/meson.build +++ b/src/panfrost/vulkan/meson.build @@ -37,6 +37,7 @@ panvk_entrypoints = custom_target( libpanvk_files = files( 'panvk_buffer.c', 'panvk_cmd_buffer.c', + 'panvk_cmd_pool.c', 'panvk_device.c', 'panvk_device_memory.c', 'panvk_descriptor_set.c', diff --git a/src/panfrost/vulkan/panvk_cmd_buffer.c b/src/panfrost/vulkan/panvk_cmd_buffer.c index b101e96ef1b..9eaaaee4c25 100644 --- a/src/panfrost/vulkan/panvk_cmd_buffer.c +++ b/src/panfrost/vulkan/panvk_cmd_buffer.c @@ -27,6 +27,7 @@ */ #include "panvk_buffer.h" +#include "panvk_cmd_pool.h" #include "panvk_pipeline.h" #include "panvk_pipeline_layout.h" #include "panvk_private.h" @@ -363,34 +364,6 @@ panvk_CmdSetStencilReference(VkCommandBuffer commandBuffer, cmdbuf->state.fs_rsd = 0; } -VKAPI_ATTR VkResult VKAPI_CALL -panvk_CreateCommandPool(VkDevice _device, - const VkCommandPoolCreateInfo *pCreateInfo, - const VkAllocationCallbacks *pAllocator, - VkCommandPool *pCmdPool) -{ - VK_FROM_HANDLE(panvk_device, device, _device); - struct panvk_cmd_pool *pool; - - pool = vk_alloc2(&device->vk.alloc, pAllocator, sizeof(*pool), 8, - VK_SYSTEM_ALLOCATION_SCOPE_OBJECT); - if (pool == NULL) - return vk_error(device, VK_ERROR_OUT_OF_HOST_MEMORY); - - VkResult result = - vk_command_pool_init(&device->vk, &pool->vk, pCreateInfo, pAllocator); - if (result != VK_SUCCESS) { - vk_free2(&device->vk.alloc, pAllocator, pool); - return result; - } - - panvk_bo_pool_init(&pool->desc_bo_pool); - panvk_bo_pool_init(&pool->varying_bo_pool); - panvk_bo_pool_init(&pool->tls_bo_pool); - *pCmdPool = panvk_cmd_pool_to_handle(pool); - return VK_SUCCESS; -} - void panvk_cmd_preload_fb_after_batch_split(struct panvk_cmd_buffer *cmdbuf) { diff --git a/src/panfrost/vulkan/panvk_cmd_pool.c b/src/panfrost/vulkan/panvk_cmd_pool.c new file mode 100644 index 00000000000..d256ab6a226 --- /dev/null +++ b/src/panfrost/vulkan/panvk_cmd_pool.c @@ -0,0 +1,57 @@ +/* + * Copyright © 2021 Collabora Ltd. + * + * Derived from tu_cmd_buffer.c which is: + * Copyright © 2016 Red Hat. + * Copyright © 2016 Bas Nieuwenhuizen + * Copyright © 2015 Intel Corporation + * + * SPDX-License-Identifier: MIT + */ + +#include "panvk_cmd_pool.h" +#include "panvk_private.h" + +VKAPI_ATTR VkResult VKAPI_CALL +panvk_CreateCommandPool(VkDevice _device, + const VkCommandPoolCreateInfo *pCreateInfo, + const VkAllocationCallbacks *pAllocator, + VkCommandPool *pCmdPool) +{ + VK_FROM_HANDLE(panvk_device, device, _device); + struct panvk_cmd_pool *pool; + + pool = vk_alloc2(&device->vk.alloc, pAllocator, sizeof(*pool), 8, + VK_SYSTEM_ALLOCATION_SCOPE_OBJECT); + if (pool == NULL) + return vk_error(device, VK_ERROR_OUT_OF_HOST_MEMORY); + + VkResult result = + vk_command_pool_init(&device->vk, &pool->vk, pCreateInfo, pAllocator); + if (result != VK_SUCCESS) { + vk_free2(&device->vk.alloc, pAllocator, pool); + return result; + } + + panvk_bo_pool_init(&pool->desc_bo_pool); + panvk_bo_pool_init(&pool->varying_bo_pool); + panvk_bo_pool_init(&pool->tls_bo_pool); + *pCmdPool = panvk_cmd_pool_to_handle(pool); + return VK_SUCCESS; +} + +VKAPI_ATTR void VKAPI_CALL +panvk_DestroyCommandPool(VkDevice _device, VkCommandPool commandPool, + const VkAllocationCallbacks *pAllocator) +{ + VK_FROM_HANDLE(panvk_device, device, _device); + VK_FROM_HANDLE(panvk_cmd_pool, pool, commandPool); + + vk_command_pool_finish(&pool->vk); + + panvk_bo_pool_cleanup(&pool->desc_bo_pool); + panvk_bo_pool_cleanup(&pool->varying_bo_pool); + panvk_bo_pool_cleanup(&pool->tls_bo_pool); + + vk_free2(&device->vk.alloc, pAllocator, pool); +} diff --git a/src/panfrost/vulkan/panvk_cmd_pool.h b/src/panfrost/vulkan/panvk_cmd_pool.h new file mode 100644 index 00000000000..5963bf2af1f --- /dev/null +++ b/src/panfrost/vulkan/panvk_cmd_pool.h @@ -0,0 +1,23 @@ +/* + * Copyright © 2021 Collabora Ltd. + * SPDX-License-Identifier: MIT + */ + +#ifndef PANVK_CMD_POOL_H +#define PANVK_CMD_POOL_H + +#include "vk_command_pool.h" + +#include "panvk_mempool.h" + +struct panvk_cmd_pool { + struct vk_command_pool vk; + struct panvk_bo_pool desc_bo_pool; + struct panvk_bo_pool varying_bo_pool; + struct panvk_bo_pool tls_bo_pool; +}; + +VK_DEFINE_NONDISP_HANDLE_CASTS(panvk_cmd_pool, vk.base, VkCommandPool, + VK_OBJECT_TYPE_COMMAND_POOL) + +#endif diff --git a/src/panfrost/vulkan/panvk_private.h b/src/panfrost/vulkan/panvk_private.h index 922854efba6..ea7cc497744 100644 --- a/src/panfrost/vulkan/panvk_private.h +++ b/src/panfrost/vulkan/panvk_private.h @@ -427,13 +427,6 @@ struct panvk_cmd_state { struct panvk_batch *batch; }; -struct panvk_cmd_pool { - struct vk_command_pool vk; - struct panvk_bo_pool desc_bo_pool; - struct panvk_bo_pool varying_bo_pool; - struct panvk_bo_pool tls_bo_pool; -}; - struct panvk_cmd_bind_point_state { struct panvk_descriptor_state desc_state; const struct panvk_pipeline *pipeline; @@ -476,9 +469,6 @@ VK_DEFINE_HANDLE_CASTS(panvk_physical_device, vk.base, VkPhysicalDevice, VK_OBJECT_TYPE_PHYSICAL_DEVICE) VK_DEFINE_HANDLE_CASTS(panvk_queue, vk.base, VkQueue, VK_OBJECT_TYPE_QUEUE) -VK_DEFINE_NONDISP_HANDLE_CASTS(panvk_cmd_pool, vk.base, VkCommandPool, - VK_OBJECT_TYPE_COMMAND_POOL) - #ifdef PAN_ARCH #include "panvk_vX_cmd_buffer.h" #include "panvk_vX_device.h" diff --git a/src/panfrost/vulkan/panvk_vX_cmd_buffer.c b/src/panfrost/vulkan/panvk_vX_cmd_buffer.c index 7c39f2b58fa..e44c97f1927 100644 --- a/src/panfrost/vulkan/panvk_vX_cmd_buffer.c +++ b/src/panfrost/vulkan/panvk_vX_cmd_buffer.c @@ -29,6 +29,7 @@ #include "genxml/gen_macros.h" #include "panvk_buffer.h" +#include "panvk_cmd_pool.h" #include "panvk_event.h" #include "panvk_image.h" #include "panvk_image_view.h" @@ -1608,22 +1609,6 @@ panvk_per_arch(BeginCommandBuffer)(VkCommandBuffer commandBuffer, return VK_SUCCESS; } -VKAPI_ATTR void VKAPI_CALL -panvk_per_arch(DestroyCommandPool)(VkDevice _device, VkCommandPool commandPool, - const VkAllocationCallbacks *pAllocator) -{ - VK_FROM_HANDLE(panvk_device, device, _device); - VK_FROM_HANDLE(panvk_cmd_pool, pool, commandPool); - - vk_command_pool_finish(&pool->vk); - - panvk_bo_pool_cleanup(&pool->desc_bo_pool); - panvk_bo_pool_cleanup(&pool->varying_bo_pool); - panvk_bo_pool_cleanup(&pool->tls_bo_pool); - - vk_free2(&device->vk.alloc, pAllocator, pool); -} - VKAPI_ATTR void VKAPI_CALL panvk_per_arch(CmdDispatch)(VkCommandBuffer commandBuffer, uint32_t x, uint32_t y, uint32_t z)