2017-06-15 408 views
0

调用vkWaitForFences时是否需要同步对设备句柄的访问?该规范没有提到任何需要,但没有提到它是自由线程的。在一些地方,即大多数vkCreateXXX,提到这是一个要求。鉴于规范的明确性质,我期望更精确的措辞(而不是在这种情况下)。Vulkan:vkWaitForFences同步访问VkDevice

我怀疑答案是“否”,但我无法相信我的直觉与这个API或它背后的实现。

如果有必要保护对这个函数的调用,这会很奇怪(实际上没用)。

回答

2

该规范使用术语“外部同步”和“主机同步”来讨论应用程序必须确保非并发使用的对象/参数。这些规则在Section 2.5 "Threading Behavior"以及大多数命令之后的“主机同步”块中描述。没有列出的任何东西都可以同时使用。

我不知道你为什么认为设备参数应该在vkCreate*的外部同步,我无法在规范中找到支持该参数的内容。设备对象几乎从不从外部同步。

vkWaitForFences的参数都没有列为主机同步。但是传递给vkQueueSubmitvkResetFences的围栏是主机同步的,因此当有另一个线程正在等待围栅时,您无法将围栏传递给其中一个调用。但是你可能有两个线程在等待同一个围栏,或者一个线程调用vkGetFenceStatus,而另一个线程正在等待它。

+0

TBH我发现“外部同步”和“主机同步”这两个术语混淆不清,因为在Vulkan内部几乎没有任何同步。也许将每个命令参数视为“读取访问”并将“主机同步”中列出的每个命令参数都视为“写入访问”会很有帮助。读 - 读不需要同步;写 - 读和写 - 写。 – krOoze

+0

是的,根据“写入访问”的思路是有帮助的,这也是我所做的。除少数情况外,当一个命令*要求*写入一个参数时,该参数是外部同步的。但是许多实现可能需要对参数进行偶然写入访问,这些参数不会更改该参数的API可见状态。所以这些不是外部同步的(有一些例外),并且如果实现需要有序访问,则必须在内部同步。许多VkDevice命令属于该类别。 –