vulkan: Record pipeline flags in the render pass

This records any rendering pipeline flags in the render pass.  This
provides much-needed information for the VK_KHR_fragment_shading_rate
and VK_EXT_fragment_density_map extensions as well as provides an
alternative to VkRenderingSelfDependencyInfoMESA which is based on
VK_EXT_attachment_feedback_loop_layout.

v2 (Connor): Name something more general
v3 (Faith): Also add the FSR flag

Reviewed-by: Lionel Landwerlin <lionel.g.landwerlin@intel.com>
Reviewed-by: Connor Abbott <cwabbott0@gmail.com>
Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/22191>
This commit is contained in:
Jason Ekstrand 2022-08-02 13:13:54 -05:00 committed by Marge Bot
parent 9582c1e52a
commit bd26ae0086
2 changed files with 46 additions and 0 deletions

View file

@ -600,6 +600,8 @@ vk_common_CreateRenderPass2(VkDevice _device,
VK_IMAGE_USAGE_FRAGMENT_SHADING_RATE_ATTACHMENT_BIT_KHR);
subpass->fragment_shading_rate_attachment_texel_size =
fsr_att_info->shadingRateAttachmentTexelSize;
subpass->pipeline_flags |=
VK_PIPELINE_CREATE_RENDERING_FRAGMENT_SHADING_RATE_ATTACHMENT_BIT_KHR;
}
/* Figure out any self-dependencies */
@ -618,6 +620,9 @@ vk_common_CreateRenderPass2(VkDevice _device,
VK_IMAGE_LAYOUT_ATTACHMENT_FEEDBACK_LOOP_OPTIMAL_EXT;
subpass->color_attachments[c].layout =
VK_IMAGE_LAYOUT_ATTACHMENT_FEEDBACK_LOOP_OPTIMAL_EXT;
subpass->pipeline_flags |=
VK_PIPELINE_CREATE_COLOR_ATTACHMENT_FEEDBACK_LOOP_BIT_EXT;
color_self_deps |= (1u << c);
}
}
@ -632,6 +637,8 @@ vk_common_CreateRenderPass2(VkDevice _device,
VK_IMAGE_LAYOUT_ATTACHMENT_FEEDBACK_LOOP_OPTIMAL_EXT;
subpass->depth_stencil_attachment->layout =
VK_IMAGE_LAYOUT_ATTACHMENT_FEEDBACK_LOOP_OPTIMAL_EXT;
subpass->pipeline_flags |=
VK_PIPELINE_CREATE_DEPTH_STENCIL_ATTACHMENT_FEEDBACK_LOOP_BIT_EXT;
has_depth_self_dep = true;
}
if (aspects & VK_IMAGE_ASPECT_STENCIL_BIT) {
@ -639,6 +646,8 @@ vk_common_CreateRenderPass2(VkDevice _device,
VK_IMAGE_LAYOUT_ATTACHMENT_FEEDBACK_LOOP_OPTIMAL_EXT;
subpass->depth_stencil_attachment->stencil_layout =
VK_IMAGE_LAYOUT_ATTACHMENT_FEEDBACK_LOOP_OPTIMAL_EXT;
subpass->pipeline_flags |=
VK_PIPELINE_CREATE_DEPTH_STENCIL_ATTACHMENT_FEEDBACK_LOOP_BIT_EXT;
has_stencil_self_dep = true;
}
}
@ -830,6 +839,22 @@ vk_get_pipeline_rendering_create_info(const VkGraphicsPipelineCreateInfo *info)
return vk_find_struct_const(info->pNext, PIPELINE_RENDERING_CREATE_INFO);
}
VkPipelineCreateFlags
vk_get_pipeline_rendering_flags(const VkGraphicsPipelineCreateInfo *info)
{
VkPipelineCreateFlags rendering_flags = info->flags &
(VK_PIPELINE_CREATE_COLOR_ATTACHMENT_FEEDBACK_LOOP_BIT_EXT |
VK_PIPELINE_CREATE_DEPTH_STENCIL_ATTACHMENT_FEEDBACK_LOOP_BIT_EXT |
VK_PIPELINE_CREATE_RENDERING_FRAGMENT_SHADING_RATE_ATTACHMENT_BIT_KHR |
VK_PIPELINE_CREATE_RENDERING_FRAGMENT_DENSITY_MAP_ATTACHMENT_BIT_EXT);
VK_FROM_HANDLE(vk_render_pass, render_pass, info->renderPass);
if (render_pass != NULL)
rendering_flags |= render_pass->subpasses[info->subpass].pipeline_flags;
return rendering_flags;
}
const VkAttachmentSampleCountInfoAMD *
vk_get_pipeline_sample_count_info_amd(const VkGraphicsPipelineCreateInfo *info)
{

View file

@ -173,6 +173,9 @@ struct vk_subpass {
/** VkFragmentShadingRateAttachmentInfoKHR::shadingRateAttachmentTexelSize */
VkExtent2D fragment_shading_rate_attachment_texel_size;
/** Extra VkPipelineCreateFlags for this subpass */
VkPipelineCreateFlagBits pipeline_flags;
/** VkRenderingSelfDependencyInfoMESA for this subpass
*
* This is in the pNext chain of pipeline_info and inheritance_info.
@ -329,6 +332,24 @@ VK_DEFINE_NONDISP_HANDLE_CASTS(vk_render_pass, base, VkRenderPass,
const VkPipelineRenderingCreateInfo *
vk_get_pipeline_rendering_create_info(const VkGraphicsPipelineCreateInfo *info);
/** Returns any extra VkPipelineCreateFlags from the render pass
*
* For render-pass-free drivers, this can be used to get any extra pipeline
* create flags implied by the render pass. In particular, a render pass may
* want to add one or both of the following:
*
* - VK_PIPELINE_CREATE_COLOR_ATTACHMENT_FEEDBACK_LOOP_BIT_EXT
* - VK_PIPELINE_CREATE_DEPTH_STENCIL_ATTACHMENT_FEEDBACK_LOOP_BIT_EXT
* - VK_PIPELINE_CREATE_RENDERING_FRAGMENT_SHADING_RATE_ATTACHMENT_BIT_KHR
*
* If VkGraphicsPipelineCreateInfo::renderPass is VK_NULL_HANDLE, the relevant
* flags from VkGraphicsPipelineCreateInfo::flags will be returned.
*
* @param[in] info One of the pCreateInfos from vkCreateGraphicsPipelines
*/
VkPipelineCreateFlags
vk_get_pipeline_rendering_flags(const VkGraphicsPipelineCreateInfo *info);
/** Returns the VkAttachmentSampleCountInfoAMD for a graphics pipeline
*
* For render-pass-free drivers, this can be used in the implementaiton of