diff --git a/src/gallium/frontends/lavapipe/lvp_pass.c b/src/gallium/frontends/lavapipe/lvp_pass.c index e887e6721db..0e366f79866 100644 --- a/src/gallium/frontends/lavapipe/lvp_pass.c +++ b/src/gallium/frontends/lavapipe/lvp_pass.c @@ -23,6 +23,8 @@ #include "lvp_private.h" +#include "vk_util.h" + static void lvp_render_pass_compile(struct lvp_render_pass *pass) { @@ -152,6 +154,7 @@ VKAPI_ATTR VkResult VKAPI_CALL lvp_CreateRenderPass( struct lvp_render_pass *pass; size_t size; size_t attachments_offset; + VkRenderPassMultiviewCreateInfo *multiview_info = NULL; assert(pCreateInfo->sType == VK_STRUCTURE_TYPE_RENDER_PASS_CREATE_INFO); @@ -176,6 +179,16 @@ VKAPI_ATTR VkResult VKAPI_CALL lvp_CreateRenderPass( pass->subpass_count = pCreateInfo->subpassCount; pass->attachments = (struct lvp_render_pass_attachment *)((char *)pass + attachments_offset); + vk_foreach_struct(ext, pCreateInfo->pNext) { + switch(ext->sType) { + case VK_STRUCTURE_TYPE_RENDER_PASS_MULTIVIEW_CREATE_INFO: + multiview_info = (VkRenderPassMultiviewCreateInfo*)ext; + break; + default: + break; + } + } + for (uint32_t i = 0; i < pCreateInfo->attachmentCount; i++) { struct lvp_render_pass_attachment *att = &pass->attachments[i]; @@ -214,6 +227,9 @@ VKAPI_ATTR VkResult VKAPI_CALL lvp_CreateRenderPass( subpass->attachment_count = lvp_num_subpass_attachments(desc); subpass->attachments = p; + if (multiview_info) + subpass->view_mask = multiview_info->pViewMasks[i]; + if (desc->inputAttachmentCount > 0) { subpass->input_attachments = p; p += desc->inputAttachmentCount; diff --git a/src/gallium/frontends/lavapipe/lvp_private.h b/src/gallium/frontends/lavapipe/lvp_private.h index cb9e9d31579..4e54f9c7295 100644 --- a/src/gallium/frontends/lavapipe/lvp_private.h +++ b/src/gallium/frontends/lavapipe/lvp_private.h @@ -353,6 +353,8 @@ struct lvp_subpass { bool has_color_att; VkSampleCountFlagBits max_sample_count; + + uint32_t view_mask; }; struct lvp_render_pass_attachment {