vulkan/render_pass: handle maintenance10 resolve flags

Signed-off-by: Lionel Landwerlin <lionel.g.landwerlin@intel.com>
Reviewed-by: Faith Ekstrand <faith.ekstrand@collabora.com>
Acked-by: Alyssa Rosenzweig <alyssa.rosenzweig@intel.com>
Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/38045>
This commit is contained in:
Lionel Landwerlin 2025-10-15 15:32:13 +03:00 committed by Marge Bot
parent c5740c2548
commit cf81feb660
2 changed files with 62 additions and 1 deletions

View file

@ -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;

View file

@ -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) \
)
/**