Mesa (main): radv: Support dynamic rendering inheritance info.

GitLab Mirror gitlab-mirror at kemper.freedesktop.org
Sun Dec 5 17:56:10 UTC 2021


Module: Mesa
Branch: main
Commit: 483a08d5521f5036893e23ced8abfceb5761e43f
URL:    http://cgit.freedesktop.org/mesa/mesa/commit/?id=483a08d5521f5036893e23ced8abfceb5761e43f

Author: Bas Nieuwenhuizen <bas at basnieuwenhuizen.nl>
Date:   Mon Nov  8 18:23:47 2021 +0100

radv: Support dynamic rendering inheritance info.

Straightforward, just converting to a renderpass as well. Note that
we now own the renderpass so I also added a bool to check if we own
it so we can destroy it after recording.

Doing the destruction at destroy & reset time, as reset can be called
during recording, and destroy all the time.

Reviewed-by: Samuel Pitoiset <samuel.pitoiset at gmail.com>
Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/13721>

---

 src/amd/vulkan/radv_cmd_buffer.c | 123 ++++++++++++++++++++++++++++++++++++++-
 src/amd/vulkan/radv_private.h    |   3 +
 2 files changed, 123 insertions(+), 3 deletions(-)

diff --git a/src/amd/vulkan/radv_cmd_buffer.c b/src/amd/vulkan/radv_cmd_buffer.c
index ece4aface68..ccc49a1df8c 100644
--- a/src/amd/vulkan/radv_cmd_buffer.c
+++ b/src/amd/vulkan/radv_cmd_buffer.c
@@ -429,6 +429,12 @@ radv_destroy_cmd_buffer(struct radv_cmd_buffer *cmd_buffer)
    if (cmd_buffer->upload.upload_bo)
       cmd_buffer->device->ws->buffer_destroy(cmd_buffer->device->ws, cmd_buffer->upload.upload_bo);
 
+   if (cmd_buffer->state.own_render_pass) {
+      radv_DestroyRenderPass(radv_device_to_handle(cmd_buffer->device),
+                             radv_render_pass_to_handle(cmd_buffer->state.pass), NULL);
+      cmd_buffer->state.own_render_pass = false;
+   }
+
    if (cmd_buffer->cs)
       cmd_buffer->device->ws->cs_destroy(cmd_buffer->cs);
 
@@ -503,6 +509,12 @@ radv_reset_cmd_buffer(struct radv_cmd_buffer *cmd_buffer)
       free(up);
    }
 
+   if (cmd_buffer->state.own_render_pass) {
+      radv_DestroyRenderPass(radv_device_to_handle(cmd_buffer->device),
+                             radv_render_pass_to_handle(cmd_buffer->state.pass), NULL);
+      cmd_buffer->state.own_render_pass = false;
+   }
+
    cmd_buffer->push_constant_stages = 0;
    cmd_buffer->scratch_size_per_wave_needed = 0;
    cmd_buffer->scratch_waves_wanted = 0;
@@ -4358,6 +4370,107 @@ radv_ResetCommandBuffer(VkCommandBuffer commandBuffer, VkCommandBufferResetFlags
    return radv_reset_cmd_buffer(cmd_buffer);
 }
 
