首页 > 解决方案 > 使用单独的命令缓冲区时交换链图像的 vulkan 图像布局转换的奇怪行为

问题描述

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

我做什么

我创建了一个渲染通道,渲染目标附件(交换链图像)的初始/最终布局都是VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL . 所以我需要做一些图像布局转换。

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

验证错误

提交渲染命令缓冲区后弹出第一个验证错误,调用后弹出第二个验证错误vkQueuePresentKHR在此处输入图像描述

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

Renderdoc 记录的第一帧

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

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

更新:

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

标签: graphicsrenderingvulkan

解决方案


可能是您的同步问题,布局转换可能在您执行 present 或 submit 命令之前尚未完成。

但是,不需要手动进行转换,只需将附件描述的 src/dst imagelayout 设置为 UNDEFINED/PRESENT_SRC 即可。


推荐阅读