情况:
我有一个函数可以确定是否存在Vulkan支持的设备并返回该设备(如果找到)。如果没有找到这样的设备,它将返回一个空值,并将使用遗留代码路径。
问题是,因为在应用程序使用Vulkan代码路径之前需要在中调用此函数,所以它必须创建它自己的临时VkInstance
。该函数调用vkEnumeratePhysicalDevices
来获取VkPhysicalDevice
,并使用vkGetPhysicalDeviceProperties
来确定是否有合适的设备。
VkPhysicalDevice
本身无法返回,因为它绑定到VkInstance
(这是临时的并且会在函数返回之前被销毁),所以相反函数会返回索引。数组中的设备假设vkEnumeratePhysicalDevices
将在另一个VkInstance
上第二次调用时返回相同的数组。
问题:
使用两个不同的vkEnumeratePhysicalDevices
调用VkInstances
时保证返回相同的值吗?这假定了相同的机器和相同的应用程序实例。
答案 0 :(得分:2)
规范没有提供此类保证。因此,您的想法并不能保证完全正常工作。
最好保留VkInstance
,而不是仅仅为了设备枚举而创建一个。{1}}。因此,不存储索引,而是存储VkPhysicalDevice
和实例。如果他们为空,那么Vulkan就无法使用。
尝试使用pipelineCacheUUID
也不会起作用,因为规范不要求它唯一地标识设备:
用于标识在序列化和反序列化管道状态时使用的兼容设备和驱动程序组合。
不保证它不会在实例之间发生变化。但是,如果您可以访问扩展VK_KHR_get_physical_device_properties2和VK_KHX_external_memory_capabilities,则可以从设备查询VkPhysicalDeviceIDPropertiesKHX
。这包括deviceUUID
,明确要求唯一标识特定设备,跨越API和驱动程序边界"。