+static void
+radv_inherit_dynamic_rendering(struct radv_cmd_buffer *cmd_buffer,
+                               const VkCommandBufferInheritanceInfo *inherit_info)
+{
+   const VkCommandBufferInheritanceRenderingInfoKHR *dyn_info =
+      vk_find_struct_const(inherit_info->pNext, COMMAND_BUFFER_INHERITANCE_RENDERING_INFO_KHR);
+
+   if (!dyn_info)
+      return;
+
+   const VkAttachmentSampleCountInfoAMD *sample_info =
+      vk_find_struct_const(inherit_info->pNext, ATTACHMENT_SAMPLE_COUNT_INFO_AMD);
+   VkResult result;
+   /* (normal + resolve) for color attachments and ds and a VRS attachment */
+   VkAttachmentDescription2 att_desc[MAX_RTS * 2 + 3];
+   VkAttachmentReference2 color_refs[MAX_RTS], ds_ref;
+   unsigned att_count = 0;
+
+   VkSubpassDescription2 subpass = {
+      .sType = VK_STRUCTURE_TYPE_SUBPASS_DESCRIPTION_2,
+      .pipelineBindPoint = VK_PIPELINE_BIND_POINT_GRAPHICS,
+      .viewMask = dyn_info->viewMask,
+      .colorAttachmentCount = dyn_info->colorAttachmentCount,
+      .pColorAttachments = color_refs,
+   };
+
+   for (unsigned i = 0; i < dyn_info->colorAttachmentCount; ++i) {
+      if (dyn_info->pColorAttachmentFormats[i] == VK_FORMAT_UNDEFINED) {
+         color_refs[i] = (VkAttachmentReference2){
+            .sType = VK_STRUCTURE_TYPE_ATTACHMENT_REFERENCE_2,
+            .attachment = VK_ATTACHMENT_UNUSED,
+         };
+         continue;
+      }
+
+      color_refs[i] = (VkAttachmentReference2){
+         .sType = VK_STRUCTURE_TYPE_ATTACHMENT_REFERENCE_2,
+         .attachment = att_count,
+         .layout = VK_IMAGE_LAYOUT_GENERAL, /* Shouldn't be used */
+         .aspectMask = 0,                   /* Shouldn't be used */
+      };
+
+      VkAttachmentDescription2 *att = att_desc + att_count++;
+      memset(att, 0, sizeof(*att));
+      att->sType = VK_STRUCTURE_TYPE_ATTACHMENT_DESCRIPTION_2;
+      att->format = dyn_info->pColorAttachmentFormats[i];
+      att->samples =
+         sample_info ? sample_info->pColorAttachmentSamples[i] : dyn_info->rasterizationSamples;
+      att->loadOp = VK_ATTACHMENT_LOAD_OP_LOAD;
+      att->storeOp = VK_ATTACHMENT_STORE_OP_STORE;
+      att->initialLayout = VK_IMAGE_LAYOUT_GENERAL;
+      att->finalLayout = VK_IMAGE_LAYOUT_GENERAL;
+   }
+
+   if (dyn_info->depthAttachmentFormat != VK_FORMAT_UNDEFINED ||
+       dyn_info->stencilAttachmentFormat != VK_FORMAT_UNDEFINED) {
+      VkFormat fmt = dyn_info->depthAttachmentFormat != VK_FORMAT_UNDEFINED
+                        ? dyn_info->depthAttachmentFormat
+                        : dyn_info->stencilAttachmentFormat;
+
+      ds_ref = (VkAttachmentReference2){
+         .sType = VK_STRUCTURE_TYPE_ATTACHMENT_REFERENCE_2,
+         .attachment = att_count,
+         .layout = VK_IMAGE_LAYOUT_GENERAL, /* Shouldn't be used */
+         .aspectMask = 0,                   /* Shouldn't be used */
+      };
+      subpass.pDepthStencilAttachment = &ds_ref;
+
+      VkAttachmentDescription2 *att = att_desc + att_count++;
+
+      memset(att, 0, sizeof(*att));
+      att->sType = VK_STRUCTURE_TYPE_ATTACHMENT_DESCRIPTION_2;
+      att->format = fmt;
+      att->samples =
+         sample_info ? sample_info->depthStencilAttachmentSamples : dyn_info->rasterizationSamples;
+      att->loadOp = VK_ATTACHMENT_LOAD_OP_LOAD;
+      att->storeOp = VK_ATTACHMENT_STORE_OP_STORE;
+      att->stencilLoadOp = VK_ATTACHMENT_LOAD_OP_LOAD;
+      att->stencilStoreOp = VK_ATTACHMENT_STORE_OP_STORE;
+   }
+
+   VkRenderPassCreateInfo2 rp_create_info = {
+      .sType = VK_STRUCTURE_TYPE_RENDER_PASS_CREATE_INFO_2,
+      .attachmentCount = att_count,
+      .pAttachments = att_desc,
+      .subpassCount = 1,
+      .pSubpasses = &subpass,
+   };
+
+   VkRenderPass rp;
+   result =
+      radv_CreateRenderPass2(radv_device_to_handle(cmd_buffer->device), &rp_create_info, NULL, &rp);
+   if (result != VK_SUCCESS) {
+      cmd_buffer->record_result = result;
+      return;
+   }
+
+   cmd_buffer->state.pass = radv_render_pass_from_handle(rp);
+   cmd_buffer->state.own_render_pass = true;
+}
+
 VKAPI_ATTR VkResult VKAPI_CALL
 radv_BeginCommandBuffer(VkCommandBuffer commandBuffer, const VkCommandBufferBeginInfo *pBeginInfo)
 {
@@ -4396,6 +4509,8 @@ radv_BeginCommandBuffer(VkCommandBuffer commandBuffer, const VkCommandBufferBegi
       cmd_buffer->state.pass =
          radv_render_pass_from_handle(pBeginInfo->pInheritanceInfo->renderPass);
 
+      radv_inherit_dynamic_rendering(cmd_buffer, pBeginInfo->pInheritanceInfo);
+
       struct radv_subpass *subpass =
          &cmd_buffer->state.pass->subpasses[pBeginInfo->pInheritanceInfo->subpass];
 
@@ -4408,9 +4523,11 @@ radv_BeginCommandBuffer(VkCommandBuffer commandBuffer, const VkCommandBufferBegi
       cmd_buffer->state.inherited_pipeline_statistics =
          pBeginInfo->pInheritanceInfo->pipelineStatistics;
 
-      cmd_buffer->state.subpass = subpass;
-      if (cmd_buffer->state.framebuffer)
-         cmd_buffer->state.dirty |= RADV_CMD_DIRTY_FRAMEBUFFER;
+      if (cmd_buffer->state.pass) {
+         cmd_buffer->state.subpass = subpass;
+         if (cmd_buffer->state.framebuffer)
+            cmd_buffer->state.dirty |= RADV_CMD_DIRTY_FRAMEBUFFER;
+      }
    }
 
    if (unlikely(cmd_buffer->device->trace_bo))
diff --git a/src/amd/vulkan/radv_private.h b/src/amd/vulkan/radv_private.h
index d07585a4eea..fc5ac6a2a91 100644
--- a/src/amd/vulkan/radv_private.h
+++ b/src/amd/vulkan/radv_private.h
@@ -1456,6 +1456,9 @@ struct radv_cmd_state {
    uint32_t emitted_vs_prolog_key_hash;
    uint32_t vbo_misaligned_mask;
    uint32_t vbo_bound_mask;
+
+   /* Whether the cmdbuffer owns the current render pass rather than the app. */
+   bool own_render_pass;
 };
 
 struct radv_cmd_pool {



More information about the mesa-commit mailing list