簡體   English   中英

為什么在開始繪制獲取的交換鏈圖像時不需要內存屏障?

[英]Why I don't need memory barriers when starting drawing on an acquired swapchain image?

我正在學習 Vulkan,在我不得不處理內存可見性之前,我在內存障礙方面的經驗非常好。

我覺得每次我開始使用資源進行閱讀時,我都必須使用內存屏障,而我之前在它上面寫過,反之亦然。 有點像如果內存上有一個狀態,說明它是用於寫入還是用於讀取。 我知道這樣做的理由與緩存管理有關,但在更高的層次上我是這么看的。

當我沒有看到內存障礙時,壞事就開始了,根據我的(很可能是錯誤的)理解,它們應該是。

例如,如果我想繪制一些東西並將其呈現在屏幕上,則沒有內存障礙可以從用於呈現(因此用於閱讀)的交換鏈圖像轉換為用於繪圖(從而用於書寫)的圖像. 當我完成繪制時,反向順序也沒有障礙。

在將登台主機可見緩沖區復制到設備本地緩沖區時,我看到了同樣的事情。 您在映射的內存中寫入一些內容,刷新它,然后開始在命令緩沖區中記錄副本,而不會對從主機可寫內存過渡到傳輸讀取內存設置任何障礙。 所以我想知道我誤解了什么,或者什么隱含的東西讓一切都開箱即用。

演示之間沒有障礙是非法的。 交換鏈圖像必須在VK_IMAGE_LAYOUT_PRESENT_SRC_KHR以進行展示。 當您的應用程序確實向圖像寫入內容時,它必須處於不同的布局。 實現這一點的唯一方法是使用類似屏障的原語。

寫入映射內存是一種罕見的例外。 對映射內存的寫入對任何后續vkQueueSubmit都是自動可見的。 請參閱規范的主機寫入順序保證章節。

為什么本教程沒有障礙是因為它涵蓋了您可能沒有達到的下一章中的同步。 他們通過子通道依賴來實現。 作為其中一部分的布局轉換在前面關於渲染通道的章節中有所展示。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM