From 70ea65490c20f447daabf118aa9d4d7ddb90d315 Mon Sep 17 00:00:00 2001 From: Iago Toral Quiroga Date: Fri, 2 Sep 2022 11:32:59 +0200 Subject: [PATCH] v3dv: switch to common code for command buffer lifecycles MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit This gives us the capacity to recycle command buffers in the pool. Based on a similar change done by Jason to Anvil. Reviewed-by: Alejandro PiƱeiro Part-of: --- src/broadcom/vulkan/v3dv_cmd_buffer.c | 81 ++++++++------------------- src/broadcom/vulkan/v3dv_device.c | 2 + src/broadcom/vulkan/v3dv_private.h | 2 + 3 files changed, 28 insertions(+), 57 deletions(-) diff --git a/src/broadcom/vulkan/v3dv_cmd_buffer.c b/src/broadcom/vulkan/v3dv_cmd_buffer.c index 86fe936de8c..bb29d0b5f62 100644 --- a/src/broadcom/vulkan/v3dv_cmd_buffer.c +++ b/src/broadcom/vulkan/v3dv_cmd_buffer.c @@ -74,18 +74,13 @@ cmd_buffer_init(struct v3dv_cmd_buffer *cmd_buffer, cmd_buffer->status = V3DV_CMD_BUFFER_STATUS_INITIALIZED; } -static void cmd_buffer_destroy(struct vk_command_buffer *cmd_buffer); - -static const struct vk_command_buffer_ops cmd_buffer_ops = { - .destroy = cmd_buffer_destroy, -}; - static VkResult -cmd_buffer_create(struct v3dv_device *device, - struct vk_command_pool *pool, - VkCommandBufferLevel level, - VkCommandBuffer *pCommandBuffer) +cmd_buffer_create(struct vk_command_pool *pool, + struct vk_command_buffer **cmd_buffer_out) { + struct v3dv_device *device = + container_of(pool->base.device, struct v3dv_device, vk); + struct v3dv_cmd_buffer *cmd_buffer; cmd_buffer = vk_zalloc(&pool->alloc, sizeof(*cmd_buffer), @@ -94,9 +89,13 @@ cmd_buffer_create(struct v3dv_device *device, if (cmd_buffer == NULL) return vk_error(device, VK_ERROR_OUT_OF_HOST_MEMORY); + /* Here we pass 0 as level because this callback hook doesn't have the level + * info, but that's fine, vk_common_AllocateCommandBuffers will fix it up + * after creation. + */ VkResult result; result = vk_command_buffer_init(pool, &cmd_buffer->vk, - &cmd_buffer_ops, level); + &v3dv_cmd_buffer_ops, 0 /* level */); if (result != VK_SUCCESS) { vk_free(&pool->alloc, cmd_buffer); return result; @@ -104,7 +103,7 @@ cmd_buffer_create(struct v3dv_device *device, cmd_buffer_init(cmd_buffer, device); - *pCommandBuffer = v3dv_cmd_buffer_to_handle(cmd_buffer); + *cmd_buffer_out = &cmd_buffer->vk; return VK_SUCCESS; } @@ -833,10 +832,13 @@ v3dv_cmd_buffer_start_job(struct v3dv_cmd_buffer *cmd_buffer, return job; } -static VkResult -cmd_buffer_reset(struct v3dv_cmd_buffer *cmd_buffer, +static void +cmd_buffer_reset(struct vk_command_buffer *vk_cmd_buffer, VkCommandBufferResetFlags flags) { + struct v3dv_cmd_buffer *cmd_buffer = + container_of(vk_cmd_buffer, struct v3dv_cmd_buffer, vk); + vk_command_buffer_reset(&cmd_buffer->vk); if (cmd_buffer->status != V3DV_CMD_BUFFER_STATUS_INITIALIZED) { struct v3dv_device *device = cmd_buffer->device; @@ -851,37 +853,6 @@ cmd_buffer_reset(struct v3dv_cmd_buffer *cmd_buffer, } assert(cmd_buffer->status == V3DV_CMD_BUFFER_STATUS_INITIALIZED); - return VK_SUCCESS; -} - -VKAPI_ATTR VkResult VKAPI_CALL -v3dv_AllocateCommandBuffers(VkDevice _device, - const VkCommandBufferAllocateInfo *pAllocateInfo, - VkCommandBuffer *pCommandBuffers) -{ - V3DV_FROM_HANDLE(v3dv_device, device, _device); - VK_FROM_HANDLE(vk_command_pool, pool, pAllocateInfo->commandPool); - - 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) { - while (i--) { - VK_FROM_HANDLE(vk_command_buffer, cmd_buffer, pCommandBuffers[i]); - cmd_buffer_destroy(cmd_buffer); - } - for (i = 0; i < pAllocateInfo->commandBufferCount; i++) - pCommandBuffers[i] = VK_NULL_HANDLE; - } - - return result; } static void @@ -1035,6 +1006,12 @@ cmd_buffer_begin_render_pass_secondary( return VK_SUCCESS; } +const struct vk_command_buffer_ops v3dv_cmd_buffer_ops = { + .create = cmd_buffer_create, + .reset = cmd_buffer_reset, + .destroy = cmd_buffer_destroy, +}; + VKAPI_ATTR VkResult VKAPI_CALL v3dv_BeginCommandBuffer(VkCommandBuffer commandBuffer, const VkCommandBufferBeginInfo *pBeginInfo) @@ -1045,9 +1022,7 @@ v3dv_BeginCommandBuffer(VkCommandBuffer commandBuffer, * command buffer's state. Otherwise, we must reset its state. In both * cases we reset it. */ - VkResult result = cmd_buffer_reset(cmd_buffer, 0); - if (result != VK_SUCCESS) - return result; + cmd_buffer_reset(&cmd_buffer->vk, 0); assert(cmd_buffer->status == V3DV_CMD_BUFFER_STATUS_INITIALIZED); @@ -1055,7 +1030,7 @@ v3dv_BeginCommandBuffer(VkCommandBuffer commandBuffer, if (cmd_buffer->vk.level == VK_COMMAND_BUFFER_LEVEL_SECONDARY) { if (pBeginInfo->flags & VK_COMMAND_BUFFER_USAGE_RENDER_PASS_CONTINUE_BIT) { - result = + VkResult result = cmd_buffer_begin_render_pass_secondary(cmd_buffer, pBeginInfo->pInheritanceInfo); if (result != VK_SUCCESS) @@ -1068,14 +1043,6 @@ v3dv_BeginCommandBuffer(VkCommandBuffer commandBuffer, return VK_SUCCESS; } -VKAPI_ATTR VkResult VKAPI_CALL -v3dv_ResetCommandBuffer(VkCommandBuffer commandBuffer, - VkCommandBufferResetFlags flags) -{ - V3DV_FROM_HANDLE(v3dv_cmd_buffer, cmd_buffer, commandBuffer); - return cmd_buffer_reset(cmd_buffer, flags); -} - static void cmd_buffer_update_tile_alignment(struct v3dv_cmd_buffer *cmd_buffer) { diff --git a/src/broadcom/vulkan/v3dv_device.c b/src/broadcom/vulkan/v3dv_device.c index 6d7aa11b1fe..d623dd84a8c 100644 --- a/src/broadcom/vulkan/v3dv_device.c +++ b/src/broadcom/vulkan/v3dv_device.c @@ -1945,6 +1945,8 @@ v3dv_CreateDevice(VkPhysicalDevice physicalDevice, mtx_init(&device->query_mutex, mtx_plain); cnd_init(&device->query_ended); + device->vk.command_buffer_ops = &v3dv_cmd_buffer_ops; + vk_device_set_drm_fd(&device->vk, physical_device->render_fd); vk_device_enable_threaded_submit(&device->vk); diff --git a/src/broadcom/vulkan/v3dv_private.h b/src/broadcom/vulkan/v3dv_private.h index 182ec53688b..a2196386fcc 100644 --- a/src/broadcom/vulkan/v3dv_private.h +++ b/src/broadcom/vulkan/v3dv_private.h @@ -1521,6 +1521,8 @@ struct v3dv_cmd_buffer_private_obj { v3dv_cmd_buffer_private_obj_destroy_cb destroy_cb; }; +extern const struct vk_command_buffer_ops v3dv_cmd_buffer_ops; + struct v3dv_cmd_buffer { struct vk_command_buffer vk;