[Mesa-dev] [PATCH 2/2] radv: add support for VK_KHR_create_renderpass2

Bas Nieuwenhuizen bas at basnieuwenhuizen.nl
Sun Jul 8 19:52:51 UTC 2018


Reviewed-by: Bas Nieuwenhuizen <bas at basnieuwenhuizen.nl>

for the series.

On Sun, Jul 8, 2018 at 5:47 PM, Samuel Pitoiset
<samuel.pitoiset at gmail.com> wrote:
> VkCreateRenderPass2KHR() is quite similar to VkCreateRenderPass()
> but refactoring the code is a bit painful.
>
> Signed-off-by: Samuel Pitoiset <samuel.pitoiset at gmail.com>
> ---
>  src/amd/vulkan/radv_cmd_buffer.c  |  24 +++++
>  src/amd/vulkan/radv_extensions.py |   1 +
>  src/amd/vulkan/radv_pass.c        | 169 ++++++++++++++++++++++++++++++
>  3 files changed, 194 insertions(+)
>
> diff --git a/src/amd/vulkan/radv_cmd_buffer.c b/src/amd/vulkan/radv_cmd_buffer.c
> index 0ddddf50f6..5807718b6e 100644
> --- a/src/amd/vulkan/radv_cmd_buffer.c
> +++ b/src/amd/vulkan/radv_cmd_buffer.c
> @@ -3060,6 +3060,15 @@ void radv_CmdBeginRenderPass(
>         radv_cmd_buffer_clear_subpass(cmd_buffer);
>  }
>
> +void radv_CmdBeginRenderPass2KHR(
> +    VkCommandBuffer                             commandBuffer,
> +    const VkRenderPassBeginInfo*                pRenderPassBeginInfo,
> +    const VkSubpassBeginInfoKHR*                pSubpassBeginInfo)
> +{
> +       radv_CmdBeginRenderPass(commandBuffer, pRenderPassBeginInfo,
> +                               pSubpassBeginInfo->contents);
> +}
> +
>  void radv_CmdNextSubpass(
>      VkCommandBuffer                             commandBuffer,
>      VkSubpassContents                           contents)
> @@ -3075,6 +3084,14 @@ void radv_CmdNextSubpass(
>         radv_cmd_buffer_clear_subpass(cmd_buffer);
>  }
>
> +void radv_CmdNextSubpass2KHR(
> +    VkCommandBuffer                             commandBuffer,
> +    const VkSubpassBeginInfoKHR*                pSubpassBeginInfo,
> +    const VkSubpassEndInfoKHR*                  pSubpassEndInfo)
> +{
> +       radv_CmdNextSubpass(commandBuffer, pSubpassBeginInfo->contents);
> +}
> +
>  static void radv_emit_view_index(struct radv_cmd_buffer *cmd_buffer, unsigned index)
>  {
>         struct radv_pipeline *pipeline = cmd_buffer->state.pipeline;
> @@ -3955,6 +3972,13 @@ void radv_CmdEndRenderPass(
>         cmd_buffer->state.framebuffer = NULL;
>  }
>
> +void radv_CmdEndRenderPass2KHR(
> +    VkCommandBuffer                             commandBuffer,
> +    const VkSubpassEndInfoKHR*                  pSubpassEndInfo)
> +{
> +       radv_CmdEndRenderPass(commandBuffer);
> +}
> +
>  /*
>   * For HTILE we have the following interesting clear words:
>   *   0xfffff30f: Uncompressed, full depth range, for depth+stencil HTILE
> diff --git a/src/amd/vulkan/radv_extensions.py b/src/amd/vulkan/radv_extensions.py
> index a0f1038110..13b26c9f0b 100644
> --- a/src/amd/vulkan/radv_extensions.py
> +++ b/src/amd/vulkan/radv_extensions.py
> @@ -52,6 +52,7 @@ class Extension:
>  EXTENSIONS = [
>      Extension('VK_ANDROID_native_buffer',                 5, 'ANDROID && device->rad_info.has_syncobj_wait_for_submit'),
>      Extension('VK_KHR_bind_memory2',                      1, True),
> +    Extension('VK_KHR_create_renderpass2',                1, True),
>      Extension('VK_KHR_dedicated_allocation',              1, True),
>      Extension('VK_KHR_descriptor_update_template',        1, True),
>      Extension('VK_KHR_device_group',                      1, True),
> diff --git a/src/amd/vulkan/radv_pass.c b/src/amd/vulkan/radv_pass.c
> index 0e0f767751..2191093391 100644
> --- a/src/amd/vulkan/radv_pass.c
> +++ b/src/amd/vulkan/radv_pass.c
> @@ -197,6 +197,175 @@ VkResult radv_CreateRenderPass(
>         return VK_SUCCESS;
>  }
>
> +VkResult radv_CreateRenderPass2KHR(
> +    VkDevice                                    _device,
> +    const VkRenderPassCreateInfo2KHR*           pCreateInfo,
> +    const VkAllocationCallbacks*                pAllocator,
> +    VkRenderPass*                               pRenderPass)
> +{
> +       RADV_FROM_HANDLE(radv_device, device, _device);
> +       struct radv_render_pass *pass;
> +       size_t size;
> +       size_t attachments_offset;
> +       VkRenderPassMultiviewCreateInfoKHR *multiview_info = NULL;
> +
> +       assert(pCreateInfo->sType == VK_STRUCTURE_TYPE_RENDER_PASS_CREATE_INFO_2_KHR);
> +
> +       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;
> +
> +       vk_foreach_struct(ext, pCreateInfo->pNext) {
> +               switch(ext->sType) {
> +               case  VK_STRUCTURE_TYPE_RENDER_PASS_MULTIVIEW_CREATE_INFO_KHR:
> +                       multiview_info = ( VkRenderPassMultiviewCreateInfoKHR*)ext;
> +                       break;
> +               default:
> +                       break;
> +               }
> +       }
> +
> +       for (uint32_t i = 0; i < pCreateInfo->attachmentCount; i++) {
> +               struct radv_render_pass_attachment *att = &pass->attachments[i];
> +
> +               att->format = pCreateInfo->pAttachments[i].format;
> +               att->samples = pCreateInfo->pAttachments[i].samples;
> +               att->load_op = pCreateInfo->pAttachments[i].loadOp;
> +               att->stencil_load_op = pCreateInfo->pAttachments[i].stencilLoadOp;
> +               att->initial_layout =  pCreateInfo->pAttachments[i].initialLayout;
> +               att->final_layout =  pCreateInfo->pAttachments[i].finalLayout;
> +               // att->store_op = pCreateInfo->pAttachments[i].storeOp;
> +               // att->stencil_store_op = pCreateInfo->pAttachments[i].stencilStoreOp;
> +       }
> +       uint32_t subpass_attachment_count = 0;
> +       struct radv_subpass_attachment *p;
> +       for (uint32_t i = 0; i < pCreateInfo->subpassCount; i++) {
> +               const VkSubpassDescription2KHR *desc = &pCreateInfo->pSubpasses[i];
> +
> +               subpass_attachment_count +=
> +                       desc->inputAttachmentCount +
> +                       desc->colorAttachmentCount +
> +                       (desc->pResolveAttachments ? desc->colorAttachmentCount : 0) +
> +                       (desc->pDepthStencilAttachment != NULL);
> +       }
> +
> +       if (subpass_attachment_count) {
> +               pass->subpass_attachments =
> +                       vk_alloc2(&device->alloc, pAllocator,
> +                                   subpass_attachment_count * sizeof(struct radv_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 VkSubpassDescription2KHR *desc = &pCreateInfo->pSubpasses[i];
> +               uint32_t color_sample_count = 1, depth_sample_count = 1;
> +               struct radv_subpass *subpass = &pass->subpasses[i];
> +
> +               subpass->input_count = desc->inputAttachmentCount;
> +               subpass->color_count = desc->colorAttachmentCount;
> +               if (multiview_info)
> +                       subpass->view_mask = multiview_info->pViewMasks[i];
> +
> +               if (desc->inputAttachmentCount > 0) {
> +                       subpass->input_attachments = p;
> +                       p += desc->inputAttachmentCount;
> +
> +                       for (uint32_t j = 0; j < desc->inputAttachmentCount; j++) {
> +                               subpass->input_attachments[j] = (struct radv_subpass_attachment) {
> +                                       .attachment = desc->pInputAttachments[j].attachment,
> +                                       .layout = desc->pInputAttachments[j].layout,
> +                               };
> +                               if (desc->pInputAttachments[j].attachment != VK_ATTACHMENT_UNUSED)
> +                                       pass->attachments[desc->pInputAttachments[j].attachment].view_mask |= subpass->view_mask;
> +                       }
> +               }
> +
> +               if (desc->colorAttachmentCount > 0) {
> +                       subpass->color_attachments = p;
> +                       p += desc->colorAttachmentCount;
> +
> +                       for (uint32_t j = 0; j < desc->colorAttachmentCount; j++) {
> +                               subpass->color_attachments[j] = (struct radv_subpass_attachment) {
> +                                       .attachment = desc->pColorAttachments[j].attachment,
> +                                       .layout = desc->pColorAttachments[j].layout,
> +                               };
> +                               if (desc->pColorAttachments[j].attachment != VK_ATTACHMENT_UNUSED) {
> +                                       pass->attachments[desc->pColorAttachments[j].attachment].view_mask |= subpass->view_mask;
> +                                       color_sample_count = pCreateInfo->pAttachments[desc->pColorAttachments[j].attachment].samples;
> +                               }
> +                       }
> +               }
> +
> +               subpass->has_resolve = false;
> +               if (desc->pResolveAttachments) {
> +                       subpass->resolve_attachments = p;
> +                       p += desc->colorAttachmentCount;
> +
> +                       for (uint32_t j = 0; j < desc->colorAttachmentCount; j++) {
> +                               uint32_t a = desc->pResolveAttachments[j].attachment;
> +                               subpass->resolve_attachments[j] = (struct radv_subpass_attachment) {
> +                                       .attachment = desc->pResolveAttachments[j].attachment,
> +                                       .layout = desc->pResolveAttachments[j].layout,
> +                               };
> +                               if (a != VK_ATTACHMENT_UNUSED) {
> +                                       subpass->has_resolve = true;
> +                                       pass->attachments[desc->pResolveAttachments[j].attachment].view_mask |= subpass->view_mask;
> +                               }
> +                       }
> +               }
> +
> +               if (desc->pDepthStencilAttachment) {
> +                       subpass->depth_stencil_attachment = (struct radv_subpass_attachment) {
> +                               .attachment = desc->pDepthStencilAttachment->attachment,
> +                               .layout = desc->pDepthStencilAttachment->layout,
> +                       };
> +                       if (desc->pDepthStencilAttachment->attachment != VK_ATTACHMENT_UNUSED) {
> +                               pass->attachments[desc->pDepthStencilAttachment->attachment].view_mask |= subpass->view_mask;
> +                               depth_sample_count = pCreateInfo->pAttachments[desc->pDepthStencilAttachment->attachment].samples;
> +                       }
> +               } else {
> +                       subpass->depth_stencil_attachment.attachment = VK_ATTACHMENT_UNUSED;
> +               }
> +
> +               subpass->max_sample_count = MAX2(color_sample_count,
> +                                                depth_sample_count);
> +       }
> +
> +       for (unsigned i = 0; i < pCreateInfo->dependencyCount; ++i) {
> +               uint32_t dst = pCreateInfo->pDependencies[i].dstSubpass;
> +               if (dst == VK_SUBPASS_EXTERNAL) {
> +                       pass->end_barrier.src_stage_mask = pCreateInfo->pDependencies[i].srcStageMask;
> +                       pass->end_barrier.src_access_mask = pCreateInfo->pDependencies[i].srcAccessMask;
> +                       pass->end_barrier.dst_access_mask = pCreateInfo->pDependencies[i].dstAccessMask;
> +               } else {
> +                       pass->subpasses[dst].start_barrier.src_stage_mask = pCreateInfo->pDependencies[i].srcStageMask;
> +                       pass->subpasses[dst].start_barrier.src_access_mask = pCreateInfo->pDependencies[i].srcAccessMask;
> +                       pass->subpasses[dst].start_barrier.dst_access_mask = pCreateInfo->pDependencies[i].dstAccessMask;
> +               }
> +       }
> +
> +       *pRenderPass = radv_render_pass_to_handle(pass);
> +
> +       return VK_SUCCESS;
> +}
> +
>  void radv_DestroyRenderPass(
>         VkDevice                                    _device,
>         VkRenderPass                                _pass,
> --
> 2.18.0
>
> _______________________________________________
> 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