使用单独的命令缓冲区时交换链图像的 vulkan 图像布局转换的奇怪行为

Weird behavior of vulkan Image layout transition for swapchain image while using a seperate command buffer

由于代码太多,我无法在此处进行代码快照。我将通过 Vulkan 验证错误和 renderdoc 来描述我的问题。

我做什么

我创建了一个渲染过程,initial/final 渲染目标附件(交换链图像)的布局都是 VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL。所以我需要做一些图像布局转换。

此外,我创建了两个单独的命令缓冲区,一个用于记录将在 vkQueuePresentKHR 之前提交的渲染命令,另一个用于记录 vkCmdPipelineBarrier 以传输将在提交渲染之前提交的图像布局命令缓冲区。

验证错误

提交渲染命令缓冲区后弹出第一个验证错误,调用后弹出第二个验证错误vkQueuePresentKHR

很奇怪,第一个验证错误是提交渲染命令缓冲区而不是传输图像布局的命令缓冲区。

Renderdoc记录的第一帧

第一帧呈现 交换链图像 157,如 renderdoc 记录中所示。

我的两个命令缓冲区是从同一个命令池中分配的。有人知道这里发生了什么吗?

更新:

如果我使用渲染命令缓冲区来记录vkCmdPipelineBarrier,则不会出现验证错误。但是我不知道为什么单独的trainsition command buffer不能正常工作

可能是你的同步问题,在你执行present或submit命令之前布局转换可能还没有完成。

不过不需要手动转场,只要把附件描述的src/dstimagelayout设置成UNDEFINED/PRESENT_SRC就可以了。

此错误是由于不正确使用单独的命令缓冲区引起的。我在渲染命令缓冲区之前提交命令缓冲区记录屏障。我认为执行屏障是保证命令执行顺序与屏障命令相关的记录顺序一致。我的方式会有如下执行结果

vkCmdPipelineBarrier

vkCmdBeginRenderpass

vkCmdBindVertexBuffer

vkCmdDraw

vkCmdEndRenderpass

我设置了屏障,用于将由 renderpass 生成的图像布局转换为 VK_IMAGE_LAYOUT_PRESENT_SRC_KHR。但是,我的错误做法导致在执行渲染过程之前执行过渡。我好笨