diff --git a/src/virtio/vulkan/vn_command_buffer.c b/src/virtio/vulkan/vn_command_buffer.c index 1cfde32bacb..1a8d2146775 100644 --- a/src/virtio/vulkan/vn_command_buffer.c +++ b/src/virtio/vulkan/vn_command_buffer.c @@ -14,6 +14,24 @@ #include "venus-protocol/vn_protocol_driver_command_pool.h" #include "vn_device.h" +#include "vn_render_pass.h" + +static void +vn_cmd_begin_render_pass(struct vn_command_buffer *cmd, + const struct vn_render_pass *pass, + const struct vn_framebuffer *fb, + const VkRenderPassBeginInfo *begin_info) +{ + cmd->builder.render_pass = pass; + cmd->builder.framebuffer = fb; +} + +static void +vn_cmd_end_render_pass(struct vn_command_buffer *cmd) +{ + cmd->builder.render_pass = NULL; + cmd->builder.framebuffer = NULL; +} /* command pool commands */ @@ -229,6 +247,16 @@ vn_BeginCommandBuffer(VkCommandBuffer commandBuffer, cmd->state = VN_COMMAND_BUFFER_STATE_RECORDING; + if (cmd->level == VK_COMMAND_BUFFER_LEVEL_SECONDARY && + (pBeginInfo->flags & + VK_COMMAND_BUFFER_USAGE_RENDER_PASS_CONTINUE_BIT)) { + const VkCommandBufferInheritanceInfo *inheritance_info = + pBeginInfo->pInheritanceInfo; + vn_cmd_begin_render_pass( + cmd, vn_render_pass_from_handle(inheritance_info->renderPass), + vn_framebuffer_from_handle(inheritance_info->framebuffer), NULL); + } + return VK_SUCCESS; } @@ -1196,6 +1224,11 @@ vn_CmdBeginRenderPass(VkCommandBuffer commandBuffer, vn_command_buffer_from_handle(commandBuffer); size_t cmd_size; + vn_cmd_begin_render_pass( + cmd, vn_render_pass_from_handle(pRenderPassBegin->renderPass), + vn_framebuffer_from_handle(pRenderPassBegin->framebuffer), + pRenderPassBegin); + cmd_size = vn_sizeof_vkCmdBeginRenderPass(commandBuffer, pRenderPassBegin, contents); if (!vn_cs_encoder_reserve(&cmd->cs, cmd_size)) @@ -1231,6 +1264,8 @@ vn_CmdEndRenderPass(VkCommandBuffer commandBuffer) return; vn_encode_vkCmdEndRenderPass(&cmd->cs, 0, commandBuffer); + + vn_cmd_end_render_pass(cmd); } void @@ -1242,6 +1277,11 @@ vn_CmdBeginRenderPass2(VkCommandBuffer commandBuffer, vn_command_buffer_from_handle(commandBuffer); size_t cmd_size; + vn_cmd_begin_render_pass( + cmd, vn_render_pass_from_handle(pRenderPassBegin->renderPass), + vn_framebuffer_from_handle(pRenderPassBegin->framebuffer), + pRenderPassBegin); + cmd_size = vn_sizeof_vkCmdBeginRenderPass2(commandBuffer, pRenderPassBegin, pSubpassBeginInfo); if (!vn_cs_encoder_reserve(&cmd->cs, cmd_size)) @@ -1282,6 +1322,8 @@ vn_CmdEndRenderPass2(VkCommandBuffer commandBuffer, return; vn_encode_vkCmdEndRenderPass2(&cmd->cs, 0, commandBuffer, pSubpassEndInfo); + + vn_cmd_end_render_pass(cmd); } void diff --git a/src/virtio/vulkan/vn_command_buffer.h b/src/virtio/vulkan/vn_command_buffer.h index a0a51d584b4..852a5dab354 100644 --- a/src/virtio/vulkan/vn_command_buffer.h +++ b/src/virtio/vulkan/vn_command_buffer.h @@ -39,6 +39,9 @@ struct vn_command_buffer_builder { /* for scrubbing VK_IMAGE_LAYOUT_PRESENT_SRC_KHR */ uint32_t image_barrier_count; VkImageMemoryBarrier *image_barriers; + + const struct vn_render_pass *render_pass; + const struct vn_framebuffer *framebuffer; }; struct vn_command_buffer {