diff --git a/src/vulkan/runtime/vk_render_pass.c b/src/vulkan/runtime/vk_render_pass.c index 32466cf7210..16444ca0f4f 100644 --- a/src/vulkan/runtime/vk_render_pass.c +++ b/src/vulkan/runtime/vk_render_pass.c @@ -341,6 +341,7 @@ vk_render_pass_attachment_init(struct vk_render_pass_attachment *att, { *att = (struct vk_render_pass_attachment) { .format = desc->format, + .flags = desc->flags, .aspects = vk_format_aspects(desc->format), .samples = desc->samples, .view_mask = 0, @@ -1032,6 +1033,17 @@ vk_get_command_buffer_inheritance_rendering_info( COMMAND_BUFFER_INHERITANCE_RENDERING_INFO); } +static VkRenderingAttachmentFlagBitsKHR +vk_attachment_description_flags_to_rendering_flags(VkAttachmentDescriptionFlags flags) +{ + VkRenderingAttachmentFlagBitsKHR ret = 0; + if (flags & VK_ATTACHMENT_DESCRIPTION_RESOLVE_SKIP_TRANSFER_FUNCTION_BIT_KHR) + ret |= VK_RENDERING_ATTACHMENT_RESOLVE_SKIP_TRANSFER_FUNCTION_BIT_KHR; + if (flags & VK_ATTACHMENT_DESCRIPTION_RESOLVE_ENABLE_TRANSFER_FUNCTION_BIT_KHR) + ret |= VK_RENDERING_ATTACHMENT_RESOLVE_ENABLE_TRANSFER_FUNCTION_BIT_KHR; + return ret; +} + const VkRenderingInfo * vk_get_command_buffer_inheritance_as_rendering_resume( VkCommandBufferLevel level, @@ -1081,6 +1093,9 @@ vk_get_command_buffer_inheritance_as_rendering_resume( }; VkRenderingAttachmentInfo *attachments = data->attachments; + VkRenderingAttachmentFlagsInfoKHR *attachments_flags = (VkRenderingAttachmentFlagsInfoKHR *) + (data->attachments + subpass->color_count + + 2 * (subpass->depth_stencil_attachment != NULL)); for (unsigned i = 0; i < subpass->color_count; i++) { const struct vk_subpass_attachment *sp_att = @@ -1094,8 +1109,16 @@ vk_get_command_buffer_inheritance_as_rendering_resume( } assert(sp_att->attachment < pass->attachment_count); + + attachments_flags[i] = (VkRenderingAttachmentFlagsInfoKHR) { + .sType = VK_STRUCTURE_TYPE_RENDERING_ATTACHMENT_FLAGS_INFO_KHR, + .flags = vk_attachment_description_flags_to_rendering_flags( + pass->attachments[sp_att->attachment].flags), + }; + attachments[i] = (VkRenderingAttachmentInfo) { .sType = VK_STRUCTURE_TYPE_RENDERING_ATTACHMENT_INFO, + .pNext = &attachments_flags[i], .imageView = fb->attachments[sp_att->attachment], .imageLayout = sp_att->layout, .loadOp = VK_ATTACHMENT_LOAD_OP_LOAD, @@ -1773,8 +1796,14 @@ load_attachment(struct vk_command_buffer *cmd_buffer, if (!need_load_store) return; + const VkRenderingAttachmentFlagsInfoKHR att_flags = { + .sType = VK_STRUCTURE_TYPE_RENDERING_ATTACHMENT_FLAGS_INFO_KHR, + .flags = vk_attachment_description_flags_to_rendering_flags(rp_att->flags), + }; + const VkRenderingAttachmentInfo att = { .sType = VK_STRUCTURE_TYPE_RENDERING_ATTACHMENT_INFO, + .pNext = &att_flags, .imageView = vk_image_view_to_handle(att_state->image_view), .imageLayout = layout, .loadOp = rp_att->load_op, @@ -1784,6 +1813,7 @@ load_attachment(struct vk_command_buffer *cmd_buffer, const VkRenderingAttachmentInfo stencil_att = { .sType = VK_STRUCTURE_TYPE_RENDERING_ATTACHMENT_INFO, + .pNext = &att_flags, .imageView = vk_image_view_to_handle(att_state->image_view), .imageLayout = stencil_layout, .loadOp = rp_att->stencil_load_op, @@ -1832,6 +1862,8 @@ begin_subpass(struct vk_command_buffer *cmd_buffer, * or quick vkCmdBegin/EndRendering to do the load op. */ + STACK_ARRAY(VkRenderingAttachmentFlagsInfoKHR, color_attachments_flags, + subpass->color_count); STACK_ARRAY(VkRenderingAttachmentInfo, color_attachments, subpass->color_count); STACK_ARRAY(VkRenderingAttachmentInitialLayoutInfoMESA, @@ -1841,6 +1873,8 @@ begin_subpass(struct vk_command_buffer *cmd_buffer, for (uint32_t i = 0; i < subpass->color_count; i++) { const struct vk_subpass_attachment *sp_att = &subpass->color_attachments[i]; + VkRenderingAttachmentFlagsInfoKHR *color_attachment_flags = + &color_attachments_flags[i]; VkRenderingAttachmentInfo *color_attachment = &color_attachments[i]; if (sp_att->attachment == VK_ATTACHMENT_UNUSED) { @@ -1857,8 +1891,13 @@ begin_subpass(struct vk_command_buffer *cmd_buffer, struct vk_attachment_state *att_state = &cmd_buffer->attachments[sp_att->attachment]; + *color_attachment_flags = (VkRenderingAttachmentFlagsInfoKHR) { + .sType = VK_STRUCTURE_TYPE_RENDERING_ATTACHMENT_FLAGS_INFO_KHR, + }; + *color_attachment = (VkRenderingAttachmentInfo) { .sType = VK_STRUCTURE_TYPE_RENDERING_ATTACHMENT_INFO, + .pNext = color_attachment_flags, .imageView = vk_image_view_to_handle(att_state->image_view), .imageLayout = sp_att->layout, }; @@ -1934,6 +1973,9 @@ begin_subpass(struct vk_command_buffer *cmd_buffer, color_attachment->resolveImageView = vk_image_view_to_handle(res_att_state->image_view); color_attachment->resolveImageLayout = sp_att->resolve->layout; + + color_attachment_flags->flags = + vk_attachment_description_flags_to_rendering_flags(resolve_att->flags); } else if (subpass->mrtss.multisampledRenderToSingleSampledEnable && rp_att->samples == VK_SAMPLE_COUNT_1_BIT) { if (vk_format_is_int(att_state->image_view->format)) @@ -1949,6 +1991,12 @@ begin_subpass(struct vk_command_buffer *cmd_buffer, VkRenderingAttachmentInfo stencil_attachment = { .sType = VK_STRUCTURE_TYPE_RENDERING_ATTACHMENT_INFO, }; + VkRenderingAttachmentFlagsInfoKHR depth_attachment_flags = { + .sType = VK_STRUCTURE_TYPE_RENDERING_ATTACHMENT_FLAGS_INFO_KHR, + }; + VkRenderingAttachmentFlagsInfoKHR stencil_attachment_flags = { + .sType = VK_STRUCTURE_TYPE_RENDERING_ATTACHMENT_FLAGS_INFO_KHR, + }; VkRenderingAttachmentInitialLayoutInfoMESA depth_initial_layout = { .sType = VK_STRUCTURE_TYPE_RENDERING_ATTACHMENT_INITIAL_LAYOUT_INFO_MESA, }; @@ -1972,14 +2020,23 @@ begin_subpass(struct vk_command_buffer *cmd_buffer, depth_attachment.imageView = vk_image_view_to_handle(att_state->image_view); depth_attachment.imageLayout = sp_att->layout; + depth_attachment_flags.flags = + vk_attachment_description_flags_to_rendering_flags(rp_att->flags); } if (rp_att->aspects & VK_IMAGE_ASPECT_STENCIL_BIT) { stencil_attachment.imageView = vk_image_view_to_handle(att_state->image_view); stencil_attachment.imageLayout = sp_att->stencil_layout; + stencil_attachment_flags.flags = + vk_attachment_description_flags_to_rendering_flags(rp_att->flags); } + __vk_append_struct(&depth_attachment, + &depth_attachment_flags); + __vk_append_struct(&stencil_attachment, + &stencil_attachment_flags); + if (!(subpass->view_mask & att_state->views_loaded)) { /* None of these views have been used before */ depth_attachment.loadOp = rp_att->load_op; diff --git a/src/vulkan/runtime/vk_render_pass.h b/src/vulkan/runtime/vk_render_pass.h index 9261fcce9fd..cfe62f2ca5d 100644 --- a/src/vulkan/runtime/vk_render_pass.h +++ b/src/vulkan/runtime/vk_render_pass.h @@ -178,6 +178,9 @@ struct vk_render_pass_attachment { /** VkAttachmentDescription2::format */ VkFormat format; + /** VkAttachmentDescription2::flags */ + VkAttachmentDescriptionFlags flags; + /** Aspects contained in format */ VkImageAspectFlags aspects; @@ -387,7 +390,8 @@ struct vk_gcbiarr_data { #define VK_GCBIARR_DATA_SIZE(max_color_rts) (\ sizeof(struct vk_gcbiarr_data) + \ - sizeof(VkRenderingAttachmentInfo) * ((max_color_rts) + 2) \ + sizeof(VkRenderingAttachmentInfo) * ((max_color_rts) + 2) + \ + sizeof(VkRenderingAttachmentFlagsInfoKHR) * ((max_color_rts) + 2) \ ) /**