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

Author: Yiwei Zhang <[email protected]>
Date:   Mon Jul 10 15:50:27 2023 -0700

venus: add helpers to track subpass view mask

Signed-off-by: Yiwei Zhang <[email protected]>
Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/24103>

---

 src/virtio/vulkan/vn_command_buffer.c | 37 +++++++++++++++--------------------
 src/virtio/vulkan/vn_render_pass.h    |  8 ++++++++
 2 files changed, 24 insertions(+), 21 deletions(-)

diff --git a/src/virtio/vulkan/vn_command_buffer.c 
b/src/virtio/vulkan/vn_command_buffer.c
index 85c8f7502c0..e045f822c8e 100644
--- a/src/virtio/vulkan/vn_command_buffer.c
+++ b/src/virtio/vulkan/vn_command_buffer.c
@@ -591,7 +591,7 @@ vn_cmd_begin_render_pass(struct vn_command_buffer *cmd,
    cmd->in_render_pass = true;
    cmd->render_pass = pass;
    cmd->subpass_index = 0;
-   cmd->view_mask = cmd->render_pass->subpasses[0].view_mask;
+   cmd->view_mask = vn_render_pass_get_subpass_view_mask(pass, 0);
 
    if (!pass->present_count)
       return;
@@ -662,6 +662,13 @@ vn_cmd_end_render_pass(struct vn_command_buffer *cmd)
    vk_free(&cmd->pool->allocator, images);
 }
 
+static inline void
+vn_cmd_next_subpass(struct vn_command_buffer *cmd)
+{
+   cmd->view_mask = vn_render_pass_get_subpass_view_mask(
+      cmd->render_pass, ++cmd->subpass_index);
+}
+
 /* command pool commands */
 
 VkResult
@@ -1044,8 +1051,8 @@ vn_BeginCommandBuffer(VkCommandBuffer commandBuffer,
          /* Store the viewMask from the inherited render pass subpass for
           * query feedback.
           */
-         cmd->view_mask =
-            pass->subpasses[inheritance_info->subpass].view_mask;
+         cmd->view_mask = vn_render_pass_get_subpass_view_mask(
+            pass, inheritance_info->subpass);
       } else {
          /* Store the viewMask from the
           * VkCommandBufferInheritanceRenderingInfo.
@@ -1919,10 +1926,7 @@ vn_CmdBeginRenderPass(VkCommandBuffer commandBuffer,
 void
 vn_CmdNextSubpass(VkCommandBuffer commandBuffer, VkSubpassContents contents)
 {
-   struct vn_command_buffer *cmd =
-      vn_command_buffer_from_handle(commandBuffer);
-   cmd->view_mask =
-      cmd->render_pass->subpasses[++cmd->subpass_index].view_mask;
+   vn_cmd_next_subpass(vn_command_buffer_from_handle(commandBuffer));
 
    VN_CMD_ENQUEUE(vkCmdNextSubpass, commandBuffer, contents);
 }
@@ -1930,12 +1934,9 @@ vn_CmdNextSubpass(VkCommandBuffer commandBuffer, 
VkSubpassContents contents)
 void
 vn_CmdEndRenderPass(VkCommandBuffer commandBuffer)
 {
-   struct vn_command_buffer *cmd =
-      vn_command_buffer_from_handle(commandBuffer);
-
    VN_CMD_ENQUEUE(vkCmdEndRenderPass, commandBuffer);
 
-   vn_cmd_end_render_pass(cmd);
+   vn_cmd_end_render_pass(vn_command_buffer_from_handle(commandBuffer));
 }
 
 void
@@ -1960,10 +1961,7 @@ vn_CmdNextSubpass2(VkCommandBuffer commandBuffer,
                    const VkSubpassBeginInfo *pSubpassBeginInfo,
                    const VkSubpassEndInfo *pSubpassEndInfo)
 {
-   struct vn_command_buffer *cmd =
-      vn_command_buffer_from_handle(commandBuffer);
-   cmd->view_mask =
-      cmd->render_pass->subpasses[++cmd->subpass_index].view_mask;
+   vn_cmd_next_subpass(vn_command_buffer_from_handle(commandBuffer));
 
    VN_CMD_ENQUEUE(vkCmdNextSubpass2, commandBuffer, pSubpassBeginInfo,
                   pSubpassEndInfo);
@@ -1973,12 +1971,9 @@ void
 vn_CmdEndRenderPass2(VkCommandBuffer commandBuffer,
                      const VkSubpassEndInfo *pSubpassEndInfo)
 {
-   struct vn_command_buffer *cmd =
-      vn_command_buffer_from_handle(commandBuffer);
-
    VN_CMD_ENQUEUE(vkCmdEndRenderPass2, commandBuffer, pSubpassEndInfo);
 
-   vn_cmd_end_render_pass(cmd);
+   vn_cmd_end_render_pass(vn_command_buffer_from_handle(commandBuffer));
 }
 
 void
@@ -1986,11 +1981,11 @@ vn_CmdExecuteCommands(VkCommandBuffer commandBuffer,
                       uint32_t commandBufferCount,
                       const VkCommandBuffer *pCommandBuffers)
 {
-   struct vn_command_buffer *primary_cmd =
-      vn_command_buffer_from_handle(commandBuffer);
    VN_CMD_ENQUEUE(vkCmdExecuteCommands, commandBuffer, commandBufferCount,
                   pCommandBuffers);
 
+   struct vn_command_buffer *primary_cmd =
+      vn_command_buffer_from_handle(commandBuffer);
    if (primary_cmd->in_render_pass) {
       for (uint32_t i = 0; i < commandBufferCount; i++) {
          struct vn_command_buffer *secondary_cmd =
diff --git a/src/virtio/vulkan/vn_render_pass.h 
b/src/virtio/vulkan/vn_render_pass.h
index 19c1878016b..3b0941293ea 100644
--- a/src/virtio/vulkan/vn_render_pass.h
+++ b/src/virtio/vulkan/vn_render_pass.h
@@ -73,4 +73,12 @@ VK_DEFINE_NONDISP_HANDLE_CASTS(vn_framebuffer,
                                VkFramebuffer,
                                VK_OBJECT_TYPE_FRAMEBUFFER)
 
+static inline uint32_t
+vn_render_pass_get_subpass_view_mask(const struct vn_render_pass *render_pass,
+                                     uint32_t subpass_index)
+{
+   assert(subpass_index < render_pass->subpass_count);
+   return render_pass->subpasses[subpass_index].view_mask;
+}
+
 #endif /* VN_RENDER_PASS_H */

Reply via email to