Mesa (main): venus: ignore framebuffer for VkCommandBuffer executed outside of render pass

GitLab Mirror gitlab-mirror at kemper.freedesktop.org
Wed Dec 1 23:48:10 UTC 2021


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

Author: Ryan Neph <ryanneph at google.com>
Date:   Tue Nov 30 15:39:17 2021 -0800

venus: ignore framebuffer for VkCommandBuffer executed outside of render pass

The vulkan spec states[1]:
> If the VkCommandBuffer will not be executed within a render pass instance,
> or if the render pass instance was begun with vkCmdBeginRenderingKHR,
> renderPass, subpass, and framebuffer are ignored.

but venus will still try to encode them, resulting in a guest-side
assert or host-side command stream error.

[1]: https://www.khronos.org/registry/vulkan/specs/1.2-extensions/man/html/VkCommandBufferInheritanceInfo.html#_description

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

---

 src/virtio/vulkan/vn_command_buffer.c | 22 +++++++++++++++++-----
 1 file changed, 17 insertions(+), 5 deletions(-)

diff --git a/src/virtio/vulkan/vn_command_buffer.c b/src/virtio/vulkan/vn_command_buffer.c
index 6ee5237b32a..41a3828e17d 100644
--- a/src/virtio/vulkan/vn_command_buffer.c
+++ b/src/virtio/vulkan/vn_command_buffer.c
@@ -629,12 +629,24 @@ vn_BeginCommandBuffer(VkCommandBuffer commandBuffer,
 
    vn_cs_encoder_reset(&cmd->cs);
 
+   /* TODO: add support for VK_KHR_dynamic_rendering */
    VkCommandBufferBeginInfo local_begin_info;
-   if (pBeginInfo->pInheritanceInfo &&
-       cmd->level == VK_COMMAND_BUFFER_LEVEL_PRIMARY) {
-      local_begin_info = *pBeginInfo;
-      local_begin_info.pInheritanceInfo = NULL;
-      pBeginInfo = &local_begin_info;
+   VkCommandBufferInheritanceInfo local_inheritance_info;
+   if (pBeginInfo->pInheritanceInfo) {
+      if (cmd->level == VK_COMMAND_BUFFER_LEVEL_PRIMARY) {
+         local_begin_info = *pBeginInfo;
+         local_begin_info.pInheritanceInfo = NULL;
+         pBeginInfo = &local_begin_info;
+      } else if (!(pBeginInfo->flags &
+                   VK_COMMAND_BUFFER_USAGE_RENDER_PASS_CONTINUE_BIT)) {
+         local_inheritance_info = *pBeginInfo->pInheritanceInfo;
+         local_inheritance_info.framebuffer = VK_NULL_HANDLE;
+         local_inheritance_info.renderPass = VK_NULL_HANDLE;
+         local_inheritance_info.subpass = 0;
+         local_begin_info = *pBeginInfo;
+         local_begin_info.pInheritanceInfo = &local_inheritance_info;
+         pBeginInfo = &local_begin_info;
+      }
    }
 
    cmd_size = vn_sizeof_vkBeginCommandBuffer(commandBuffer, pBeginInfo);



More information about the mesa-commit mailing list