調用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命令屬於該類別。 –