Vulkan-如何有效地将数据复制到CPU*并等待它



假设我想执行以下命令:

cmd_buff start
dispatch (write to texture1)
copy (texture1 on gpu to buffer1 host-visible)
dispatch (write to texture2)
cmd_buff end

我想尽快知道buffer1的数据何时可用。

我在这里的想法是有一个等待线程,我会在上面等待副本完成。我要做的是首先将上面的cmd列表拆分为:

cmd_buff_1 start
dispatch (write to texture1)
copy (texture1 on gpu to buffer1 host-visible)
cmd_buff_1 end

和:

cmd_buff_2 start
dispatch (write to texture2)
cmd_buff_2 end

现在,我用cmd_buff_1和一些fence1调用vkQueueSubmit,然后用cmd_buff_2和NULL fence调用另一个vkQueQueueSubmit。

在等待线程上,我会调用vkWaitForFences(fence1(。

这就是我对这种手术的看法。然而,我想知道这是否是最佳的,是否真的有任何方法可以将直接同步仍然放在cmd_buff_1中,这样我就不需要将cmd缓冲区一分为二了?

永远不要为了测试围栏而中断提交操作;提交操作太重了,无法做到这一点。如果CPU需要检查GPU上的工作是否达到了特定的点,除了围栏之外还有很多选项。

对于这样的事情,最简单的机制是使用事件。在传输操作后设置事件,然后使用CPU上的vkGetEventStatus查看它何时准备就绪。这是一个轮询函数,所以当数据准备好时,等待的CPU线程不会立即唤醒(但是,也不能保证非轮询函数会发生这种情况(。

如果时间线信号量对您可用,您可以使用vkWaitSemaphores等待它们达到CPU上的特定计数器值。这需要将批处理分解为两个批,但它们都可以在同一个提交命令中提交。

最新更新