From e96428d588e4e5494899c29533b3af48311403ca Mon Sep 17 00:00:00 2001 From: Juston Li Date: Fri, 30 Jun 2023 08:37:22 -0700 Subject: [PATCH] venus: track render pass vkCmdCopyQueryPoolResults cannot be called within a render pass/or while the render pass is suspended so track when commands are inside a render pass. Also track whether a secondary command buffer is considered to be entirely inside a render pass. Signed-off-by: Juston Li Part-of: --- src/virtio/vulkan/vn_command_buffer.c | 24 +++++++++++++++++++++++- src/virtio/vulkan/vn_command_buffer.h | 3 +++ 2 files changed, 26 insertions(+), 1 deletion(-) diff --git a/src/virtio/vulkan/vn_command_buffer.c b/src/virtio/vulkan/vn_command_buffer.c index 17468fe19d2..ae6e3dea33b 100644 --- a/src/virtio/vulkan/vn_command_buffer.c +++ b/src/virtio/vulkan/vn_command_buffer.c @@ -514,6 +514,7 @@ vn_cmd_begin_render_pass(struct vn_command_buffer *cmd, cmd->builder.framebuffer = fb; if (begin_info) { + cmd->in_render_pass = true; cmd->render_pass = pass; cmd->subpass_index = 0; cmd->view_mask = cmd->render_pass->subpasses[0].view_mask; @@ -569,6 +570,7 @@ vn_cmd_end_render_pass(struct vn_command_buffer *cmd) cmd->builder.render_pass = NULL; cmd->builder.framebuffer = NULL; + cmd->in_render_pass = false; cmd->render_pass = NULL; cmd->subpass_index = 0; cmd->view_mask = 0; @@ -662,6 +664,8 @@ vn_cmd_reset(struct vn_command_buffer *cmd) cmd->state = VN_COMMAND_BUFFER_STATE_INITIAL; cmd->draw_cmd_batched = 0; + cmd->in_render_pass = false; + cmd->suspends = false; cmd->render_pass = NULL; cmd->subpass_index = 0; cmd->view_mask = 0; @@ -803,6 +807,7 @@ struct vn_command_buffer_begin_info { VkCommandBufferInheritanceConditionalRenderingInfoEXT conditional_rendering; bool has_inherited_pass; + bool in_render_pass; }; static const VkCommandBufferBeginInfo * @@ -823,6 +828,13 @@ vn_fix_command_buffer_begin_info(struct vn_command_buffer *cmd, is_cmd_secondary && begin_info->pInheritanceInfo->renderPass != VK_NULL_HANDLE; + /* Per spec 1.3.255: "VK_COMMAND_BUFFER_USAGE_RENDER_PASS_CONTINUE_BIT + * specifies that a secondary command buffer is considered to be + * entirely inside a render pass. If this is a primary command buffer, + * then this bit is ignored." + */ + local->in_render_pass = has_continue && is_cmd_secondary; + /* Can early-return if dynamic rendering is used and no structures need to * be dropped from the pNext chain of VkCommandBufferInheritanceInfo. */ @@ -916,6 +928,7 @@ vn_BeginCommandBuffer(VkCommandBuffer commandBuffer, pBeginInfo->pInheritanceInfo; if (inheritance_info) { + cmd->in_render_pass = local_begin_info.in_render_pass; if (local_begin_info.has_inherited_pass) { vn_cmd_begin_render_pass( cmd, vn_render_pass_from_handle(inheritance_info->renderPass), @@ -1150,8 +1163,11 @@ vn_CmdBeginRendering(VkCommandBuffer commandBuffer, struct vn_command_buffer *cmd = vn_command_buffer_from_handle(commandBuffer); + cmd->in_render_pass = true; cmd->view_mask = pRenderingInfo->viewMask; + cmd->suspends = pRenderingInfo->flags & VK_RENDERING_SUSPENDING_BIT; + VN_CMD_ENQUEUE(vkCmdBeginRendering, commandBuffer, pRenderingInfo); } @@ -1163,7 +1179,13 @@ vn_CmdEndRendering(VkCommandBuffer commandBuffer) VN_CMD_ENQUEUE(vkCmdEndRendering, commandBuffer); - cmd->view_mask = 0; + /* Feedback commands not allowed during suspended render pass either + * so defer until it actually ends. + */ + if (!cmd->suspends) { + cmd->in_render_pass = false; + cmd->view_mask = 0; + } } void diff --git a/src/virtio/vulkan/vn_command_buffer.h b/src/virtio/vulkan/vn_command_buffer.h index 432ffe74d8a..93d62ce2fcf 100644 --- a/src/virtio/vulkan/vn_command_buffer.h +++ b/src/virtio/vulkan/vn_command_buffer.h @@ -69,6 +69,9 @@ struct vn_command_buffer { uint32_t draw_cmd_batched; /* For batching query feedback in render passes */ + /* in_render_pass remains true when a render pass is suspended */ + bool in_render_pass; + bool suspends; /* viewMask is stored per subpass for legacy render pass */ const struct vn_render_pass *render_pass; uint32_t subpass_index;