From: Jason Ekstrand Date: Tue, 2 Aug 2022 18:13:54 +0000 (-0500) Subject: vulkan: Record pipeline flags in the render pass X-Git-Tag: upstream/23.3.3~10583 X-Git-Url: http://review.tizen.org/git/?a=commitdiff_plain;h=bd26ae00862fd8a528ae1bc4db5d23c6c7855463;p=platform%2Fupstream%2Fmesa.git 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 Reviewed-by: Connor Abbott Part-of: --- diff --git a/src/vulkan/runtime/vk_render_pass.c b/src/vulkan/runtime/vk_render_pass.c index 848936e..c7d2a90 100644 --- a/src/vulkan/runtime/vk_render_pass.c +++ b/src/vulkan/runtime/vk_render_pass.c @@ -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) { diff --git a/src/vulkan/runtime/vk_render_pass.h b/src/vulkan/runtime/vk_render_pass.h index 36e5d02..fe4453f 100644 --- a/src/vulkan/runtime/vk_render_pass.h +++ b/src/vulkan/runtime/vk_render_pass.h @@ -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