Mesa (main): venus: remember cmd buffer fb attachments
GitLab Mirror
gitlab-mirror at kemper.freedesktop.org
Thu Jun 3 06:13:17 UTC 2021
Module: Mesa
Branch: main
Commit: fb6fc247718325941d0bb92d88410807e05f9e49
URL: http://cgit.freedesktop.org/mesa/mesa/commit/?id=fb6fc247718325941d0bb92d88410807e05f9e49
Author: Chia-I Wu <olvaffe at gmail.com>
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 <olvaffe at gmail.com>
Reviewed-by: Yiwei Zhang <zzyiwei at chromium.org>
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 {
More information about the mesa-commit
mailing list