diff --git a/src/amd/vulkan/radv_pass.c b/src/amd/vulkan/radv_pass.c index 117bb3569be..30c1b3fa658 100644 --- a/src/amd/vulkan/radv_pass.c +++ b/src/amd/vulkan/radv_pass.c @@ -214,6 +214,9 @@ radv_render_pass_compile(struct radv_render_pass *pass) subpass->ds_resolve_attachment->attachment == VK_ATTACHMENT_UNUSED) subpass->ds_resolve_attachment = NULL; + if (subpass->vrs_attachment && subpass->vrs_attachment->attachment == VK_ATTACHMENT_UNUSED) + subpass->vrs_attachment = NULL; + for (uint32_t j = 0; j < subpass->attachment_count; j++) { struct radv_subpass_attachment *subpass_att = &subpass->attachments[j]; if (subpass_att->attachment == VK_ATTACHMENT_UNUSED) @@ -297,11 +300,14 @@ radv_num_subpass_attachments2(const VkSubpassDescription2 *desc) { const VkSubpassDescriptionDepthStencilResolve *ds_resolve = vk_find_struct_const(desc->pNext, SUBPASS_DESCRIPTION_DEPTH_STENCIL_RESOLVE); + const VkFragmentShadingRateAttachmentInfoKHR *vrs = + vk_find_struct_const(desc->pNext, FRAGMENT_SHADING_RATE_ATTACHMENT_INFO_KHR); return desc->inputAttachmentCount + desc->colorAttachmentCount + (desc->pResolveAttachments ? desc->colorAttachmentCount : 0) + (desc->pDepthStencilAttachment != NULL) + - (ds_resolve && ds_resolve->pDepthStencilResolveAttachment); + (ds_resolve && ds_resolve->pDepthStencilResolveAttachment) + + (vrs && vrs->pFragmentShadingRateAttachment); } static bool @@ -497,6 +503,18 @@ radv_CreateRenderPass2(VkDevice _device, const VkRenderPassCreateInfo2 *pCreateI subpass->depth_resolve_mode = ds_resolve->depthResolveMode; subpass->stencil_resolve_mode = ds_resolve->stencilResolveMode; } + + const VkFragmentShadingRateAttachmentInfoKHR *vrs = + vk_find_struct_const(desc->pNext, FRAGMENT_SHADING_RATE_ATTACHMENT_INFO_KHR); + + if (vrs && vrs->pFragmentShadingRateAttachment) { + subpass->vrs_attachment = p++; + + *subpass->vrs_attachment = (struct radv_subpass_attachment){ + .attachment = vrs->pFragmentShadingRateAttachment->attachment, + .layout = vrs->pFragmentShadingRateAttachment->layout, + }; + } } for (unsigned i = 0; i < pCreateInfo->dependencyCount; ++i) { diff --git a/src/amd/vulkan/radv_private.h b/src/amd/vulkan/radv_private.h index b013ccb9b72..5f176914fc3 100644 --- a/src/amd/vulkan/radv_private.h +++ b/src/amd/vulkan/radv_private.h @@ -2283,6 +2283,7 @@ struct radv_subpass { struct radv_subpass_attachment *resolve_attachments; struct radv_subpass_attachment *depth_stencil_attachment; struct radv_subpass_attachment *ds_resolve_attachment; + struct radv_subpass_attachment *vrs_attachment; VkResolveModeFlagBits depth_resolve_mode; VkResolveModeFlagBits stencil_resolve_mode;