Vulkan中命令缓冲区之间的同步

Hidayat

在Vulkan中有几种处理同步的方法。这是我的理解方式:

  • 栅栏是GPU与CPU的同步。
  • 信号量是GPU到GPU的同步,它们用于同步队列提交(在相同或不同的队列上)。
  • 事件更一般,重置并在CPU和GPU上进行检查。
  • 屏障用于命令缓冲区内的同步。

就我而言,我有两个命令缓冲区。我希望第二个命令缓冲区在第一个之后执行。

submitInfo.pCommandBuffers = &firstCommandBuffer;
vkQueueSubmit(queue, 1, &submitInfo, VK_NULL_HANDLE);

// wait for first command buffer to finish
submitInfo.pCommandBuffers = &secondCommandBuffer;
vkQueueSubmit(queue, 1, &submitInfo, VK_NULL_HANDLE);

哪种同步最适合此?如果我使用的vkQueueWaitIdle(queue)),是与使用篱笆相同的东西,还是应该为此使用事件或信号量?

如果我同时将多个命令缓冲区发送到队列:

std::vector<VkCommandBuffer> submitCmdBuffers = {
        firstCommandBuffer,
        secondCommandBuffer
    };
    submitInfo.commandBufferCount = submitCmdBuffers.size();
    submitInfo.pCommandBuffers = submitCmdBuffers.data();

还有第一种和第二种之间同步的方法吗?

尼科尔·波拉斯(Nicol Bolas)

第一个命令缓冲区是在深度测试已打开的情况下渲染对象。第二个命令缓冲区是在深度测试关闭的情况下渲染网格轮廓。因为它必须在其他对象之上。

对于这种情况,您所需要的取决于这些命令缓冲区是什么。

如果这些是在同一渲染过程实例中执行的辅助命令缓冲区,则不需要任何同步化。除非您正在从辅助命令缓冲区中的深度纹理中手动读取,否则不会。为什么?

因为第2.2.1节的API订购可以保护您。渲染通道实例中的深度测试和深度写入将始终按API顺序进行。因此,以后的命令,无论是在同一个CB中还是在另一个CB中,都将针对深度测试/编写进行排序。

但是,如果需要从着色器读取深度缓冲区,或者命令缓冲区位于不同的渲染过程实例中,则需要通过事件进行显式同步。

在这种情况下,vkCmdSetEvent命令的阶段掩码应为写入深度值的阶段。这可能是EARLY_FRAGMENT_TESTS_BITLATE_FRAGMENT_TESTS_BIT为了安全起见,请同时使用两者。但是,由于您可能要更新相同的颜色缓冲区,因此也需要该COLOR_ATTACHMENT_OUTPUT_BIT阶段。在第一个命令缓冲区的末尾(或在完成所有深度写入之后)插入此命令。

对于vkCmdWaitEvent,您要等待需要它的管道阶段。在您的情况下,这又是碎片测试和颜色附件。但是,如果着色器阶段要读取深度,则在wait命令中也需要该阶段。

由于涉及内存,因此您vkCmdWaitEvent还需要对深度和颜色缓冲区使用内存依赖性。

确实,所有这些复杂性就是为什么您应该尽可能将这些命令缓冲区放在同一渲染通道实例中的原因。您无法执行此操作的唯一原因是,您需要从着色器中的深度缓冲区读取数据。

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

在更新命令缓冲区的情况下,vulkan命令缓冲区同步

来自分类Dev

在Vulkan中重新提交待处理命令缓冲区的用例是什么

来自分类Dev

Vulkan:在多个命令缓冲区中排序图像内存屏障

来自分类Dev

Vulkan:更新统一变量而不重置命令缓冲区

来自分类Dev

如何停止清除命令缓冲区之间的内容?

来自分类Dev

使用vulkan进行绘制调用之间的存储缓冲区同步

来自分类Dev

使用金属间接命令缓冲区时出错:“片段着色器不能与间接命令缓冲区一起使用”

来自分类Dev

