在vulkan.h的VkAccessFlagBits
每個實例出現在包含srcAccessMask
一對和dstAccessMask
:爲什麼VkAccessFlagBits包含讀取位和寫入位?
VkAccessFlags srcAccessMask;
VkAccessFlags dstAccessMask;
在每一種情況下,根據我的理解,這些面具的目的是爲了幫助指定兩套的操作,從而第一組中的操作結果將對第二組中的操作可見。例如,在屏障之前發生的寫操作不應該掛在緩存中,而應該一直傳播到屏障之後可以讀取它們的位置。或類似的東西。
訪問標誌進來讀寫形式:
/* ... */
VK_ACCESS_SHADER_READ_BIT = 0x00000020,
VK_ACCESS_SHADER_WRITE_BIT = 0x00000040,
VK_ACCESS_COLOR_ATTACHMENT_READ_BIT = 0x00000080,
VK_ACCESS_COLOR_ATTACHMENT_WRITE_BIT = 0x00000100,
/* ... */
但在我看來,srcAccessMask
應該總有某種VK_ACCESS_*_WRITE_BIT
組合,而dstAccessMask
應始終VK_ACCESS_*_READ_BIT
值的組合。如果這是真的,那麼READ/WRITE區別與src/dst區別是相同的並且是隱含的,所以它應該足夠好以便具有VK_ACCESS_SHADER_BIT等,沒有READ_或WRITE_變體。
爲什麼會有READ_和WRITE_變種呢?指定某些讀取操作在一些其他操作開始之前必須完全完成是否有用?請注意,所有使用VkAccessFlagBits
的操作都會產生(我認爲)執行依賴性以及內存依賴性。在我看來,執行依賴關係應該足夠好,以防止較早的讀取接收稍後寫入的值。
無論如何,如果有人不同於我,實際上知道這些緩存或其他什麼在某些真實硬件上工作,都想要解釋如何讓Vulkan知道一個屏障是讀寫屏障而另一個屏障是寫入屏障,寫障礙 - 就像爲什麼,詳細地說,它不僅僅是以同樣的方式處理? (或者我真的得到了那個權利??) - 那麼我會很高興。但一個普通的Vulkan用戶prolly並不需要知道我認爲 – mjwach
我確定這不是關於HW本身。如果有的話,這對駕駛員如何處理事情會有些微妙的影響。 – krOoze
硬件線程調度可能包括基於寫地址的分片。分片將共享高速緩存,從而避免不使用高速緩存刷新的寫後寫操作(它只需要執行順序同步)。我不知道是否有任何硬件實際上實現了這種類型的分片。但Vulkan規範旨在將完全控制權應用於需要非常詳細的操作描述的應用程序,以同等支持所有類型的可能硬件。 –