Module: Mesa Branch: master Commit: 5de355b0f9c41c42fb3a094a2a8a034fe4f60c1f URL: http://cgit.freedesktop.org/mesa/mesa/commit/?id=5de355b0f9c41c42fb3a094a2a8a034fe4f60c1f
Author: Jason Ekstrand <[email protected]> Date: Thu Feb 4 01:13:33 2021 -0600 vulkan: Use correct aspectMask in CreateRenderPass If a VkRenderPassInputAttachmentAspectCreateInfo is provided, we use the aspects specified there. Otherwise, we default to every aspect in the format. For attachments which are not input attachments, aspectMask is left zero. Reviewed-by: Eric Anholt <[email protected]> Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/8857> --- src/vulkan/util/vk_render_pass.c | 66 ++++++++++++++++++++++++++++++++-------- 1 file changed, 54 insertions(+), 12 deletions(-) diff --git a/src/vulkan/util/vk_render_pass.c b/src/vulkan/util/vk_render_pass.c index 9588a41568f..0fc340a71c0 100644 --- a/src/vulkan/util/vk_render_pass.c +++ b/src/vulkan/util/vk_render_pass.c @@ -24,23 +24,35 @@ #include "vk_alloc.h" #include "vk_common_entrypoints.h" #include "vk_device.h" +#include "vk_format.h" #include "vk_util.h" +#include "util/log.h" + static void translate_references(VkAttachmentReference2 **reference_ptr, + uint32_t reference_count, const VkAttachmentReference *reference, - uint32_t count) + const VkRenderPassCreateInfo *pass_info, + bool is_input_attachment) { VkAttachmentReference2 *reference2 = *reference_ptr; - *reference_ptr += count; - for (uint32_t i = 0; i < count; i++) { + *reference_ptr += reference_count; + for (uint32_t i = 0; i < reference_count; i++) { reference2[i] = (VkAttachmentReference2) { .sType = VK_STRUCTURE_TYPE_ATTACHMENT_REFERENCE_2, .pNext = NULL, .attachment = reference[i].attachment, .layout = reference[i].layout, - .aspectMask = VK_IMAGE_ASPECT_COLOR_BIT | VK_IMAGE_ASPECT_DEPTH_BIT | VK_IMAGE_ASPECT_STENCIL_BIT, }; + + if (is_input_attachment && + reference2[i].attachment != VK_ATTACHMENT_UNUSED) { + assert(reference2[i].attachment < pass_info->attachmentCount); + const VkAttachmentDescription *att = + &pass_info->pAttachments[reference2[i].attachment]; + reference2[i].aspectMask = vk_format_aspects(att->format); + } } } @@ -80,10 +92,21 @@ vk_common_CreateRenderPass(VkDevice _device, VkAttachmentReference2 *reference_ptr = references; - VkRenderPassMultiviewCreateInfo *multiview_info = NULL; + const VkRenderPassMultiviewCreateInfo *multiview_info = NULL; + const VkRenderPassInputAttachmentAspectCreateInfo *aspect_info = NULL; vk_foreach_struct(ext, pCreateInfo->pNext) { - if (ext->sType == VK_STRUCTURE_TYPE_RENDER_PASS_MULTIVIEW_CREATE_INFO) { - multiview_info = (VkRenderPassMultiviewCreateInfo*) ext; + switch (ext->sType) { + case VK_STRUCTURE_TYPE_RENDER_PASS_INPUT_ATTACHMENT_ASPECT_CREATE_INFO: + aspect_info = (const VkRenderPassInputAttachmentAspectCreateInfo *)ext; + /* We don't care about this information */ + break; + + case VK_STRUCTURE_TYPE_RENDER_PASS_MULTIVIEW_CREATE_INFO: + multiview_info = (const VkRenderPassMultiviewCreateInfo*) ext; + break; + + default: + mesa_logd("%s: ignored VkStructureType %u\n", __func__, ext->sType); break; } } @@ -120,30 +143,49 @@ vk_common_CreateRenderPass(VkDevice _device, subpasses[i].pInputAttachments = reference_ptr; translate_references(&reference_ptr, + subpasses[i].inputAttachmentCount, pCreateInfo->pSubpasses[i].pInputAttachments, - subpasses[i].inputAttachmentCount); + pCreateInfo, true); subpasses[i].pColorAttachments = reference_ptr; translate_references(&reference_ptr, + subpasses[i].colorAttachmentCount, pCreateInfo->pSubpasses[i].pColorAttachments, - subpasses[i].colorAttachmentCount); + pCreateInfo, false); subpasses[i].pResolveAttachments = NULL; if (pCreateInfo->pSubpasses[i].pResolveAttachments) { subpasses[i].pResolveAttachments = reference_ptr; translate_references(&reference_ptr, + subpasses[i].colorAttachmentCount, pCreateInfo->pSubpasses[i].pResolveAttachments, - subpasses[i].colorAttachmentCount); + pCreateInfo, false); } subpasses[i].pDepthStencilAttachment = NULL; if (pCreateInfo->pSubpasses[i].pDepthStencilAttachment) { subpasses[i].pDepthStencilAttachment = reference_ptr; - translate_references(&reference_ptr, + translate_references(&reference_ptr, 1, pCreateInfo->pSubpasses[i].pDepthStencilAttachment, - 1); + pCreateInfo, false); } } assert(reference_ptr == references + reference_count); + if (aspect_info != NULL) { + for (uint32_t i = 0; i < aspect_info->aspectReferenceCount; i++) { + const VkInputAttachmentAspectReference *ref = + &aspect_info->pAspectReferences[i]; + + assert(ref->subpass < pCreateInfo->subpassCount); + VkSubpassDescription2 *subpass = &subpasses[ref->subpass]; + + assert(ref->inputAttachmentIndex < subpass->inputAttachmentCount); + VkAttachmentReference2 *att = (VkAttachmentReference2 *) + &subpass->pInputAttachments[ref->inputAttachmentIndex]; + + att->aspectMask = ref->aspectMask; + } + } + for (uint32_t i = 0; i < pCreateInfo->dependencyCount; i++) { dependencies[i] = (VkSubpassDependency2) { .sType = VK_STRUCTURE_TYPE_SUBPASS_DEPENDENCY_2, _______________________________________________ mesa-commit mailing list [email protected] https://lists.freedesktop.org/mailman/listinfo/mesa-commit
