From a4136b8c1a4533925af616d4920054c9734a265b Mon Sep 17 00:00:00 2001 From: Jason Ekstrand Date: Sat, 13 Jan 2018 10:45:55 -0800 Subject: [PATCH] anv/pass: Store usage in each subpass attachment This requires us to ditch the VkAttachmentReference struct in favor of an anv-specific struct. However, we can now easily identify from just the subpass attachment what kind of an attachment it is. This will make iteration over anv_subpass::attachments a little easier in some case. Reviewed-by: Nanley Chery --- src/intel/vulkan/anv_pass.c | 35 +++++++++++++++++++++++------- src/intel/vulkan/anv_private.h | 16 +++++++++----- src/intel/vulkan/genX_cmd_buffer.c | 2 +- 3 files changed, 39 insertions(+), 14 deletions(-) diff --git a/src/intel/vulkan/anv_pass.c b/src/intel/vulkan/anv_pass.c index a77e52b0c00..5b8b138ed94 100644 --- a/src/intel/vulkan/anv_pass.c +++ b/src/intel/vulkan/anv_pass.c @@ -65,7 +65,7 @@ VkResult anv_CreateRenderPass( anv_multialloc_add(&ma, &attachments, pCreateInfo->attachmentCount); anv_multialloc_add(&ma, &subpass_flushes, pCreateInfo->subpassCount + 1); - VkAttachmentReference *subpass_attachments; + struct anv_subpass_attachment *subpass_attachments; uint32_t subpass_attachment_count = 0; for (uint32_t i = 0; i < pCreateInfo->subpassCount; i++) { subpass_attachment_count += @@ -117,7 +117,11 @@ VkResult anv_CreateRenderPass( for (uint32_t j = 0; j < desc->inputAttachmentCount; j++) { uint32_t a = desc->pInputAttachments[j].attachment; - subpass->input_attachments[j] = desc->pInputAttachments[j]; + subpass->input_attachments[j] = (struct anv_subpass_attachment) { + .usage = VK_IMAGE_USAGE_INPUT_ATTACHMENT_BIT, + .attachment = desc->pInputAttachments[j].attachment, + .layout = desc->pInputAttachments[j].layout, + }; if (a != VK_ATTACHMENT_UNUSED) { has_input = true; pass->attachments[a].usage |= VK_IMAGE_USAGE_INPUT_ATTACHMENT_BIT; @@ -138,7 +142,11 @@ VkResult anv_CreateRenderPass( for (uint32_t j = 0; j < desc->colorAttachmentCount; j++) { uint32_t a = desc->pColorAttachments[j].attachment; - subpass->color_attachments[j] = desc->pColorAttachments[j]; + subpass->color_attachments[j] = (struct anv_subpass_attachment) { + .usage = VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT, + .attachment = desc->pColorAttachments[j].attachment, + .layout = desc->pColorAttachments[j].layout, + }; if (a != VK_ATTACHMENT_UNUSED) { has_color = true; pass->attachments[a].usage |= VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT; @@ -157,7 +165,11 @@ VkResult anv_CreateRenderPass( for (uint32_t j = 0; j < desc->colorAttachmentCount; j++) { uint32_t a = desc->pResolveAttachments[j].attachment; - subpass->resolve_attachments[j] = desc->pResolveAttachments[j]; + subpass->resolve_attachments[j] = (struct anv_subpass_attachment) { + .usage = VK_IMAGE_USAGE_TRANSFER_DST_BIT, + .attachment = desc->pResolveAttachments[j].attachment, + .layout = desc->pResolveAttachments[j].layout, + }; if (a != VK_ATTACHMENT_UNUSED) { subpass->has_resolve = true; uint32_t color_att = desc->pColorAttachments[j].attachment; @@ -174,8 +186,12 @@ VkResult anv_CreateRenderPass( if (desc->pDepthStencilAttachment) { uint32_t a = desc->pDepthStencilAttachment->attachment; - *subpass_attachments++ = subpass->depth_stencil_attachment = - *desc->pDepthStencilAttachment; + subpass->depth_stencil_attachment = (struct anv_subpass_attachment) { + .usage = VK_IMAGE_USAGE_DEPTH_STENCIL_ATTACHMENT_BIT, + .attachment = desc->pDepthStencilAttachment->attachment, + .layout = desc->pDepthStencilAttachment->layout, + }; + *subpass_attachments++ = subpass->depth_stencil_attachment; if (a != VK_ATTACHMENT_UNUSED) { has_depth = true; pass->attachments[a].usage |= @@ -186,8 +202,11 @@ VkResult anv_CreateRenderPass( *desc->pDepthStencilAttachment); } } else { - subpass->depth_stencil_attachment.attachment = VK_ATTACHMENT_UNUSED; - subpass->depth_stencil_attachment.layout = VK_IMAGE_LAYOUT_UNDEFINED; + subpass->depth_stencil_attachment = (struct anv_subpass_attachment) { + .usage = VK_IMAGE_USAGE_DEPTH_STENCIL_ATTACHMENT_BIT, + .attachment = VK_ATTACHMENT_UNUSED, + .layout = VK_IMAGE_LAYOUT_UNDEFINED, + }; } } diff --git a/src/intel/vulkan/anv_private.h b/src/intel/vulkan/anv_private.h index 020f293f0f0..37e63f56aa0 100644 --- a/src/intel/vulkan/anv_private.h +++ b/src/intel/vulkan/anv_private.h @@ -2876,6 +2876,12 @@ struct anv_framebuffer { struct anv_image_view * attachments[0]; }; +struct anv_subpass_attachment { + VkImageUsageFlagBits usage; + uint32_t attachment; + VkImageLayout layout; +}; + struct anv_subpass { uint32_t attachment_count; @@ -2883,14 +2889,14 @@ struct anv_subpass { * A pointer to all attachment references used in this subpass. * Only valid if ::attachment_count > 0. */ - VkAttachmentReference * attachments; + struct anv_subpass_attachment * attachments; uint32_t input_count; - VkAttachmentReference * input_attachments; + struct anv_subpass_attachment * input_attachments; uint32_t color_count; - VkAttachmentReference * color_attachments; - VkAttachmentReference * resolve_attachments; + struct anv_subpass_attachment * color_attachments; + struct anv_subpass_attachment * resolve_attachments; - VkAttachmentReference depth_stencil_attachment; + struct anv_subpass_attachment depth_stencil_attachment; uint32_t view_mask; diff --git a/src/intel/vulkan/genX_cmd_buffer.c b/src/intel/vulkan/genX_cmd_buffer.c index db93210d2aa..5f770dd4f3d 100644 --- a/src/intel/vulkan/genX_cmd_buffer.c +++ b/src/intel/vulkan/genX_cmd_buffer.c @@ -3339,7 +3339,7 @@ cmd_buffer_subpass_transition_layouts(struct anv_cmd_buffer * const cmd_buffer, assert(subpass->attachments); /* Iterate over the array of attachment references. */ - for (const VkAttachmentReference *att_ref = subpass->attachments; + for (const struct anv_subpass_attachment *att_ref = subpass->attachments; att_ref < subpass->attachments + subpass->attachment_count; att_ref++) { /* If the attachment is unused, we can't perform a layout transition. */