From 12d18abfe7a523d91739a6f0fb0f59c66d0478f3 Mon Sep 17 00:00:00 2001 From: Chia-I Wu Date: Wed, 14 Jul 2021 16:08:25 -0700 Subject: [PATCH] venus: refactor vn_EndCommandBuffer Add vn_cmd_submit as a wrapper to vn_instance_ring_submit. It is also designed such that it can be called from any of the vn_Cmd* functions. Signed-off-by: Chia-I Wu Reviewed-by: Yiwei Zhang Part-of: --- src/virtio/vulkan/vn_command_buffer.c | 41 ++++++++++++++++++--------- 1 file changed, 28 insertions(+), 13 deletions(-) diff --git a/src/virtio/vulkan/vn_command_buffer.c b/src/virtio/vulkan/vn_command_buffer.c index 65e0e45a21c..eb0a9f6d04e 100644 --- a/src/virtio/vulkan/vn_command_buffer.c +++ b/src/virtio/vulkan/vn_command_buffer.c @@ -654,6 +654,33 @@ vn_BeginCommandBuffer(VkCommandBuffer commandBuffer, return VK_SUCCESS; } +static VkResult +vn_cmd_submit(struct vn_command_buffer *cmd) +{ + struct vn_instance *instance = cmd->device->instance; + + if (cmd->state != VN_COMMAND_BUFFER_STATE_RECORDING) + return VK_ERROR_OUT_OF_HOST_MEMORY; + + vn_cs_encoder_commit(&cmd->cs); + if (vn_cs_encoder_get_fatal(&cmd->cs)) { + cmd->state = VN_COMMAND_BUFFER_STATE_INVALID; + vn_cs_encoder_reset(&cmd->cs); + return VK_ERROR_OUT_OF_HOST_MEMORY; + } + + vn_instance_wait_roundtrip(instance, cmd->cs.current_buffer_roundtrip); + VkResult result = vn_instance_ring_submit(instance, &cmd->cs); + if (result != VK_SUCCESS) { + cmd->state = VN_COMMAND_BUFFER_STATE_INVALID; + return result; + } + + vn_cs_encoder_reset(&cmd->cs); + + return VK_SUCCESS; +} + VkResult vn_EndCommandBuffer(VkCommandBuffer commandBuffer) { @@ -662,9 +689,6 @@ vn_EndCommandBuffer(VkCommandBuffer commandBuffer) struct vn_instance *instance = cmd->device->instance; size_t cmd_size; - if (cmd->state != VN_COMMAND_BUFFER_STATE_RECORDING) - return vn_error(instance, VK_ERROR_OUT_OF_HOST_MEMORY); - cmd_size = vn_sizeof_vkEndCommandBuffer(commandBuffer); if (!vn_cs_encoder_reserve(&cmd->cs, cmd_size)) { cmd->state = VN_COMMAND_BUFFER_STATE_INVALID; @@ -672,22 +696,13 @@ vn_EndCommandBuffer(VkCommandBuffer commandBuffer) } vn_encode_vkEndCommandBuffer(&cmd->cs, 0, commandBuffer); - vn_cs_encoder_commit(&cmd->cs); - if (vn_cs_encoder_get_fatal(&cmd->cs)) { - cmd->state = VN_COMMAND_BUFFER_STATE_INVALID; - return vn_error(instance, VK_ERROR_OUT_OF_HOST_MEMORY); - } - - vn_instance_wait_roundtrip(instance, cmd->cs.current_buffer_roundtrip); - VkResult result = vn_instance_ring_submit(instance, &cmd->cs); + VkResult result = vn_cmd_submit(cmd); if (result != VK_SUCCESS) { cmd->state = VN_COMMAND_BUFFER_STATE_INVALID; return vn_error(instance, result); } - vn_cs_encoder_reset(&cmd->cs); - cmd->state = VN_COMMAND_BUFFER_STATE_EXECUTABLE; return VK_SUCCESS;