diff --git a/src/broadcom/vulkan/v3dv_cmd_buffer.c b/src/broadcom/vulkan/v3dv_cmd_buffer.c index 12a9c6d4676..66ecf7603ae 100644 --- a/src/broadcom/vulkan/v3dv_cmd_buffer.c +++ b/src/broadcom/vulkan/v3dv_cmd_buffer.c @@ -84,9 +84,22 @@ static void cmd_buffer_destroy(struct v3dv_cmd_buffer *cmd_buffer) { list_del(&cmd_buffer->pool_link); + v3dv_cl_destroy(&cmd_buffer->bcl); + v3dv_cl_destroy(&cmd_buffer->rcl); + v3dv_cl_destroy(&cmd_buffer->indirect); vk_free(&cmd_buffer->pool->alloc, cmd_buffer); } +static VkResult +cmd_buffer_reset(struct v3dv_cmd_buffer *cmd_buffer) +{ + cmd_buffer->usage_flags = 0; + v3dv_cl_reset(&cmd_buffer->bcl); + v3dv_cl_reset(&cmd_buffer->rcl); + v3dv_cl_reset(&cmd_buffer->indirect); + return VK_SUCCESS; +} + VkResult v3dv_AllocateCommandBuffers(VkDevice _device, const VkCommandBufferAllocateInfo *pAllocateInfo, @@ -152,3 +165,29 @@ v3dv_DestroyCommandPool(VkDevice _device, vk_free2(&device->alloc, pAllocator, pool); } + +VkResult +v3dv_BeginCommandBuffer(VkCommandBuffer commandBuffer, + const VkCommandBufferBeginInfo *pBeginInfo) +{ + V3DV_FROM_HANDLE(v3dv_cmd_buffer, cmd_buffer, commandBuffer); + + assert(cmd_buffer->level == VK_COMMAND_BUFFER_LEVEL_SECONDARY || + !(cmd_buffer->usage_flags & VK_COMMAND_BUFFER_USAGE_RENDER_PASS_CONTINUE_BIT)); + + /* If this is the first vkBeginCommandBuffer, we must initialize the + * command buffer's state. Otherwise, we must reset its state. In both + * cases we reset it. + */ + VkResult result = cmd_buffer_reset(cmd_buffer); + if (result != VK_SUCCESS) + return result; + + cmd_buffer->usage_flags = pBeginInfo->flags; + + v3dv_cl_init(cmd_buffer, &cmd_buffer->bcl); + v3dv_cl_init(cmd_buffer, &cmd_buffer->rcl); + v3dv_cl_init(cmd_buffer, &cmd_buffer->indirect); + + return VK_SUCCESS; +} diff --git a/src/broadcom/vulkan/v3dv_private.h b/src/broadcom/vulkan/v3dv_private.h index 7e14c748f01..9430ac89169 100644 --- a/src/broadcom/vulkan/v3dv_private.h +++ b/src/broadcom/vulkan/v3dv_private.h @@ -345,6 +345,10 @@ struct v3dv_cmd_buffer { VkCommandBufferUsageFlags usage_flags; VkCommandBufferLevel level; + + struct v3dv_cl bcl; + struct v3dv_cl rcl; + struct v3dv_cl indirect; }; struct v3dv_shader_module {