2016-07-10 67 views
2

所以我想創建一個庫來使Vulkan編程更容易。你可以在Github看到它,但不要期待很快有什麼大事;)。我想創建一個名爲getInstanceLayerProperties的函數,它返回所有的圖層屬性(顯然)。看到這可能會變慢,我想優化它。我的想法很簡單:將其存儲爲預先計算的數組。我需要知道的是:在運行期間,Vulkan圖層能否改變。例如,假設我緩存了vkEnumerateInstanceLayerProperties的值。可以刪除,添加或更改新圖層屬性,以便如果再次調用該函數,我會得到不同的結果?Vulkan圖層可以在運行時更改嗎?

回答

4

的vkEnumerate *屬性返回有關係統的狀態信息,因爲它存在在電話發出時。這對我們來說似乎很明顯,因爲我們正在編寫規範,但我可以看到對於Vulkan新手來說這可能不那麼明顯。

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

1

首先,我會注意到,這是一種不優化代碼的完美方式。它不是和語義上的,即使不能成爲熱點。
除非您銷燬舊的實例/設備並創建新的實例/設備,否則您甚至無法使用緩存的信息。

我們回答:

規格明智,沒有聲明,明確防止結果無效。

UPDATE2:因此,那些可能隨時更改。儘管這很少見。只有確定的結果是vkCreateInstance()返回VK_SUCCESSVK_ERROR_LAYER_NOT_PRESENT

(其實我還挺喜歡,實際上所有vkGet*vkEnumerate*命令沒有說明其結果的不變性的性質,但後來我有點忘了提高,作爲一個GitHub的問題... UPDATE2:沒有,現在,前我再次忘記)

執行方式的代碼應該是開源的。這應該是官方「The Loader」的一部分(也是LunarG SDK的一部分)。我可能會稍後調查。雖然每次從註冊表中讀取新的一組圖層是合理的(在Windows上,這是)。無可否認,無論如何這都是無用的信息,因爲他們可能會決定改變這種行爲。

更新:我只是掃描它只是很快,但實際上它似乎層上vkEnumerateInstanceLayerProperties的每個調用重新掃描: https://github.com/KhronosGroup/Vulkan-LoaderAndValidationLayers/blob/74d013a5438f47a66a77d5375d1cdeef3f0beca7/loader/trampoline.c#L227

+0

我認爲你的答案的第一部分是錯誤的。調用'vkEnumerateInstanceLayerProperties'和'vkEnumerateInstanceExtensionProperties'完全獨立於任何單個實例,並且在創建實例之前發生。這些功能的重點在於是否可以使用這些特定的圖層/擴展來創建實例! – Jerfov2

+0

這是怎麼回事?實際上在規範中是否有這樣的陳述?從未聲稱任何關於「常見原因」/他們應該*表現的期望, – krOoze

+0

或者您的意思是「回答前」部分。只是說,沒有什麼可以優化的。枚舉應該只在每個實例/設備創建時完成一次...(當然在**創建之前**) – krOoze

相關問題