Mesa (main): venus: add support for VK_KHR_dynamic_rendering

GitLab Mirror gitlab-mirror at kemper.freedesktop.org
Sat Jul 23 01:22:41 UTC 2022


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

Author: Ryan Neph <ryanneph at google.com>
Date:   Wed Jul 20 15:57:15 2022 -0700

venus: add support for VK_KHR_dynamic_rendering

Signed-off-by: Ryan Neph <ryanneph at google.com>
Reviewed-by: Yiwei Zhang <zzyiwei at chromium.org>
Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/17668>

---

 src/virtio/vulkan/vn_command_buffer.c  | 63 +++++++++++++++++++++++++++++++---
 src/virtio/vulkan/vn_physical_device.c |  7 ++++
 src/virtio/vulkan/vn_physical_device.h |  1 +
 3 files changed, 67 insertions(+), 4 deletions(-)

diff --git a/src/virtio/vulkan/vn_command_buffer.c b/src/virtio/vulkan/vn_command_buffer.c
index a9fa109d9f9..2d89fbadbef 100644
--- a/src/virtio/vulkan/vn_command_buffer.c
+++ b/src/virtio/vulkan/vn_command_buffer.c
@@ -634,6 +634,7 @@ vn_ResetCommandBuffer(VkCommandBuffer commandBuffer,
 struct vn_command_buffer_begin_info {
    VkCommandBufferBeginInfo begin;
    VkCommandBufferInheritanceInfo inheritance;
+   VkCommandBufferInheritanceConditionalRenderingInfoEXT conditional_rendering;
 
    bool has_inherited_pass;
 };
@@ -655,6 +656,12 @@ vn_fix_command_buffer_begin_info(struct vn_command_buffer *cmd,
    const bool has_renderpass =
       begin_info->pInheritanceInfo->renderPass != VK_NULL_HANDLE;
 
+   /* Can early-return if dynamic rendering is used and no structures need to
+    * be dropped from the pNext chain of VkCommandBufferInheritanceInfo.
+    */
+   if (is_cmd_secondary && has_continue && !has_renderpass)
+      return begin_info;
+
    local->begin = *begin_info;
 
    if (!is_cmd_secondary) {
@@ -662,16 +669,52 @@ vn_fix_command_buffer_begin_info(struct vn_command_buffer *cmd,
       return &local->begin;
    }
 
+   local->inheritance = *begin_info->pInheritanceInfo;
+   local->begin.pInheritanceInfo = &local->inheritance;
+
    if (!has_continue) {
-      local->inheritance = *begin_info->pInheritanceInfo;
       local->inheritance.framebuffer = VK_NULL_HANDLE;
       local->inheritance.renderPass = VK_NULL_HANDLE;
       local->inheritance.subpass = 0;
-      local->begin.pInheritanceInfo = &local->inheritance;
    } else {
-      local->has_inherited_pass = has_renderpass;
+      /* With early-returns above, it must be an inherited pass. */
+      local->has_inherited_pass = true;
    }
 
+   /* Per spec, about VkCommandBufferInheritanceRenderingInfo:
+    *
+    * If VkCommandBufferInheritanceInfo::renderPass is not VK_NULL_HANDLE, or
+    * VK_COMMAND_BUFFER_USAGE_RENDER_PASS_CONTINUE_BIT is not specified in
+    * VkCommandBufferBeginInfo::flags, parameters of this structure are
+    * ignored.
+    */
+   VkBaseOutStructure *head = NULL;
+   VkBaseOutStructure *tail = NULL;
+   vk_foreach_struct_const(src, local->inheritance.pNext) {
+      void *pnext = NULL;
+      switch (src->sType) {
+      case VK_STRUCTURE_TYPE_COMMAND_BUFFER_INHERITANCE_CONDITIONAL_RENDERING_INFO_EXT:
+         memcpy(
+            &local->conditional_rendering, src,
+            sizeof(VkCommandBufferInheritanceConditionalRenderingInfoEXT));
+         pnext = &local->conditional_rendering;
+         break;
+      case VK_STRUCTURE_TYPE_COMMAND_BUFFER_INHERITANCE_RENDERING_INFO:
+      default:
+         break;
+      }
+
+      if (pnext) {
+         if (!head)
+            head = pnext;
+         else
+            tail->pNext = pnext;
+
+         tail = pnext;
+      }
+   }
+   local->inheritance.pNext = head;
+
    return &local->begin;
 }
 
@@ -688,7 +731,6 @@ vn_BeginCommandBuffer(VkCommandBuffer commandBuffer,
    vn_cs_encoder_reset(&cmd->cs);
    cmd->draw_cmd_batched = 0;
 
-   /* TODO: add support for VK_KHR_dynamic_rendering */
    struct vn_command_buffer_begin_info local_begin_info;
    pBeginInfo =
       vn_fix_command_buffer_begin_info(cmd, pBeginInfo, &local_begin_info);
@@ -915,6 +957,19 @@ vn_CmdDraw(VkCommandBuffer commandBuffer,
       vn_command_buffer_from_handle(commandBuffer));
 }
 
+void
+vn_CmdBeginRendering(VkCommandBuffer commandBuffer,
+                     const VkRenderingInfo *pRenderingInfo)
+{
+   VN_CMD_ENQUEUE(vkCmdBeginRendering, commandBuffer, pRenderingInfo);
+}
+
+void
+vn_CmdEndRendering(VkCommandBuffer commandBuffer)
+{
+   VN_CMD_ENQUEUE(vkCmdEndRendering, commandBuffer);
+}
+
 void
 vn_CmdDrawIndexed(VkCommandBuffer commandBuffer,
                   uint32_t indexCount,
diff --git a/src/virtio/vulkan/vn_physical_device.c b/src/virtio/vulkan/vn_physical_device.c
index 26bf874c1ed..43954f38c1d 100644
--- a/src/virtio/vulkan/vn_physical_device.c
+++ b/src/virtio/vulkan/vn_physical_device.c
@@ -132,6 +132,8 @@ vn_physical_device_init_features(struct vn_physical_device *physical_dev)
    VN_ADD_EXT_TO_PNEXT(exts->EXT_inline_uniform_block,
                        feats->inline_uniform_block,
                        INLINE_UNIFORM_BLOCK_FEATURES, features2);
+   VN_ADD_EXT_TO_PNEXT(exts->KHR_dynamic_rendering, feats->dynamic_rendering,
+                       DYNAMIC_RENDERING_FEATURES, features2);
    VN_ADD_EXT_TO_PNEXT(exts->KHR_maintenance4, feats->maintenance4,
                        MAINTENANCE_4_FEATURES, features2);
    VN_ADD_EXT_TO_PNEXT(exts->EXT_shader_demote_to_helper_invocation,
@@ -999,6 +1001,7 @@ vn_physical_device_get_passthrough_extensions(
       .EXT_inline_uniform_block = true,
       .EXT_shader_demote_to_helper_invocation = true,
       .KHR_copy_commands2 = true,
+      .KHR_dynamic_rendering = true,
       .KHR_maintenance4 = true,
 
       /* EXT */
@@ -1620,6 +1623,7 @@ vn_GetPhysicalDeviceFeatures2(VkPhysicalDevice physicalDevice,
 
       /* Vulkan 1.3 */
       VkPhysicalDevice4444FormatsFeaturesEXT *argb_4444_formats;
+      VkPhysicalDeviceDynamicRenderingFeatures *dynamic_rendering;
       VkPhysicalDeviceExtendedDynamicStateFeaturesEXT *extended_dynamic_state;
       VkPhysicalDeviceExtendedDynamicState2FeaturesEXT
          *extended_dynamic_state2;
@@ -1804,6 +1808,9 @@ vn_GetPhysicalDeviceFeatures2(VkPhysicalDevice physicalDevice,
       case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_4444_FORMATS_FEATURES_EXT:
          *u.argb_4444_formats = feats->argb_4444_formats;
          break;
+      case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_DYNAMIC_RENDERING_FEATURES:
+         *u.dynamic_rendering = feats->dynamic_rendering;
+         break;
       case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_EXTENDED_DYNAMIC_STATE_FEATURES_EXT:
          *u.extended_dynamic_state = feats->extended_dynamic_state;
          break;
diff --git a/src/virtio/vulkan/vn_physical_device.h b/src/virtio/vulkan/vn_physical_device.h
index ccd12a00fed..db9abc9c988 100644
--- a/src/virtio/vulkan/vn_physical_device.h
+++ b/src/virtio/vulkan/vn_physical_device.h
@@ -24,6 +24,7 @@ struct vn_physical_device_features {
 
    /* Vulkan 1.3 */
    VkPhysicalDevice4444FormatsFeaturesEXT argb_4444_formats;
+   VkPhysicalDeviceDynamicRenderingFeatures dynamic_rendering;
    VkPhysicalDeviceExtendedDynamicStateFeaturesEXT extended_dynamic_state;
    VkPhysicalDeviceExtendedDynamicState2FeaturesEXT extended_dynamic_state_2;
    VkPhysicalDeviceImageRobustnessFeatures image_robustness;



More information about the mesa-commit mailing list