Module: Mesa Branch: main Commit: fb6fc247718325941d0bb92d88410807e05f9e49 URL: http://cgit.freedesktop.org/mesa/mesa/commit/?id=fb6fc247718325941d0bb92d88410807e05f9e49
Author: Chia-I Wu <[email protected]> Date: Wed May 5 16:17:34 2021 -0700 venus: remember cmd buffer fb attachments We need them for wsi queue ownership transfer. Signed-off-by: Chia-I Wu <[email protected]> Reviewed-by: Yiwei Zhang <[email protected]> Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/10709> --- src/virtio/vulkan/vn_command_buffer.c | 43 +++++++++++++++++++++++++++++++++++ src/virtio/vulkan/vn_command_buffer.h | 1 + 2 files changed, 44 insertions(+) diff --git a/src/virtio/vulkan/vn_command_buffer.c b/src/virtio/vulkan/vn_command_buffer.c index 1a8d2146775..b782aebfce6 100644 --- a/src/virtio/vulkan/vn_command_buffer.c +++ b/src/virtio/vulkan/vn_command_buffer.c @@ -14,6 +14,7 @@ #include "venus-protocol/vn_protocol_driver_command_pool.h" #include "vn_device.h" +#include "vn_image.h" #include "vn_render_pass.h" static void @@ -24,13 +25,55 @@ vn_cmd_begin_render_pass(struct vn_command_buffer *cmd, { cmd->builder.render_pass = pass; cmd->builder.framebuffer = fb; + + if (!pass->present_src_count || + cmd->level == VK_COMMAND_BUFFER_LEVEL_SECONDARY) + return; + + /* find fb attachments */ + const VkImageView *views; + uint32_t view_count; + if (fb->image_view_count) { + views = fb->image_views; + view_count = fb->image_view_count; + } else { + const VkRenderPassAttachmentBeginInfo *imageless_info = + vk_find_struct_const(begin_info->pNext, + RENDER_PASS_ATTACHMENT_BEGIN_INFO); + assert(imageless_info); + views = imageless_info->pAttachments; + view_count = imageless_info->attachmentCount; + } + + const struct vn_image **images = + vk_alloc(&cmd->allocator, sizeof(*images) * pass->present_src_count, + VN_DEFAULT_ALIGN, VK_SYSTEM_ALLOCATION_SCOPE_OBJECT); + if (!images) { + cmd->state = VN_COMMAND_BUFFER_STATE_INVALID; + return; + } + + for (uint32_t i = 0; i < pass->present_src_count; i++) { + const uint32_t index = pass->present_src_attachments[i].index; + assert(index < view_count); + images[i] = vn_image_view_from_handle(views[index])->image; + } + + cmd->builder.present_src_images = images; } static void vn_cmd_end_render_pass(struct vn_command_buffer *cmd) { + const struct vn_render_pass *pass = cmd->builder.render_pass; + cmd->builder.render_pass = NULL; cmd->builder.framebuffer = NULL; + + if (!pass->present_src_count || !cmd->builder.present_src_images) + return; + + vk_free(&cmd->allocator, cmd->builder.present_src_images); } /* command pool commands */ diff --git a/src/virtio/vulkan/vn_command_buffer.h b/src/virtio/vulkan/vn_command_buffer.h index 852a5dab354..f157d7300c5 100644 --- a/src/virtio/vulkan/vn_command_buffer.h +++ b/src/virtio/vulkan/vn_command_buffer.h @@ -42,6 +42,7 @@ struct vn_command_buffer_builder { const struct vn_render_pass *render_pass; const struct vn_framebuffer *framebuffer; + const struct vn_image **present_src_images; }; struct vn_command_buffer { _______________________________________________ mesa-commit mailing list [email protected] https://lists.freedesktop.org/mailman/listinfo/mesa-commit
