vulkan: Record pipeline flags in the render pass
authorJason Ekstrand <jason.ekstrand@collabora.com>
Tue, 2 Aug 2022 18:13:54 +0000 (13:13 -0500)
committerMarge Bot <emma+marge@anholt.net>
Mon, 3 Apr 2023 18:13:01 +0000 (18:13 +0000)
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>

src/vulkan/runtime/vk_render_pass.c
src/vulkan/runtime/vk_render_pass.h

index 848936e..c7d2a90 100644 (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)
 {
index 36e5d02..fe4453f 100644 (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