通过同一队列进行多次提交的障碍或信号量?
Barriers or semaphores for multiple submissions over the same queue?
在这个例子中,我们将一些缓冲区复制到顶点缓冲区中,我们希望在两次提交中使用此缓冲区快速开始渲染,而无需等待一些围栏:
vkBeginCommandBuffer(tansferCommandBuffer)
vkCmdCopyBuffer(tansferCommandBuffer, hostVisibleBuffer, vertexBuffer)
vkEndCommandBuffer(tansferCommandBuffer)
vkQueueSubmit(queue, tansferCommandBuffer)
vkBeginCommandBuffer(renderCommandBuffer)
...
vkCmdBindVertexBuffers(vertexBuffer)
vkCmdDraw()
...
vkEndCommandBuffer(renderCommandBuffer)
vkQueueSubmit(queue, renderCommandBuffer)
据我了解,提交 renderCommandBuffer
时 tansferCommandBuffer
可能尚未完成,并且 renderCommandBuffer
可能会被调度并读取 vertexBuffer
中的表单浮动数据.
我们可以在提交tansferCommandBuffer
的时候附加一个信号量,完成后被单挑,然后将这个信号量转发给renderCommandBuffer
等待执行。这里的问题是它阻止了不依赖于缓冲区的第二批命令。
或者我们可以在复制命令之后或绑定顶点命令之前插入一个屏障,这似乎要好得多,因为我们可以指定对缓冲区的访问是我们的主要关注点,并可能保留部分批处理被执行。
对于类似情况(单个队列,多个提交)使用信号量而不是障碍有什么好的理由吗?
每当您更改使用资源的方式来通知 driver/hardware 该更改时,障碍都是必要的。因此,在您的示例中,可能也需要屏障。
但至于信号量。当您提交命令缓冲区时,您指定信号量句柄和管道阶段,在这些阶段应该在相应的信号量上等待。您可以通过 VkSubmitInfo 结构的以下成员执行此操作:
- pWaitSemaphores is a pointer to an array of semaphores upon which to wait before the command buffers for this batch begin execution. If
semaphores to wait on are provided, they define a semaphore wait
operation.
- pWaitDstStageMask is a pointer to an array of pipeline stages at which each corresponding semaphore wait will occur.
所以当你提交一个命令缓冲区时,硬件可以执行到指定阶段的所有命令。
在这个例子中,我们将一些缓冲区复制到顶点缓冲区中,我们希望在两次提交中使用此缓冲区快速开始渲染,而无需等待一些围栏:
vkBeginCommandBuffer(tansferCommandBuffer)
vkCmdCopyBuffer(tansferCommandBuffer, hostVisibleBuffer, vertexBuffer)
vkEndCommandBuffer(tansferCommandBuffer)
vkQueueSubmit(queue, tansferCommandBuffer)
vkBeginCommandBuffer(renderCommandBuffer)
...
vkCmdBindVertexBuffers(vertexBuffer)
vkCmdDraw()
...
vkEndCommandBuffer(renderCommandBuffer)
vkQueueSubmit(queue, renderCommandBuffer)
据我了解,提交 renderCommandBuffer
时 tansferCommandBuffer
可能尚未完成,并且 renderCommandBuffer
可能会被调度并读取 vertexBuffer
中的表单浮动数据.
我们可以在提交tansferCommandBuffer
的时候附加一个信号量,完成后被单挑,然后将这个信号量转发给renderCommandBuffer
等待执行。这里的问题是它阻止了不依赖于缓冲区的第二批命令。
或者我们可以在复制命令之后或绑定顶点命令之前插入一个屏障,这似乎要好得多,因为我们可以指定对缓冲区的访问是我们的主要关注点,并可能保留部分批处理被执行。
对于类似情况(单个队列,多个提交)使用信号量而不是障碍有什么好的理由吗?
每当您更改使用资源的方式来通知 driver/hardware 该更改时,障碍都是必要的。因此,在您的示例中,可能也需要屏障。
但至于信号量。当您提交命令缓冲区时,您指定信号量句柄和管道阶段,在这些阶段应该在相应的信号量上等待。您可以通过 VkSubmitInfo 结构的以下成员执行此操作:
- pWaitSemaphores is a pointer to an array of semaphores upon which to wait before the command buffers for this batch begin execution. If semaphores to wait on are provided, they define a semaphore wait operation.
- pWaitDstStageMask is a pointer to an array of pipeline stages at which each corresponding semaphore wait will occur.
所以当你提交一个命令缓冲区时,硬件可以执行到指定阶段的所有命令。