【发布时间】:2021-08-27 04:02:29
【问题描述】:
由于代码太多,我无法在这里过去代码快照。我将通过 Vulkan 验证错误和 renderdoc 来描述我的问题。
我做什么
我创建了一个渲染通道,渲染目标附件(交换链图像)的初始/最终布局都是 VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL 。所以我需要做一些图像布局过渡。
-
创建交换链时:将交换链图像的布局从
VK_IMAGE_LAYOUT_UNDEFINED转换为VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL。 -
一帧开始:将当前渲染目标的当前布局转移到
VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL。 -
在提交渲染命令缓冲区之前在调用
vkQueuePresentKHR之前:将当前渲染目标的当前布局转换为VK_IMAGE_LAYOUT_PRESENT_SRC_KHR。
另外,我创建了两个单独的命令缓冲区,一个用于记录将在vkQueuePresentKHR 之前提交的渲染命令,另一个用于记录vkCmdPipelineBarrier 以转换将在提交渲染命令缓冲区之前提交的图像布局。
验证错误
提交渲染命令缓冲区后弹出第一个验证错误,调用vkQueuePresentKHR后弹出第二个验证错误。
奇怪的是,第一个验证错误是提交渲染命令缓冲区而不是用于传输图像布局的命令缓冲区。
Renderdoc 记录的第一帧
第一帧呈现 swapchain 图像 157,如 renderdoc 记录中所示。
我的两个命令缓冲区是从同一个命令池分配的。有谁知道这里发生了什么?
更新:
如果我使用渲染命令缓冲区记录vkCmdPipelineBarrier,则不会出现验证错误。但是我不知道为什么单独的trainsition命令缓冲区不能正常工作。
【问题讨论】: