graphics - 使用单独的命令缓冲区时交换链图像的 vulkan 图像布局转换的奇怪行为
问题描述
由于代码太多,我无法在这里过去代码快照。我将通过 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 记录的第一帧
第一帧正在呈现交换链图像 157,如 renderdoc 记录中所示。
我的两个命令缓冲区是从同一个命令池分配的。有谁知道这里发生了什么?
更新:
如果我使用渲染命令缓冲区进行记录vkCmdPipelineBarrier
,则不会出现验证错误。但我不知道为什么单独的 trainsition 命令缓冲区无法正常工作。
解决方案
可能是您的同步问题,布局转换可能在您执行 present 或 submit 命令之前尚未完成。
但是,不需要手动进行转换,只需将附件描述的 src/dst imagelayout 设置为 UNDEFINED/PRESENT_SRC 即可。
推荐阅读
- python - SyntaxError: (unicode error) 'unicodeescape' codec can't decode bytes in position 51-52: malformed \N character escape
- javascript - 获取价值数据并根据每个环节变化?
- javascript - javascript 中的实用程序映射器函数
- amazon-web-services - 使用 SES 发送带有多个附件的电子邮件
- reactjs - 成功“提交”后 ReduxForm 重置表单
- python - Spark Python - 从结构中选择并从特定深度返回
- php - 如何在命令行中简单地编译一个 php 项目?
- selenium - 如何为每次页面加载时更改的 id 元素匹配 xpath?
- java - 在 List 上使用 set 方法
导致不支持的操作异常 - algorithm - 动态规划问题(输入不一致?)