2017-08-14 59 views
2

通過Vulkan barriers explained判斷,似乎每個vkCmdPipelineBarrier都引入了兩個後續管道「運行」之間的依賴關係。對於寫入圖像和着色器B中的樣品相同的圖像着色器A的典型情況下,它可能是這樣的:跨越多個着色器的流水線障礙?

  1. 調度着色器寫入圖像A
  2. vkCmdPipelineBarrier(cmd, VK_PIPELINE_STAGE_COLOR_ATTACHMENT_OUTPUT_BIT, VK_PIPELINE_STAGE_FRAGMENT_SHADER_BIT, ...);
  3. 調度着色器從圖像讀取A

這定義了從第一個着色器執行的顏色附件階段到第二個着色器執行的片段階段的依賴關係。但如果我想在兩者之間運行獨立命令,該怎麼辦?例如

  1. 調度着色器寫入圖像A
  2. 調度無關着色器不觸及圖像A
  3. vkCmdPipelineBarrier(cmd, VK_PIPELINE_STAGE_COLOR_ATTACHMENT_OUTPUT_BIT, VK_PIPELINE_STAGE_FRAGMENT_SHADER_BIT, ...);
  4. 調度着色器,從圖像A

這仍然讀但是效率不高:因爲片段着色器階段現在必須等待前一個,不相關的的顏色附件輸出階段着色器。如何在之前指定對着色器的依賴關係?

回答

2

您正在尋找活動。 https://vulkan.lunarg.com/doc/view/1.0.57.0/windows/vkspec.html#synchronization-events

事件是原始的同步可以被用來插入提交到相同的隊列之間,或主機和一個隊列中的命令之間的細粒度依賴性。事件有兩個狀態 - 有信號和無信號。應用程序可以在主機或設備上發出事件信號或無信號事件。在執行進一步的操作之前,設備可以等待事件發出信號。不存在等待主機發出事件信號的命令,但可以查詢事件的當前狀態。

當記錄命令緩衝區時,您在操作後通過vkCmdSetEvent發送事件信號。此後,可以使用vkCmdWaitEvents來定義先前事件信號操作與後續命令之間的存儲器依賴性。見https://vulkan.lunarg.com/doc/view/1.0.57.0/windows/vkspec.html#vkCmdWaitEvents

確保在通過vkCmdResetEvent再次使用之前重置該事件。並且注意:

應用程序在使用事件時應小心避免競態條件。在vkCmdResetEvent命令和後面提交的vkCmdWaitEvents命令之間沒有直接的順序保證,因此這些命令之間必須包含其他一些執行依賴關係(例如信號量)。

+0

謝謝。這似乎回答了我的問題,但不幸的是,它也讓我卡住了,因爲我不知道我是否會立即重新使用紋理,或者我是否會在以後的某個時間點重新使用它 - 所以我事先不知道我是否需要發出事件信號。所以我相信我會一直使用vmCmdPipeline並且效率低下。 – haasn

+0

據我所知,事件是一種更先進的信號量,因爲它們用於同步。另一方面,障礙定義了內存依賴性。所以我認爲在這種情況下使用事件會是一個矯枉過正的事情。重新排序操作不會在這裏幫助嗎?如果命令沒有觸及提到的圖像,是不是可以提前提交? – Ekzuzy

+1

事件輕而易舉。它不是信號量,也不是「先進的信號量」。閱讀文檔。 – ssteinberg