所以我想做一个库来让 Vulkan 编程更容易。你可以在Github上看到它,但不要指望很快会有什么大事 ;)。我想创建一个函数getInstanceLayerProperties
,它返回所有图层属性(显然)。看到这可能会更慢,我想优化它。我的想法很简单:将其存储为预先计算的数组。我只需要知道:Vulkan 层可以在运行时更改吗?例如,假设我缓存了vkEnumerateInstanceLayerProperties
. 是否可以删除、添加或更改新的图层属性,以便如果我再次调用该函数,我会得到不同的结果?
2 回答
vkEnumerate*Properties 返回有关系统状态的信息,因为它在调用时存在。在我们编写规范时,这对我们来说似乎很明显,但我可以看到这对于 Vulkan 的新手来说可能并不那么明显。
由于这些层是在 Vulkan 外部定义的,因此它们会随着时间而改变。不太可能,但他们可以。这就是这些调用可以返回 VK_INCOMPLETE 的原因之一。一个典型的用途是首先进行调用以获取计数,为结果分配空间,然后获取数据。如果列表在这两个调用之间增加,应用程序将看到 VK_INCOMPLETE 并知道发生了一些变化。
首先,我会注意到这是一种不优化代码的完美方式。它不是,在语义上甚至不能成为热点。
除非您销毁旧实例/设备并创建一个新实例/设备,否则您甚至无法使用缓存信息。
现在来回答:
具体而言,没有明确防止结果无效的语句。
UPDATE2:因此这些可能随时更改。尽管那将是罕见的。唯一确定的结果是vkCreateInstance()
返回VK_SUCCESS
或VK_ERROR_LAYER_NOT_PRESENT
。
(实际上我有点不喜欢,几乎所有命令vkGet*
都vkEnumerate*
没有说明其结果不变性的性质。但后来我有点忘记将其作为 GitHub 问题提出...... UPDATE2:现在就这样做了,在我再次忘记之前)
这样做的实现方式代码应该是开源的。这应该是官方“加载器”的一部分(也是 LunarG SDK 的一部分)。我以后可能会调查。尽管假设每次都从注册表中读取一组新层是合理的(即在 Windows 上)。诚然,这无论如何都是无用的信息,因为他们可能会决定改变这种行为。
更新:我只是快速扫描它,但实际上似乎在每次调用时重新扫描图层vkEnumerateInstanceLayerProperties
:
https ://github.com/KhronosGroup/Vulkan-LoaderAndValidationLayers/blob/74d013a5438f47a66a77d5375d1cdeef3f0beca7/loader/trampoline.c#L227