【问题标题】:Weird behavior of vulkan Image layout transition for swapchain image while using a seperate command buffer使用单独的命令缓冲区时交换链图像的 vulkan 图像布局转换的奇怪行为
【发布时间】: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命令缓冲区不能正常工作。

【问题讨论】:

    标签: graphics rendering vulkan


    【解决方案1】:

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

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

    【讨论】:

    • 你的意思是UNDEFINED可以兼容任何src布局吗?另外,我确实认为这是由未完成的布局过渡引起的。根据khronos.org/registry/vulkan/specs/1.2-extensions/man/html/…,vkCmdPipelineBarrier在队列中设置了一个barrier,也就是说barrier之后的命令会在barrier之前的命令执行完毕后执行
    • 请添加更多详细信息以扩展您的答案,例如工作代码或文档引用。
    • @wangsy ,是的,您可以将附件描述中的 srclayout 设置为未定义。您是否注意到 stagemask 定义的同步范围,src/dst StageMask 定义了在屏障之前/之后应该发生的事情。您是否正确设置它们?
    • 未定义的附件描述初始布局与加载操作不兼容。我不能用这个
    • @wangsy 那么你应该先更改图像布局,尝试将 dststage 设置为 COLOR_ATTACHMENT_OUTPUT 或简单的 ALL_COMMAND(不推荐)
    【解决方案2】:

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

    vkCmdPipelineBarrier

    vkCmdBeginRenderpass

    vkCmdBindVertexBuffer

    vkCmdDraw

    vkCmdEndRenderpass

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-06-12
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-02-23
      • 2018-03-31
      相关资源
      最近更新 更多