可用扩展名和图层的列表如何更改



如果在创建实例时启用的层或扩展不可用,则vkCreateInstance返回VK_ERROR_EXTENSION_NOT_PRESENTVK_ERROR_LAYER_NOT_PRESENT。我想确定不支持层或扩展的,以提供更好的错误消息。CCD_ 4和CCD_。

然而,根据规范,可用扩展和层的列表可以随时更改。我目前的理解是,这个列表可以在Vulkan实现之外进行更改,而不是由实现本身进行更改。

这是正确的吗?可用图层和扩展名的列表如何更改?这有可能发生吗?我真的可以依靠vkEnumerateInstanceExtensionPropertiesvkEnumerateInstanceLayerProperties来提供有用的输出吗?

提前感谢!


因为在调用vkEnumerateInstanceExtensionProperties之间,可用层的列表可能会在外部发生变化,如果pLayerName在一个调用中可用,但在另一个调用不可用,则两个调用可能会检索到不同的结果一个层支持的扩展也可能在两个调用之间发生变化,例如,如果在这些调用之间用不同的版本替换了层实现。

vkEnumerateInstanceExtensionProperties手动页面

由于Vulkan实现之外的操作,可用层的列表可能随时更改,因此使用相同参数对vkEnumerateInstanceLayerProperties的两次调用可能会返回不同的结果,或者检索不同的pPropertyCount值或pProperties内容。一旦创建了实例,为该实例启用的层将在该实例的生命周期内继续启用并有效,即使其中一些层对未来的实例不可用。

vkEnumerateInstanceLayerProperties手动页面

可用层和扩展的列表具体如何更改?这有可能发生吗?

用户可以安装新的驱动程序。或者更具体地说,可以在这两个调用之间更新驱动程序。用户还可以修改驱动程序中的设置来更改这些内容。用户可能会安装其他层。

规范的要点是:在您的应用程序中,在询问哪些扩展/层可用和要求创建实例之间有一段时间。实现是一个共享资源,并且您运行的系统是多进程的。不存在";互斥";或类似的锁定机制,以防止应用程序外部的东西在请求和请求实例之间修改驱动程序。因此,无论多么微小,在提出问题和创建一个使您的请求无效的实例之间,总会有一些事情发生变化。

报告特定层/扩展的错误在这里并不是特别有用,因为用户可能无法实际处理这些信息。这并不是说你告诉他们扩展名VK_没有找到的都是有助于他们解决问题的信息。它甚至不会帮助解决问题,因为你仍然不知道为什么VK_Whatever最初被宣传,但后来不可用。

最好的办法是再次尝试整个实例创建过程,包括重新查询可用层。您甚至可能希望在两次尝试之间等待一两秒钟。如果这还不能解决问题,那么系统中正在发生一些不愉快的事情,所以只需终止程序即可。

我真的可以依靠vkEnumerateInstanceExtensionPropertiesvkEnumerateInstanceLayerProperties来提供有用的输出吗?

尽可能有用。基本上,规范只是承认了现实:用户拥有他们的计算机,而不是你的应用程序,所以理论上他们可以做一些会给你的程序带来问题的事情。

尽你所能去处理它。

最新更新