venus: Remove cryptic pointer arithmetic on present attachments

Each time some code wanted to access in vn_render_pass the present
acquire attachments or the present release attachments, it needed to
know the memory layout of vn_render_pass and do pointer arithmetic.
It's fragile to handroll this layout knowledge and pointer arithmetic
throughout the code, so add a pointer in vn_render_pass for each
attachment type.

The new pointers are:
  - present_attachments: all present attachments
  - present_acquire_attachments: a subslice of present_attachments
  - present_release_attachments: a subslice of present_attachments

Signed-off-by: Chad Versace <chadversary@chromium.org>
Reviewed-by: Yiwei Zhang <zzyiwei@chromium.org>
Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/16681>
This commit is contained in:
Chad Versace
2022-05-23 16:53:23 -07:00
committed by Marge Bot
parent 2937c100e1
commit 7cc3f046e0
3 changed files with 78 additions and 47 deletions
+13 -12
View File
@@ -366,7 +366,7 @@ vn_cmd_begin_render_pass(struct vn_command_buffer *cmd,
cmd->builder.render_pass = pass;
cmd->builder.framebuffer = fb;
if (!pass->present_src_count ||
if (!pass->present_count ||
cmd->level == VK_COMMAND_BUFFER_LEVEL_SECONDARY)
return;
@@ -386,22 +386,23 @@ vn_cmd_begin_render_pass(struct vn_command_buffer *cmd,
}
const struct vn_image **images =
vk_alloc(&cmd->allocator, sizeof(*images) * pass->present_src_count,
vk_alloc(&cmd->allocator, sizeof(*images) * pass->present_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;
for (uint32_t i = 0; i < pass->present_count; i++) {
const uint32_t index = pass->present_attachments[i].index;
assert(index < view_count);
images[i] = vn_image_view_from_handle(views[index])->image;
}
if (pass->acquire_count) {
vn_cmd_transfer_present_src_images(
cmd, images, pass->present_src_attachments, pass->acquire_count);
if (pass->present_acquire_count) {
vn_cmd_transfer_present_src_images(cmd, images,
pass->present_acquire_attachments,
pass->present_acquire_count);
}
cmd->builder.present_src_images = images;
@@ -415,17 +416,17 @@ vn_cmd_end_render_pass(struct vn_command_buffer *cmd)
cmd->builder.render_pass = NULL;
cmd->builder.framebuffer = NULL;
if (!pass->present_src_count || !cmd->builder.present_src_images)
if (!pass->present_count || !cmd->builder.present_src_images)
return;
const struct vn_image **images = cmd->builder.present_src_images;
cmd->builder.present_src_images = NULL;
if (pass->release_count) {
if (pass->present_release_count) {
vn_cmd_transfer_present_src_images(
cmd, images + pass->acquire_count,
pass->present_src_attachments + pass->acquire_count,
pass->release_count);
cmd, images + pass->present_acquire_count,
pass->present_release_attachments,
pass->present_release_count);
}
vk_free(&cmd->allocator, images);