如果命令终止,则杀死Emacs的异步Shell命令缓冲区

来自分类Dev

iOS Metal:在一个命令缓冲区中进行多个内核调用

来自分类Dev

Ubuntu 16-免费命令缓冲区/缓存差异

来自分类Dev

Metal Compute - 将已经入队的命令缓冲区入队

来自分类Dev

在C#中同步缓冲区

来自分类Dev

如何在Vulkan中重新分配缓冲区

来自分类Dev

Vulkan 中的动态顶点缓冲区格式设置

来自分类Dev

如何在vim中的vim缓冲区和命令外壳屏幕之间切换?

来自分类Dev

同步Metal中的统一缓冲区更新

来自分类Dev

Vulkan-顶点缓冲区更新

来自分类Dev

缓冲区的屏幕命令

来自分类Dev

nodejs缓冲区是异步还是同步?

来自分类Dev

nodejs缓冲区是异步还是同步?

来自分类Dev

Vim:在磁盘上的缓冲区和文件之间同步只读状态

来自分类Dev

如何,何时从Vulkan中的帧缓冲区捕获图像到文件

来自分类Dev

如何在 Vulkan 深度缓冲区中存储不受限制的深度范围

来自分类Dev

Bash命令写入临时缓冲区

来自分类Dev

在Vulkan中最通常的更新顶点缓冲区的正确方法

来自分类Dev

Vulkan / VMA更改缓冲区大小类似于`realloc`

来自分类Dev

当SSIS中的C#转换需要同步时,在输出缓冲区中使用AddRow()?

来自分类Dev

如何同步多线程OpenGL缓冲区访问?

来自分类Dev

是否可以将流同步转换为缓冲区?

Related 相关文章

  1. 1

    在更新命令缓冲区的情况下,vulkan命令缓冲区同步

  2. 2

    在Vulkan中重新提交待处理命令缓冲区的用例是什么

  3. 3

    Vulkan:在多个命令缓冲区中排序图像内存屏障

  4. 4

    Vulkan:更新统一变量而不重置命令缓冲区

  5. 5

    如何停止清除命令缓冲区之间的内容?

  6. 6

    使用vulkan进行绘制调用之间的存储缓冲区同步

  7. 7

    使用金属间接命令缓冲区时出错:“片段着色器不能与间接命令缓冲区一起使用”

  8. 8

    如果命令终止,则杀死Emacs的异步Shell命令缓冲区

  9. 9

    iOS Metal:在一个命令缓冲区中进行多个内核调用

  10. 10

    Ubuntu 16-免费命令缓冲区/缓存差异

  11. 11

    Metal Compute - 将已经入队的命令缓冲区入队

  12. 12

    在C#中同步缓冲区

  13. 13

    如何在Vulkan中重新分配缓冲区

  14. 14

    Vulkan 中的动态顶点缓冲区格式设置

  15. 15

    如何在vim中的vim缓冲区和命令外壳屏幕之间切换?

  16. 16

    同步Metal中的统一缓冲区更新

  17. 17

    Vulkan-顶点缓冲区更新

  18. 18

    缓冲区的屏幕命令

  19. 19

    nodejs缓冲区是异步还是同步?

  20. 20

    nodejs缓冲区是异步还是同步?

  21. 21

    Vim:在磁盘上的缓冲区和文件之间同步只读状态

  22. 22

    如何,何时从Vulkan中的帧缓冲区捕获图像到文件

  23. 23

    如何在 Vulkan 深度缓冲区中存储不受限制的深度范围

  24. 24

    Bash命令写入临时缓冲区

  25. 25

    在Vulkan中最通常的更新顶点缓冲区的正确方法

  26. 26

    Vulkan / VMA更改缓冲区大小类似于`realloc`

  27. 27

    当SSIS中的C#转换需要同步时,在输出缓冲区中使用AddRow()?

  28. 28

    如何同步多线程OpenGL缓冲区访问?

  29. 29

    是否可以将流同步转换为缓冲区?

热门标签

归档