From e379cd9a0e2822851c1745b473521e3a49bfbdd3 Mon Sep 17 00:00:00 2001 From: Jason Ekstrand Date: Thu, 30 Jul 2015 14:55:49 -0700 Subject: [PATCH] vk/cmd_buffer: Add a simple command pool implementation --- src/vulkan/anv_cmd_emit.c | 54 +++++++++++++++++++++++++++++++++++++++ src/vulkan/anv_device.c | 27 -------------------- src/vulkan/anv_private.h | 7 +++++ 3 files changed, 61 insertions(+), 27 deletions(-) diff --git a/src/vulkan/anv_cmd_emit.c b/src/vulkan/anv_cmd_emit.c index 64acec82154..3b9e67fdd0f 100644 --- a/src/vulkan/anv_cmd_emit.c +++ b/src/vulkan/anv_cmd_emit.c @@ -63,6 +63,7 @@ VkResult anv_CreateCommandBuffer( VkCmdBuffer* pCmdBuffer) { ANV_FROM_HANDLE(anv_device, device, _device); + ANV_FROM_HANDLE(anv_cmd_pool, pool, pCreateInfo->cmdPool); struct anv_cmd_buffer *cmd_buffer; VkResult result; @@ -87,6 +88,8 @@ VkResult anv_CreateCommandBuffer( anv_cmd_state_init(&cmd_buffer->state); + list_addtail(&cmd_buffer->pool_link, &pool->cmd_buffers); + *pCmdBuffer = anv_cmd_buffer_to_handle(cmd_buffer); return VK_SUCCESS; @@ -103,6 +106,8 @@ VkResult anv_DestroyCommandBuffer( ANV_FROM_HANDLE(anv_device, device, _device); ANV_FROM_HANDLE(anv_cmd_buffer, cmd_buffer, _cmd_buffer); + list_del(&cmd_buffer->pool_link); + anv_cmd_buffer_fini_batch_bo_chain(cmd_buffer); anv_state_stream_finish(&cmd_buffer->surface_state_stream); @@ -1369,3 +1374,52 @@ void anv_CmdExecuteCommands( anv_cmd_buffer_add_secondary(primary, secondary); } } + +VkResult anv_CreateCommandPool( + VkDevice _device, + const VkCmdPoolCreateInfo* pCreateInfo, + VkCmdPool* pCmdPool) +{ + ANV_FROM_HANDLE(anv_device, device, _device); + struct anv_cmd_pool *pool; + + pool = anv_device_alloc(device, sizeof(*pool), 8, + VK_SYSTEM_ALLOC_TYPE_API_OBJECT); + if (pool == NULL) + return vk_error(VK_ERROR_OUT_OF_HOST_MEMORY); + + list_inithead(&pool->cmd_buffers); + + *pCmdPool = anv_cmd_pool_to_handle(pool); + + return VK_SUCCESS; +} + +VkResult anv_DestroyCommandPool( + VkDevice _device, + VkCmdPool cmdPool) +{ + ANV_FROM_HANDLE(anv_device, device, _device); + ANV_FROM_HANDLE(anv_cmd_pool, pool, cmdPool); + + anv_ResetCommandPool(_device, cmdPool, 0); + + anv_device_free(device, pool); + + return VK_SUCCESS; +} + +VkResult anv_ResetCommandPool( + VkDevice device, + VkCmdPool cmdPool, + VkCmdPoolResetFlags flags) +{ + ANV_FROM_HANDLE(anv_cmd_pool, pool, cmdPool); + + list_for_each_entry_safe(struct anv_cmd_buffer, cmd_buffer, + &pool->cmd_buffers, pool_link) { + anv_DestroyCommandBuffer(device, anv_cmd_buffer_to_handle(cmd_buffer)); + } + + return VK_SUCCESS; +} diff --git a/src/vulkan/anv_device.c b/src/vulkan/anv_device.c index 46e2d9b6d1b..01eff02d25d 100644 --- a/src/vulkan/anv_device.c +++ b/src/vulkan/anv_device.c @@ -2170,33 +2170,6 @@ VkResult anv_DestroyDynamicDepthStencilState( return VK_SUCCESS; } -// Command buffer functions - -VkResult anv_CreateCommandPool( - VkDevice device, - const VkCmdPoolCreateInfo* pCreateInfo, - VkCmdPool* pCmdPool) -{ - pCmdPool->handle = 7; - - stub_return(VK_SUCCESS); -} - -VkResult anv_DestroyCommandPool( - VkDevice device, - VkCmdPool cmdPool) -{ - stub_return(VK_SUCCESS); -} - -VkResult anv_ResetCommandPool( - VkDevice device, - VkCmdPool cmdPool, - VkCmdPoolResetFlags flags) -{ - stub_return(VK_UNSUPPORTED); -} - VkResult anv_CreateFramebuffer( VkDevice _device, const VkFramebufferCreateInfo* pCreateInfo, diff --git a/src/vulkan/anv_private.h b/src/vulkan/anv_private.h index d2b4b70e97f..12f826c1ab1 100644 --- a/src/vulkan/anv_private.h +++ b/src/vulkan/anv_private.h @@ -690,6 +690,10 @@ struct anv_cmd_state { struct anv_descriptor_set_binding descriptors[MAX_SETS]; }; +struct anv_cmd_pool { + struct list_head cmd_buffers; +}; + #define ANV_CMD_BUFFER_BATCH_SIZE 8192 enum anv_cmd_buffer_exec_mode { @@ -702,6 +706,8 @@ enum anv_cmd_buffer_exec_mode { struct anv_cmd_buffer { struct anv_device * device; + struct list_head pool_link; + struct anv_batch batch; /* Fields required for the actual chain of anv_batch_bo's. @@ -1088,6 +1094,7 @@ ANV_DEFINE_HANDLE_CASTS(anv_physical_device, VkPhysicalDevice) ANV_DEFINE_HANDLE_CASTS(anv_queue, VkQueue) ANV_DEFINE_HANDLE_CASTS(anv_swap_chain, VkSwapChainWSI); +ANV_DEFINE_NONDISP_HANDLE_CASTS(anv_cmd_pool, VkCmdPool) ANV_DEFINE_NONDISP_HANDLE_CASTS(anv_attachment_view, VkAttachmentView) ANV_DEFINE_NONDISP_HANDLE_CASTS(anv_buffer, VkBuffer) ANV_DEFINE_NONDISP_HANDLE_CASTS(anv_buffer_view, VkBufferView); -- 2.30.2