From d9a7ba317c2c022aaed2124dd4a0ecfeafddc2e5 Mon Sep 17 00:00:00 2001 From: Iago Toral Quiroga Date: Tue, 10 Dec 2019 09:33:13 +0100 Subject: [PATCH] v3dv: implement vk{Allocate,Free}CommandBuffers Part-of: --- src/broadcom/vulkan/v3dv_cmd_buffer.c | 87 +++++++++++++++++++++++++++ src/broadcom/vulkan/v3dv_private.h | 20 +++--- 2 files changed, 99 insertions(+), 8 deletions(-) diff --git a/src/broadcom/vulkan/v3dv_cmd_buffer.c b/src/broadcom/vulkan/v3dv_cmd_buffer.c index c84b5ad6bbc..12a9c6d4676 100644 --- a/src/broadcom/vulkan/v3dv_cmd_buffer.c +++ b/src/broadcom/vulkan/v3dv_cmd_buffer.c @@ -52,6 +52,88 @@ v3dv_CreateCommandPool(VkDevice _device, return VK_SUCCESS; } +static VkResult +cmd_buffer_create(struct v3dv_device *device, + struct v3dv_cmd_pool *pool, + VkCommandBufferLevel level, + VkCommandBuffer *pCommandBuffer) +{ + struct v3dv_cmd_buffer *cmd_buffer; + cmd_buffer = vk_zalloc(&pool->alloc, sizeof(*cmd_buffer), 8, + VK_SYSTEM_ALLOCATION_SCOPE_OBJECT); + if (cmd_buffer == NULL) + return vk_error(device->instance, VK_ERROR_OUT_OF_HOST_MEMORY); + + cmd_buffer->_loader_data.loaderMagic = ICD_LOADER_MAGIC; + cmd_buffer->device = device; + cmd_buffer->pool = pool; + cmd_buffer->level = level; + cmd_buffer->usage_flags = 0; + + /* FIXME: setup command list structures */ + + assert(pool); + list_addtail(&cmd_buffer->pool_link, &pool->cmd_buffers); + + *pCommandBuffer = v3dv_cmd_buffer_to_handle(cmd_buffer); + + return VK_SUCCESS; +} + +static void +cmd_buffer_destroy(struct v3dv_cmd_buffer *cmd_buffer) +{ + list_del(&cmd_buffer->pool_link); + vk_free(&cmd_buffer->pool->alloc, cmd_buffer); +} + +VkResult +v3dv_AllocateCommandBuffers(VkDevice _device, + const VkCommandBufferAllocateInfo *pAllocateInfo, + VkCommandBuffer *pCommandBuffers) +{ + V3DV_FROM_HANDLE(v3dv_device, device, _device); + V3DV_FROM_HANDLE(v3dv_cmd_pool, pool, pAllocateInfo->commandPool); + + /* FIXME: implement secondary command buffers */ + assert(pAllocateInfo->level == VK_COMMAND_BUFFER_LEVEL_PRIMARY); + + VkResult result = VK_SUCCESS; + uint32_t i; + + for (i = 0; i < pAllocateInfo->commandBufferCount; i++) { + result = cmd_buffer_create(device, pool, pAllocateInfo->level, + &pCommandBuffers[i]); + if (result != VK_SUCCESS) + break; + } + + if (result != VK_SUCCESS) { + v3dv_FreeCommandBuffers(_device, pAllocateInfo->commandPool, + i, pCommandBuffers); + for (i = 0; i < pAllocateInfo->commandBufferCount; i++) + pCommandBuffers[i] = VK_NULL_HANDLE; + } + + return result; +} + +void +v3dv_FreeCommandBuffers(VkDevice device, + VkCommandPool commandPool, + uint32_t commandBufferCount, + const VkCommandBuffer *pCommandBuffers) +{ + for (uint32_t i = 0; i < commandBufferCount; i++) { + V3DV_FROM_HANDLE(v3dv_cmd_buffer, cmd_buffer, pCommandBuffers[i]); + + if (!cmd_buffer) + continue; + + cmd_buffer_destroy(cmd_buffer); + } +} + void v3dv_DestroyCommandPool(VkDevice _device, VkCommandPool commandPool, @@ -63,5 +145,10 @@ v3dv_DestroyCommandPool(VkDevice _device, if (!pool) return; + list_for_each_entry_safe(struct v3dv_cmd_buffer, cmd_buffer, + &pool->cmd_buffers, pool_link) { + cmd_buffer_destroy(cmd_buffer); + } + vk_free2(&device->alloc, pAllocator, pool); } diff --git a/src/broadcom/vulkan/v3dv_private.h b/src/broadcom/vulkan/v3dv_private.h index c0200c105c1..b5b517b20a1 100644 --- a/src/broadcom/vulkan/v3dv_private.h +++ b/src/broadcom/vulkan/v3dv_private.h @@ -165,14 +165,6 @@ struct v3dv_device { /* FIXME: stub */ }; -struct v3dv_cmd_buffer { - VK_LOADER_DATA _loader_data; - - struct v3dv_device *device; - - /* FIXME: stub */ -}; - struct v3dv_device_memory { /* FIXME: Can we refactor and resuse v3d_bo here? */ uint32_t handle; @@ -348,6 +340,18 @@ struct v3dv_cmd_pool { struct list_head cmd_buffers; }; +struct v3dv_cmd_buffer { + VK_LOADER_DATA _loader_data; + + struct v3dv_device *device; + + struct v3dv_cmd_pool *pool; + struct list_head pool_link; + + VkCommandBufferUsageFlags usage_flags; + VkCommandBufferLevel level; +}; + struct v3dv_shader_module { unsigned char sha1[20]; uint32_t size;