提交到队列时是否执行Empty VkCommandBuffer?

时间:2018-03-05 15:47:41

标签: vulkan

嘿伙计们,我想知道我们是否将包含一个空VkCommandBuffer的VkSubmitInfo提交给队列,如果它将被执行或被忽略。我的意思是在提交空的VkCommandBuffer时仍然会考虑VkSubmitInfo :: pWaitSemaphore和VkSubmitInfo :: pDestSemaphore中的信号量吗?

看起来是一个愚蠢的问题,但我想要的是"乘以"唯一一个离开vkAcquireNextImageKHR的信号量。

我的意思是,我想提交一个空的命令缓冲区,其中VkSubmitInfo :: pWaitSemaphore指向" acquire_semaphore",并且让VkSubmitInfo :: pDstSemaphore具有我需要的尽可能多的信号量。

1 个答案:

答案 0 :(得分:1)

  

如果它将被执行或忽略。

有什么区别?如果命令缓冲区中没有命令,则执行它将不执行任何操作。

  

我的意思是,我想提交一个空的命令缓冲区,其中VkSubmitInfo :: pWaitSemaphore指向" acquire_semaphore",并且让VkSubmitInfo :: pDstSemaphore拥有尽可能多的信号量。

这与CB本身的执行无关。批次的行为不会因为CB没有做任何事情而改变。

但是,除非您有多个队列等待完成此队列的操作,否则实际上没有理由拥有多个目标信号量。包含实际工作的批处理可以等待pWaitSemaphores

此外,没有理由让空批处理只等待一个信号量。让我们假设您有批次Q,它会发出pWaitSemaphores这个空批处理信号的信号。好吧,没有理由批量Q pDstSemaphores无法发出您希望空批发信号的信号量。毕竟,vkQueueSubmit信号量等待操作作为其目标命令范围,具有来自vkQueueSubmit调用的该队列的所有后续命令,即当前的一个或后续命令。

因此,如果必须等待来自不同队列中不同批次的信号的多个信号量,则只需要一个空批处理。这种复杂的依赖关系布局强烈地暗示了过度复杂的依赖设计,这将导致性能降低。

即使等待获取也没有意义。如果该队列将要操作到获取的图像,您只需要等待获取。好吧,你不能同时操纵多个队列中的图像。因此,当获取完成时,发出一堆信号量是没有意义的;这就是为什么获得只需要一个。

  

所以我想用信号量模拟一个Fence,然后看看速度会更快。

这强烈表明你不正确地思考问题。

当您希望CPU检测GPU操作的完成时,可以使用栅栏。对于vkAcquireNextImageKHR,如果您需要CPU知道何时获取图像,则可以使用栅栏。

信号量是关于GPU检测GPU操作何时完成的,无论操作是否来自队列。因此,如果GPU需要等到获取图像,则使用信号量。

哪个更快,因为他们做了不同的事情并不重要。