[Mesa-dev] [PATCH 12/18] anv/pass: Precompute some subpass usage information
Pohjolainen, Topi
topi.pohjolainen at gmail.com
Thu Nov 3 14:55:53 UTC 2016
On Fri, Oct 28, 2016 at 02:17:08AM -0700, Jason Ekstrand wrote:
> Signed-off-by: Jason Ekstrand <jason at jlekstrand.net>
> ---
> src/intel/vulkan/anv_pass.c | 39 ++++++++++++++++++++++++++++++++-------
> src/intel/vulkan/anv_private.h | 11 +++++++++++
> 2 files changed, 43 insertions(+), 7 deletions(-)
>
> diff --git a/src/intel/vulkan/anv_pass.c b/src/intel/vulkan/anv_pass.c
> index 6eaa5c8..8d7a43b 100644
> --- a/src/intel/vulkan/anv_pass.c
> +++ b/src/intel/vulkan/anv_pass.c
> @@ -54,6 +54,17 @@ VkResult anv_CreateRenderPass(
> pass->subpass_count = pCreateInfo->subpassCount;
> pass->attachments = (void *) pass + attachments_offset;
>
> + pass->subpass_usages =
> + vk_zalloc2(&device->alloc, pAllocator,
> + pass->subpass_count * pass->attachment_count *
> + sizeof(*pass->subpass_usages),
> + 8, VK_SYSTEM_ALLOCATION_SCOPE_OBJECT);
Align by 8 is because ?
> + if (pass->subpass_usages == NULL) {
> + vk_free2(&device->alloc, pAllocator, pass);
> + return vk_error(VK_ERROR_OUT_OF_HOST_MEMORY);
> + }
> +
> + enum anv_subpass_usage *usages = pass->subpass_usages;
> for (uint32_t i = 0; i < pCreateInfo->attachmentCount; i++) {
> struct anv_render_pass_attachment *att = &pass->attachments[i];
>
> @@ -62,6 +73,8 @@ VkResult anv_CreateRenderPass(
> att->load_op = pCreateInfo->pAttachments[i].loadOp;
> att->store_op = pCreateInfo->pAttachments[i].storeOp;
> att->stencil_load_op = pCreateInfo->pAttachments[i].stencilLoadOp;
> + att->subpass_usage = usages;
> + usages += pass->subpass_count;
> }
>
> uint32_t subpass_attachment_count = 0, *p;
> @@ -80,6 +93,7 @@ VkResult anv_CreateRenderPass(
> subpass_attachment_count * sizeof(uint32_t), 8,
> VK_SYSTEM_ALLOCATION_SCOPE_OBJECT);
> if (pass->subpass_attachments == NULL) {
> + vk_free2(&device->alloc, pAllocator, pass->subpass_usages);
> vk_free2(&device->alloc, pAllocator, pass);
> return vk_error(VK_ERROR_OUT_OF_HOST_MEMORY);
> }
> @@ -97,8 +111,9 @@ VkResult anv_CreateRenderPass(
> p += desc->inputAttachmentCount;
>
> for (uint32_t j = 0; j < desc->inputAttachmentCount; j++) {
> - subpass->input_attachments[j]
> - = desc->pInputAttachments[j].attachment;
> + uint32_t a = desc->pInputAttachments[j].attachment;
> + subpass->input_attachments[j] = a;
Introduction of the helper variable "a" looks separate change.
> + pass->attachments[a].subpass_usage[i] |= ANV_SUBPASS_USAGE_INPUT;
> }
> }
>
> @@ -107,8 +122,9 @@ VkResult anv_CreateRenderPass(
> p += desc->colorAttachmentCount;
>
> for (uint32_t j = 0; j < desc->colorAttachmentCount; j++) {
> - subpass->color_attachments[j]
> - = desc->pColorAttachments[j].attachment;
> + uint32_t a = desc->pColorAttachments[j].attachment;
> + subpass->color_attachments[j] = a;
Same here.
> + pass->attachments[a].subpass_usage[i] |= ANV_SUBPASS_USAGE_DRAW;
> }
> }
>
> @@ -120,14 +136,22 @@ VkResult anv_CreateRenderPass(
> for (uint32_t j = 0; j < desc->colorAttachmentCount; j++) {
> uint32_t a = desc->pResolveAttachments[j].attachment;
> subpass->resolve_attachments[j] = a;
> - if (a != VK_ATTACHMENT_UNUSED)
> + if (a != VK_ATTACHMENT_UNUSED) {
> subpass->has_resolve = true;
> + uint32_t color_att = desc->pColorAttachments[j].attachment;
> + pass->attachments[color_att].subpass_usage[i] |=
> + ANV_SUBPASS_USAGE_RESOLVE_SRC;
> + pass->attachments[a].subpass_usage[i] |=
> + ANV_SUBPASS_USAGE_RESOLVE_DST;
> + }
> }
> }
>
> if (desc->pDepthStencilAttachment) {
> - subpass->depth_stencil_attachment =
> - desc->pDepthStencilAttachment->attachment;
> + uint32_t a = desc->pDepthStencilAttachment->attachment;
> + subpass->depth_stencil_attachment = a;
> + if (a != VK_ATTACHMENT_UNUSED)
Here the added helper is needed. (It could be declared as const).
> + pass->attachments[a].subpass_usage[i] |= ANV_SUBPASS_USAGE_DRAW;
> } else {
> subpass->depth_stencil_attachment = VK_ATTACHMENT_UNUSED;
> }
> @@ -147,6 +171,7 @@ void anv_DestroyRenderPass(
> ANV_FROM_HANDLE(anv_render_pass, pass, _pass);
>
> vk_free2(&device->alloc, pAllocator, pass->subpass_attachments);
> + vk_free2(&device->alloc, pAllocator, pass->subpass_usages);
> vk_free2(&device->alloc, pAllocator, pass);
> }
>
> diff --git a/src/intel/vulkan/anv_private.h b/src/intel/vulkan/anv_private.h
> index f05bf91..531f2d1 100644
> --- a/src/intel/vulkan/anv_private.h
> +++ b/src/intel/vulkan/anv_private.h
> @@ -1686,18 +1686,29 @@ struct anv_subpass {
> bool has_resolve;
> };
>
> +enum anv_subpass_usage {
> + ANV_SUBPASS_USAGE_DRAW = (1 << 0),
> + ANV_SUBPASS_USAGE_INPUT = (1 << 1),
> + ANV_SUBPASS_USAGE_RESOLVE_SRC = (1 << 2),
> + ANV_SUBPASS_USAGE_RESOLVE_DST = (1 << 3),
> +};
> +
> struct anv_render_pass_attachment {
> VkFormat format;
> uint32_t samples;
> VkAttachmentLoadOp load_op;
> VkAttachmentStoreOp store_op;
> VkAttachmentLoadOp stencil_load_op;
> +
> + /* An array, indexed by subpass id, of how the attachment will be used. */
> + enum anv_subpass_usage * subpass_usage;
> };
>
> struct anv_render_pass {
> uint32_t attachment_count;
> uint32_t subpass_count;
> uint32_t * subpass_attachments;
> + enum anv_subpass_usage * subpass_usages;
> struct anv_render_pass_attachment * attachments;
> struct anv_subpass subpasses[0];
> };
> --
> 2.5.0.400.gff86faf
>
> _______________________________________________
> mesa-dev mailing list
> mesa-dev at lists.freedesktop.org
> https://lists.freedesktop.org/mailman/listinfo/mesa-dev
More information about the mesa-dev
mailing list