From e52ad9f845ac67b29c55eafb31b14eafa21bbb38 Mon Sep 17 00:00:00 2001 From: Samuel Pitoiset Date: Mon, 20 May 2019 11:47:02 +0200 Subject: [PATCH] radv: record if a render pass has depth/stencil resolve attachments Only supported with vkCreateRenderPass2(). Signed-off-by: Samuel Pitoiset Reviewed-by: Bas Nieuwenhuizen --- src/amd/vulkan/radv_pass.c | 27 ++++++++++++++++++++++++++- src/amd/vulkan/radv_private.h | 3 +++ 2 files changed, 29 insertions(+), 1 deletion(-) diff --git a/src/amd/vulkan/radv_pass.c b/src/amd/vulkan/radv_pass.c index 728b6113206..688a17919bd 100644 --- a/src/amd/vulkan/radv_pass.c +++ b/src/amd/vulkan/radv_pass.c @@ -91,6 +91,10 @@ radv_render_pass_compile(struct radv_render_pass *pass) subpass->depth_stencil_attachment->attachment == VK_ATTACHMENT_UNUSED) subpass->depth_stencil_attachment = NULL; + if (subpass->ds_resolve_attachment && + subpass->ds_resolve_attachment->attachment == VK_ATTACHMENT_UNUSED) + subpass->ds_resolve_attachment = NULL; + for (uint32_t j = 0; j < subpass->attachment_count; j++) { struct radv_subpass_attachment *subpass_att = &subpass->attachments[j]; @@ -309,10 +313,15 @@ VkResult radv_CreateRenderPass( static unsigned radv_num_subpass_attachments2(const VkSubpassDescription2KHR *desc) { + const VkSubpassDescriptionDepthStencilResolveKHR *ds_resolve = + vk_find_struct_const(desc->pNext, + SUBPASS_DESCRIPTION_DEPTH_STENCIL_RESOLVE_KHR); + return desc->inputAttachmentCount + desc->colorAttachmentCount + (desc->pResolveAttachments ? desc->colorAttachmentCount : 0) + - (desc->pDepthStencilAttachment != NULL); + (desc->pDepthStencilAttachment != NULL) + + (ds_resolve && ds_resolve->pDepthStencilResolveAttachment); } VkResult radv_CreateRenderPass2KHR( @@ -429,6 +438,22 @@ VkResult radv_CreateRenderPass2KHR( .layout = desc->pDepthStencilAttachment->layout, }; } + + const VkSubpassDescriptionDepthStencilResolveKHR *ds_resolve = + vk_find_struct_const(desc->pNext, + SUBPASS_DESCRIPTION_DEPTH_STENCIL_RESOLVE_KHR); + + if (ds_resolve && ds_resolve->pDepthStencilResolveAttachment) { + subpass->ds_resolve_attachment = p++; + + *subpass->ds_resolve_attachment = (struct radv_subpass_attachment) { + .attachment = ds_resolve->pDepthStencilResolveAttachment->attachment, + .layout = ds_resolve->pDepthStencilResolveAttachment->layout, + }; + + subpass->depth_resolve_mode = ds_resolve->depthResolveMode; + subpass->stencil_resolve_mode = ds_resolve->stencilResolveMode; + } } 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 6cebc738d49..1b7191c1b99 100644 --- a/src/amd/vulkan/radv_private.h +++ b/src/amd/vulkan/radv_private.h @@ -1953,6 +1953,9 @@ struct radv_subpass { struct radv_subpass_attachment * color_attachments; struct radv_subpass_attachment * resolve_attachments; struct radv_subpass_attachment * depth_stencil_attachment; + struct radv_subpass_attachment * ds_resolve_attachment; + VkResolveModeFlagBitsKHR depth_resolve_mode; + VkResolveModeFlagBitsKHR stencil_resolve_mode; /** Subpass has at least one color resolve attachment */ bool has_color_resolve; -- 2.30.2