通過Vulkan barriers explained判斷,似乎每個vkCmdPipelineBarrier
都引入了兩個後續管道「運行」之間的依賴關係。對於寫入圖像和着色器B中的樣品相同的圖像着色器A的典型情況下,它可能是這樣的:跨越多個着色器的流水線障礙?
- 調度着色器寫入圖像A
vkCmdPipelineBarrier(cmd, VK_PIPELINE_STAGE_COLOR_ATTACHMENT_OUTPUT_BIT, VK_PIPELINE_STAGE_FRAGMENT_SHADER_BIT, ...);
- 調度着色器從圖像讀取A
這定義了從第一個着色器執行的顏色附件階段到第二個着色器執行的片段階段的依賴關係。但如果我想在兩者之間運行獨立命令,該怎麼辦?例如
- 調度着色器寫入圖像A
- 調度無關着色器不觸及圖像A
vkCmdPipelineBarrier(cmd, VK_PIPELINE_STAGE_COLOR_ATTACHMENT_OUTPUT_BIT, VK_PIPELINE_STAGE_FRAGMENT_SHADER_BIT, ...);
- 調度着色器,從圖像A
這仍然讀但是效率不高:因爲片段着色器階段現在必須等待前一個,不相關的的顏色附件輸出階段着色器。如何在之前指定對着色器的依賴關係?
謝謝。這似乎回答了我的問題,但不幸的是,它也讓我卡住了,因爲我不知道我是否會立即重新使用紋理,或者我是否會在以後的某個時間點重新使用它 - 所以我事先不知道我是否需要發出事件信號。所以我相信我會一直使用vmCmdPipeline並且效率低下。 – haasn
據我所知,事件是一種更先進的信號量,因爲它們用於同步。另一方面,障礙定義了內存依賴性。所以我認爲在這種情況下使用事件會是一個矯枉過正的事情。重新排序操作不會在這裏幫助嗎?如果命令沒有觸及提到的圖像,是不是可以提前提交? – Ekzuzy
事件輕而易舉。它不是信號量,也不是「先進的信號量」。閱讀文檔。 – ssteinberg