可以使用管道屏障同步 vkQueuePresentKHR 吗?
Can vkQueuePresentKHR be synced using a pipeline barrier?
vkQueuePresentKHR 获取一个队列参数的事实让我觉得它就像一个传递到队列执行的命令。如果是这样,可以使用源阶段为 VK_PIPELINE_STAGE_COLOR_ATTACHMENT_OUTPUT_BIT 且目标阶段为 VK_PIPELINE_STAGE_TOP_OF_PIPE_BIT 的管道屏障使其等待(直到写入要呈现的图像完成)。或者甚至可以通过图像屏障来缓解仅图像的同步约束。
但事实上,在每本教程和书籍中,同步都是使用信号量完成的,这让我觉得我的假设是错误的。如果是这样,为什么 vkQueuePresentKHR 需要一个队列参数?因为信号量参数似乎已经足够了:当它发出信号时,vkQueuePresentKHR 可以根据图像索引参数和交换链句柄参数呈现图像。
演示文稿是队列操作。这就是您将其提交到队列的原因。将执行图像呈现的队列。特别是 能够 执行当前操作的队列。
至于如何同步... the specification is a bit ambiguous on this point.
信号量肯定能用;有一个特定的标注:
信号量不是使先前命令的结果对当前可见的必要条件:
Any writes to memory backing the images referenced by the pImageIndices
and pSwapchains
members of pPresentInfo
, that are available before vkQueuePresentKHR
is executed, are
automatically made visible to the read access performed by the presentation engine. This automatic visibility operation for an image happens-after the semaphore signal operation, and happens-before the presentation engine accesses the image.
虽然对信号量做了规定,但没有具体说明其他的东西。特别是,如果您不等待信号量,则不清楚“在信号量信号操作之后发生”是什么意思,因为没有发生这样的信号操作。
现在,vkQueuePresentKHR
的 API 明确表示您不需要提供信号量来等待:
waitSemaphoreCount
is the number of semaphores to wait for before issuing the present request.
The number may be zero.
有人可能认为,作为队列操作,该队列上的所有先前同步仍会影响呈现。例如,如果您将交换链图像作为附件写入,则为外部子通道依赖项。它可能会......如果不是因为一个小问题。
看,同步最终是基于阶段之间的依赖关系。演示……没有舞台。因此,虽然您的外部依赖源很容易理解,但尚不清楚 destination 阶段会起作用。即使指定所有阶段标志也不一定有效。
所有阶段的集合中是否存在“非阶段”?
无论如何,最好只使用信号量。反正你可能需要一个,所以就用那个吧。
规范中有几个未解决的问题。值得注意的是 KhronosGroup/Vulkan-Docs#1308 正是您的问题。
同时大家通常都遵循这种语言:
The processing of the presentation happens in issue order with other queue operations, but semaphores have to be used to ensure that prior rendering and other commands in the specified queue complete before the presentation begins.
这意味着必须使用信号量。鉴于我们不是 110% 确定,这意味着应该使用信号量,直到我们知道更好为止。
另一个半官方来源是sync wiki,它使用了信号量。
不管这句话怎么说,我认为有理由相信在 vkQueuePresent
之前使用其他使图像已经 可见 的同步也是允许的,比如围栏等等。
但仅仅管道障碍可能还不够。演示在队列系统之外:
However, the scope of this set of queue operations does not include the actual processing of the image by the presentation engine.
另外没有VkPipelineStageFlagBit
,vkQueuePresentKHR
不在提交顺序,所以不能在同步范围内任意 vkCmdPipelineBarrier
.
令人困惑的部分是这个不幸的措辞:
Any writes to memory backing the images referenced by the pImageIndices
and pSwapchains
members of pPresentInfo
, that are available before vkQueuePresentKHR
is executed, are automatically made visible to the read access performed by the presentation engine.
我相信诀窍是“在 vkQueuePresentKHR
执行之前”。如上所述,vkQueuePresentKHR
不是提交顺序的一部分,因此您不知道在执行 vkQueuePresentKHR
之前内存是否通过管道屏障可用。
vkQueuePresentKHR 获取一个队列参数的事实让我觉得它就像一个传递到队列执行的命令。如果是这样,可以使用源阶段为 VK_PIPELINE_STAGE_COLOR_ATTACHMENT_OUTPUT_BIT 且目标阶段为 VK_PIPELINE_STAGE_TOP_OF_PIPE_BIT 的管道屏障使其等待(直到写入要呈现的图像完成)。或者甚至可以通过图像屏障来缓解仅图像的同步约束。
但事实上,在每本教程和书籍中,同步都是使用信号量完成的,这让我觉得我的假设是错误的。如果是这样,为什么 vkQueuePresentKHR 需要一个队列参数?因为信号量参数似乎已经足够了:当它发出信号时,vkQueuePresentKHR 可以根据图像索引参数和交换链句柄参数呈现图像。
演示文稿是队列操作。这就是您将其提交到队列的原因。将执行图像呈现的队列。特别是 能够 执行当前操作的队列。
至于如何同步... the specification is a bit ambiguous on this point.
信号量肯定能用;有一个特定的标注:
信号量不是使先前命令的结果对当前可见的必要条件:
Any writes to memory backing the images referenced by the
pImageIndices
andpSwapchains
members ofpPresentInfo
, that are available beforevkQueuePresentKHR
is executed, are automatically made visible to the read access performed by the presentation engine. This automatic visibility operation for an image happens-after the semaphore signal operation, and happens-before the presentation engine accesses the image.
虽然对信号量做了规定,但没有具体说明其他的东西。特别是,如果您不等待信号量,则不清楚“在信号量信号操作之后发生”是什么意思,因为没有发生这样的信号操作。
现在,vkQueuePresentKHR
的 API 明确表示您不需要提供信号量来等待:
waitSemaphoreCount
is the number of semaphores to wait for before issuing the present request.The number may be zero.
有人可能认为,作为队列操作,该队列上的所有先前同步仍会影响呈现。例如,如果您将交换链图像作为附件写入,则为外部子通道依赖项。它可能会......如果不是因为一个小问题。
看,同步最终是基于阶段之间的依赖关系。演示……没有舞台。因此,虽然您的外部依赖源很容易理解,但尚不清楚 destination 阶段会起作用。即使指定所有阶段标志也不一定有效。
所有阶段的集合中是否存在“非阶段”?
无论如何,最好只使用信号量。反正你可能需要一个,所以就用那个吧。
规范中有几个未解决的问题。值得注意的是 KhronosGroup/Vulkan-Docs#1308 正是您的问题。
同时大家通常都遵循这种语言:
The processing of the presentation happens in issue order with other queue operations, but semaphores have to be used to ensure that prior rendering and other commands in the specified queue complete before the presentation begins.
这意味着必须使用信号量。鉴于我们不是 110% 确定,这意味着应该使用信号量,直到我们知道更好为止。
另一个半官方来源是sync wiki,它使用了信号量。
不管这句话怎么说,我认为有理由相信在 vkQueuePresent
之前使用其他使图像已经 可见 的同步也是允许的,比如围栏等等。
但仅仅管道障碍可能还不够。演示在队列系统之外:
However, the scope of this set of queue operations does not include the actual processing of the image by the presentation engine.
另外没有VkPipelineStageFlagBit
,vkQueuePresentKHR
不在提交顺序,所以不能在同步范围内任意 vkCmdPipelineBarrier
.
令人困惑的部分是这个不幸的措辞:
Any writes to memory backing the images referenced by the
pImageIndices
andpSwapchains
members ofpPresentInfo
, that are available beforevkQueuePresentKHR
is executed, are automatically made visible to the read access performed by the presentation engine.
我相信诀窍是“在 vkQueuePresentKHR
执行之前”。如上所述,vkQueuePresentKHR
不是提交顺序的一部分,因此您不知道在执行 vkQueuePresentKHR
之前内存是否通过管道屏障可用。