2017-03-22 23 views
0

情況:不同VkInstances之間的返回值vkEnumeratePhysicalDevices是否一致?

我有一個函數,確定是否有Vulkan支持的設備,並返回該設備,如果找到一個。如果找不到這樣的設備,它將返回一個空值,並且將使用遺留代碼路徑。

問題在於,因爲此功能在之前需要調用,所以應用程序使用Vulkan代碼路徑,它必須創建它自己的臨時文件VkInstance。該功能調用vkEnumeratePhysicalDevices來獲得VkPhysicalDevice,並使用vkGetPhysicalDeviceProperties來確定是否有合適的設備。因爲它綁定到VkInstance(這是暫時的,在函數返回之前將被破壞),所以代替該函數假定vkEnumeratePhysicalDevices將返回下返回該裝置的索引陣列中

VkPhysicalDevice本身不能返回當在不同的VkInstance上第二次調用同一個數組時。

問:

vkEnumeratePhysicalDevices保證使用兩種不同的VkInstances調用時返回相同的值?這假定應用程序的機器和實例相同。

回答

2

規範沒有提供這樣的保證。所以你的想法並不能保證可以工作。

最好讓您保持VkInstance左右,而不是僅爲設備枚舉的目的創建一個。因此,不是僅存儲索引,而是存儲VkPhysicalDevice和實例。如果它們爲空,那麼Vulkan不可用。

試圖使用pipelineCacheUUID不會工作,因爲規範不要求它唯一地識別一個設備:

用於識別兼容器件和驅動器組合使用時,串行化和去序列化管道狀態。

不能保證它不會在實例之間改變。但是,如果您有權訪問擴展VK_KHR_get_physical_device_properties2和VK_KHX_external_memory_capabilities,則可以從設備查詢VkPhysicalDeviceIDPropertiesKHX。這包括一個deviceUUID,它明確需要「跨越API和驅動程序邊界」來唯一標識特定設備。

+1

或者,他可以將'pipelineCacheUUID'存儲到特定設備的ID,而無需保持實例活着。 – krOoze

+0

實際上,對於相同**'VkInstance',有這樣的保證:「2.4.1。檢索結果的生存期」。 – krOoze

+0

@krOoze:實際上'pipelineCacheUUID'不起作用。我已經添加了解釋爲什麼不。 –