簡體   English   中英

Vulkan層可以在運行時更改嗎?

[英]Can Vulkan Layers change at Runtime?

所以我想建立一個庫來簡化Vulkan編程。 您可以在Github上看到它,但不要指望很快有大的事情;)。 我想創建一個名為getInstanceLayerProperties的函數,該函數返回所有圖層屬性(顯然)。 看到這可能會比較慢,所以我想對其進行優化。 我的想法很簡單:將其存儲為預先計算的數組。 我需要知道的是:Vulkan層是否可以在運行時更改。 例如,說我緩存了vkEnumerateInstanceLayerProperties的值。 是否可以刪除,添加或更改新的圖層屬性,以便再次調用該函數會得到不同的結果?

vkEnumerate * Properties返回有關系統狀態的信息,該狀態在進行調用時就存在。 在我們編寫規范時,這對我們來說似乎很明顯,但是我可以看到,對於Vulkan的新手來說,這可能並不那么明顯。

由於圖層是在Vulkan之外定義的,因此它們會隨着時間變化。 不太可能,但是可以。 這就是這些調用可以返回VK_INCOMPLETE的原因之一。 典型的用法是先進行調用以獲取計數,為結果分配空間,然后獲取數據。 如果列表在這兩個調用之間增加,則該應用程序將看到VK_INCOMPLETE並知道發生了一些變化。

首先,我要指出,這是不優化代碼的完美方法。 從語義上講,它不是熱點,甚至也不能成為熱點。
除非銷毀舊實例/設備並創建新實例/設備,否則您甚至無法利用緩存的信息。

現在回答:

規范方面,沒有明確禁止結果無效的語句。

UPDATE2:因此,這些內容可能隨時更改。 雖然那是罕見的。 只有最終的結果是vkCreateInstance()返回VK_SUCCESSVK_ERROR_LAYER_NOT_PRESENT

(實際上,我有點不喜歡,幾乎所有的vkGet*vkEnumerate*命令都沒有說明其結果不變性的性質。但是后來我有點忘了把它作為GitHub Issue ... UPDATE2提出來了,現在這樣做了,在我忘記之前再次)

這樣做的實現方式代碼應該是開源的。 這應該是官方“ The Loader”的一部分(也是LunarG SDK的一部分)。 我可能稍后再調查。 盡管可以合理地假設每次都從注冊表中讀取新的一組圖層(在Windows中)。 誠然,無論如何這都是些無用的信息,因為他們可能決定改變這種行為。

更新:我只是很快地掃描了它,但實際上似乎在每次調用vkEnumerateInstanceLayerProperties都重新掃描了這些層: https : //github.com/KhronosGroup/Vulkan-LoaderAndValidationLayers/blob/74d013a5438f47a66a77d5375d1cdeef3f0beca7/loader/trader/travel

暫無
暫無

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

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