调用vkWaitForFences
时是否需要同步对设备句柄的访问?该规范没有提到任何需要,但没有提到它是自由线程的。在一些地方,即大多数vkCreateXXX
,提到这是一个要求。鉴于规范的明确性质,我期望更精确的措辞(而不是在这种情况下)。Vulkan:vkWaitForFences同步访问VkDevice
我怀疑答案是“否”,但我无法相信我的直觉与这个API或它背后的实现。
如果有必要保护对这个函数的调用,这会很奇怪(实际上没用)。
调用vkWaitForFences
时是否需要同步对设备句柄的访问?该规范没有提到任何需要,但没有提到它是自由线程的。在一些地方,即大多数vkCreateXXX
,提到这是一个要求。鉴于规范的明确性质,我期望更精确的措辞(而不是在这种情况下)。Vulkan:vkWaitForFences同步访问VkDevice
我怀疑答案是“否”,但我无法相信我的直觉与这个API或它背后的实现。
如果有必要保护对这个函数的调用,这会很奇怪(实际上没用)。
该规范使用术语“外部同步”和“主机同步”来讨论应用程序必须确保非并发使用的对象/参数。这些规则在Section 2.5 "Threading Behavior"以及大多数命令之后的“主机同步”块中描述。没有列出的任何东西都可以同时使用。
我不知道你为什么认为设备参数应该在vkCreate*
的外部同步,我无法在规范中找到支持该参数的内容。设备对象几乎从不从外部同步。
vkWaitForFences
的参数都没有列为主机同步。但是传递给vkQueueSubmit
和vkResetFences
的围栏是主机同步的,因此当有另一个线程正在等待围栅时,您无法将围栏传递给其中一个调用。但是你可能有两个线程在等待同一个围栏,或者一个线程调用vkGetFenceStatus
,而另一个线程正在等待它。
TBH我发现“外部同步”和“主机同步”这两个术语混淆不清,因为在Vulkan内部几乎没有任何同步。也许将每个命令参数视为“读取访问”并将“主机同步”中列出的每个命令参数都视为“写入访问”会很有帮助。读 - 读不需要同步;写 - 读和写 - 写。 – krOoze
是的,根据“写入访问”的思路是有帮助的,这也是我所做的。除少数情况外,当一个命令*要求*写入一个参数时,该参数是外部同步的。但是许多实现可能需要对参数进行偶然写入访问,这些参数不会更改该参数的API可见状态。所以这些不是外部同步的(有一些例外),并且如果实现需要有序访问,则必须在内部同步。许多VkDevice命令属于该类别。 –