From 70046145d19454ad74d98e719ee5aba8c8df86ae Mon Sep 17 00:00:00 2001 From: Jonathan Marek Date: Fri, 12 Jun 2020 21:19:20 -0400 Subject: [PATCH] turnip: translate CreateRenderPass to CreateRenderPass2 It doesn't cut down the code size by much, and might not be the ideal for performance (unless the compiler is unexpectedly smart), but makes it easier to maintain (no modifying the same code in two places) and will allow some simplifications since we wont have to worry about trying to share code between the two versions. Signed-off-by: Jonathan Marek Part-of: --- src/freedreno/vulkan/tu_pass.c | 238 +++++++++++++++------------------ 1 file changed, 106 insertions(+), 132 deletions(-) diff --git a/src/freedreno/vulkan/tu_pass.c b/src/freedreno/vulkan/tu_pass.c index beb2cf0c59e..371e561cb86 100644 --- a/src/freedreno/vulkan/tu_pass.c +++ b/src/freedreno/vulkan/tu_pass.c @@ -417,156 +417,130 @@ attachment_set_ops(struct tu_render_pass_attachment *att, } } +static void +translate_references(VkAttachmentReference2 **reference_ptr, + const VkAttachmentReference *reference, + uint32_t count) +{ + VkAttachmentReference2 *reference2 = *reference_ptr; + *reference_ptr += count; + for (uint32_t i = 0; i < 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, + }; + } +} + VkResult -tu_CreateRenderPass(VkDevice _device, +tu_CreateRenderPass(VkDevice device, const VkRenderPassCreateInfo *pCreateInfo, const VkAllocationCallbacks *pAllocator, VkRenderPass *pRenderPass) { - TU_FROM_HANDLE(tu_device, device, _device); - struct tu_render_pass *pass; - size_t size; - size_t attachments_offset; - - assert(pCreateInfo->sType == VK_STRUCTURE_TYPE_RENDER_PASS_CREATE_INFO); - - size = sizeof(*pass); - size += pCreateInfo->subpassCount * sizeof(pass->subpasses[0]); - attachments_offset = size; - size += pCreateInfo->attachmentCount * sizeof(pass->attachments[0]); - - pass = vk_alloc2(&device->alloc, pAllocator, size, 8, - VK_SYSTEM_ALLOCATION_SCOPE_OBJECT); - if (pass == NULL) - return vk_error(device->instance, VK_ERROR_OUT_OF_HOST_MEMORY); - - memset(pass, 0, size); - pass->attachment_count = pCreateInfo->attachmentCount; - pass->subpass_count = pCreateInfo->subpassCount; - pass->attachments = (void *) pass + attachments_offset; + /* note: these counts shouldn't be excessively high, so allocating it all + * on the stack should be OK.. + * also note preserve attachments aren't translated, currently unused + */ + VkAttachmentDescription2 attachments[pCreateInfo->attachmentCount]; + VkSubpassDescription2 subpasses[pCreateInfo->subpassCount]; + VkSubpassDependency2 dependencies[pCreateInfo->dependencyCount]; + uint32_t reference_count = 0; + for (uint32_t i = 0; i < pCreateInfo->subpassCount; i++) { + reference_count += pCreateInfo->pSubpasses[i].inputAttachmentCount; + reference_count += pCreateInfo->pSubpasses[i].colorAttachmentCount; + if (pCreateInfo->pSubpasses[i].pResolveAttachments) + reference_count += pCreateInfo->pSubpasses[i].colorAttachmentCount; + if (pCreateInfo->pSubpasses[i].pDepthStencilAttachment) + reference_count += 1; + } + VkAttachmentReference2 reference[reference_count]; + VkAttachmentReference2 *reference_ptr = reference; for (uint32_t i = 0; i < pCreateInfo->attachmentCount; i++) { - struct tu_render_pass_attachment *att = &pass->attachments[i]; - - att->format = pCreateInfo->pAttachments[i].format; - att->samples = pCreateInfo->pAttachments[i].samples; - att->cpp = vk_format_get_blocksize(att->format) * att->samples; - att->initial_layout = pCreateInfo->pAttachments[i].initialLayout; - att->final_layout = pCreateInfo->pAttachments[i].finalLayout; - att->gmem_offset = -1; - - attachment_set_ops(att, - pCreateInfo->pAttachments[i].loadOp, - pCreateInfo->pAttachments[i].stencilLoadOp, - pCreateInfo->pAttachments[i].storeOp, - pCreateInfo->pAttachments[i].stencilStoreOp); + attachments[i] = (VkAttachmentDescription2) { + .sType = VK_STRUCTURE_TYPE_ATTACHMENT_DESCRIPTION_2, + .pNext = NULL, + .flags = pCreateInfo->pAttachments[i].flags, + .format = pCreateInfo->pAttachments[i].format, + .samples = pCreateInfo->pAttachments[i].samples, + .loadOp = pCreateInfo->pAttachments[i].loadOp, + .storeOp = pCreateInfo->pAttachments[i].storeOp, + .stencilLoadOp = pCreateInfo->pAttachments[i].stencilLoadOp, + .stencilStoreOp = pCreateInfo->pAttachments[i].stencilStoreOp, + .initialLayout = pCreateInfo->pAttachments[i].initialLayout, + .finalLayout = pCreateInfo->pAttachments[i].finalLayout, + }; } - uint32_t subpass_attachment_count = 0; - struct tu_subpass_attachment *p; for (uint32_t i = 0; i < pCreateInfo->subpassCount; i++) { - const VkSubpassDescription *desc = &pCreateInfo->pSubpasses[i]; - - subpass_attachment_count += - desc->inputAttachmentCount + desc->colorAttachmentCount + - (desc->pResolveAttachments ? desc->colorAttachmentCount : 0); - } - - if (subpass_attachment_count) { - pass->subpass_attachments = vk_alloc2( - &device->alloc, pAllocator, - subpass_attachment_count * sizeof(struct tu_subpass_attachment), 8, - VK_SYSTEM_ALLOCATION_SCOPE_OBJECT); - if (pass->subpass_attachments == NULL) { - vk_free2(&device->alloc, pAllocator, pass); - return vk_error(device->instance, VK_ERROR_OUT_OF_HOST_MEMORY); - } - } else - pass->subpass_attachments = NULL; - - p = pass->subpass_attachments; - for (uint32_t i = 0; i < pCreateInfo->subpassCount; i++) { - const VkSubpassDescription *desc = &pCreateInfo->pSubpasses[i]; - struct tu_subpass *subpass = &pass->subpasses[i]; - - subpass->input_count = desc->inputAttachmentCount; - subpass->color_count = desc->colorAttachmentCount; - subpass->samples = 0; - - if (desc->inputAttachmentCount > 0) { - subpass->input_attachments = p; - p += desc->inputAttachmentCount; - - for (uint32_t j = 0; j < desc->inputAttachmentCount; j++) { - uint32_t a = desc->pInputAttachments[j].attachment; - subpass->input_attachments[j].attachment = a; - subpass->input_attachments[j].layout = - desc->pInputAttachments[j].layout; - if (a != VK_ATTACHMENT_UNUSED) - pass->attachments[a].gmem_offset = 0; - } - } - - if (desc->colorAttachmentCount > 0) { - subpass->color_attachments = p; - p += desc->colorAttachmentCount; - - for (uint32_t j = 0; j < desc->colorAttachmentCount; j++) { - uint32_t a = desc->pColorAttachments[j].attachment; - subpass->color_attachments[j].attachment = a; - subpass->color_attachments[j].layout = - desc->pColorAttachments[j].layout; - - if (a != VK_ATTACHMENT_UNUSED) { - pass->attachments[a].gmem_offset = 0; - update_samples(subpass, pCreateInfo->pAttachments[a].samples); - } - } - } + subpasses[i] = (VkSubpassDescription2) { + .sType = VK_STRUCTURE_TYPE_SUBPASS_DESCRIPTION_2, + .pNext = NULL, + .flags = pCreateInfo->pSubpasses[i].flags, + .pipelineBindPoint = pCreateInfo->pSubpasses[i].pipelineBindPoint, + .viewMask = 0, + .inputAttachmentCount = pCreateInfo->pSubpasses[i].inputAttachmentCount, + .colorAttachmentCount = pCreateInfo->pSubpasses[i].colorAttachmentCount, + }; - subpass->resolve_attachments = desc->pResolveAttachments ? p : NULL; - if (desc->pResolveAttachments) { - p += desc->colorAttachmentCount; - for (uint32_t j = 0; j < desc->colorAttachmentCount; j++) { - subpass->resolve_attachments[j].attachment = - desc->pResolveAttachments[j].attachment; - subpass->resolve_attachments[j].layout = - desc->pResolveAttachments[j].layout; - } + subpasses[i].pInputAttachments = reference_ptr; + translate_references(&reference_ptr, + pCreateInfo->pSubpasses[i].pInputAttachments, + subpasses[i].inputAttachmentCount); + subpasses[i].pColorAttachments = reference_ptr; + translate_references(&reference_ptr, + pCreateInfo->pSubpasses[i].pColorAttachments, + subpasses[i].colorAttachmentCount); + subpasses[i].pResolveAttachments = NULL; + if (pCreateInfo->pSubpasses[i].pResolveAttachments) { + subpasses[i].pResolveAttachments = reference_ptr; + translate_references(&reference_ptr, + pCreateInfo->pSubpasses[i].pResolveAttachments, + subpasses[i].colorAttachmentCount); } - - uint32_t a = desc->pDepthStencilAttachment ? - desc->pDepthStencilAttachment->attachment : VK_ATTACHMENT_UNUSED; - subpass->depth_stencil_attachment.attachment = a; - if (a != VK_ATTACHMENT_UNUSED) { - pass->attachments[a].gmem_offset = 0; - subpass->depth_stencil_attachment.layout = - desc->pDepthStencilAttachment->layout; - update_samples(subpass, pCreateInfo->pAttachments[a].samples); + subpasses[i].pDepthStencilAttachment = NULL; + if (pCreateInfo->pSubpasses[i].pDepthStencilAttachment) { + subpasses[i].pDepthStencilAttachment = reference_ptr; + translate_references(&reference_ptr, + pCreateInfo->pSubpasses[i].pDepthStencilAttachment, + 1); } - - subpass->samples = subpass->samples ?: 1; } - for (unsigned i = 0; i < pCreateInfo->dependencyCount; ++i) { - /* Convert to a Dependency2 */ - struct VkSubpassDependency2 dep2 = { - .srcSubpass = pCreateInfo->pDependencies[i].srcSubpass, - .dstSubpass = pCreateInfo->pDependencies[i].dstSubpass, - .srcStageMask = pCreateInfo->pDependencies[i].srcStageMask, - .dstStageMask = pCreateInfo->pDependencies[i].dstStageMask, - .srcAccessMask = pCreateInfo->pDependencies[i].srcAccessMask, - .dstAccessMask = pCreateInfo->pDependencies[i].dstAccessMask, - .dependencyFlags = pCreateInfo->pDependencies[i].dependencyFlags, + assert(reference_ptr == reference + reference_count); + + for (uint32_t i = 0; i < pCreateInfo->dependencyCount; i++) { + dependencies[i] = (VkSubpassDependency2) { + .sType = VK_STRUCTURE_TYPE_SUBPASS_DEPENDENCY_2, + .pNext = NULL, + .srcSubpass = pCreateInfo->pDependencies[i].srcSubpass, + .dstSubpass = pCreateInfo->pDependencies[i].dstSubpass, + .srcStageMask = pCreateInfo->pDependencies[i].srcStageMask, + .dstStageMask = pCreateInfo->pDependencies[i].dstStageMask, + .srcAccessMask = pCreateInfo->pDependencies[i].srcAccessMask, + .dstAccessMask = pCreateInfo->pDependencies[i].dstAccessMask, + .dependencyFlags = pCreateInfo->pDependencies[i].dependencyFlags, + .viewOffset = 0, }; - tu_render_pass_add_subpass_dep(pass, &dep2); } - *pRenderPass = tu_render_pass_to_handle(pass); - - create_render_pass_common(pass, device->physical_device); - - return VK_SUCCESS; + VkRenderPassCreateInfo2 create_info = { + .sType = VK_STRUCTURE_TYPE_RENDER_PASS_CREATE_INFO_2, + .pNext = pCreateInfo->pNext, + .flags = pCreateInfo->flags, + .attachmentCount = pCreateInfo->attachmentCount, + .pAttachments = attachments, + .subpassCount = pCreateInfo->subpassCount, + .pSubpasses = subpasses, + .dependencyCount = pCreateInfo->dependencyCount, + .pDependencies = dependencies, + }; + + return tu_CreateRenderPass2(device, &create_info, pAllocator, pRenderPass); } VkResult -- 2.30.2