aboutsummaryrefslogtreecommitdiffstats
path: root/src/freedreno
diff options
context:
space:
mode:
authorJonathan Marek <[email protected]>2020-06-12 21:19:20 -0400
committerMarge Bot <[email protected]>2020-06-24 22:12:33 +0000
commit70046145d19454ad74d98e719ee5aba8c8df86ae (patch)
tree6f2a0e6a1251249c41f250cb5811f066975e939b /src/freedreno
parent01e2893cba4dd0f3ef98020ef0707510ce2cfde8 (diff)
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 <[email protected]> Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/5451>
Diffstat (limited to 'src/freedreno')
-rw-r--r--src/freedreno/vulkan/tu_pass.c238
1 files 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