2

我们有两个传输命令,vkCmdFillBuffer()然后是vkCmdCopyQueryPoolResults(). 传输命令写入重叠的缓冲区范围。

命令之间是否需要管道屏障以避免写后写危险?

Vulkan 是否为在同一管道阶段执行的命令提供任何保证?

4

1 回答 1

3

当然,您几乎总是必须在 Vulkan 中进行同步。Vulkan 进行隐式同步的地方很少。

您对管道阶段有错误的直觉。命令独立地“到达”管道的各个阶段。所有命令都从VK_PIPELINE_STAGE_TOP_OF_PIPE(它们按提交顺序“到达”它)开始。然后(没有同步)不确定哪个命令将进入流水线的下一阶段。如果没有明确的同步原语,它就没有顺序。该规范会说“队列操作的执行可能重叠或发生乱序”。

所以没有同步vkCmdCopyQueryPoolResults甚至可能发生在之前vkCmdFillBuffer,我假设你不想要。如果两者同时发生,那就更糟了。然后数据可能包含来自两个来源(或两者都没有)的一些混乱的写入。结果将只是未定义的。

于 2019-03-10T17:08:07.223 回答