Vulkan 层可以在运行时更改吗?
Can Vulkan Layers change at Runtime?
所以我想制作一个库来简化 Vulkan 编程。您可以在 Github 看到它,但不要指望很快会有什么大的 ;)。我想创建一个名为 getInstanceLayerProperties
的函数,其中 returns 所有图层属性(显然)。看到这可能会更慢,我想优化它。我的想法很简单:将它存储为一个预先计算好的数组。我只需要知道:Vulkan 层能否在运行时更改。例如,假设我缓存了 vkEnumerateInstanceLayerProperties
的值。是否可以删除、添加或更改新的图层属性,以便如果我再次调用该函数,我会得到不同的结果?
首先,我会注意到这是不优化代码的完美方式。它不是,在语义上什至不能成为热点。
你甚至不能使用缓存的信息,除非你销毁旧的 instance/device 并创建一个新的。
现在回答:
规范方面没有明确防止结果失效的语句。
更新2:因此可能随时更改。尽管那很少见。只有确定的结果是 vkCreateInstance()
returns VK_SUCCESS
或 VK_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
vkEnumerate*Properties return 有关调用时系统状态的信息。在我们编写规范时,这对我们来说似乎很明显,但我可以看出对于 Vulkan 新手来说这可能并不那么明显。
由于层是在 Vulkan 之外定义的,因此它们会随着时间而改变。不太可能,但他们可以。这就是这些调用可以 return VK_INCOMPLETE 的原因之一。一个典型的用途是首先调用以获取计数,为结果分配 space,然后获取数据。如果列表在这两个调用之间增长,应用程序会看到 VK_INCOMPLETE 并知道发生了一些变化。
所以我想制作一个库来简化 Vulkan 编程。您可以在 Github 看到它,但不要指望很快会有什么大的 ;)。我想创建一个名为 getInstanceLayerProperties
的函数,其中 returns 所有图层属性(显然)。看到这可能会更慢,我想优化它。我的想法很简单:将它存储为一个预先计算好的数组。我只需要知道:Vulkan 层能否在运行时更改。例如,假设我缓存了 vkEnumerateInstanceLayerProperties
的值。是否可以删除、添加或更改新的图层属性,以便如果我再次调用该函数,我会得到不同的结果?
首先,我会注意到这是不优化代码的完美方式。它不是,在语义上什至不能成为热点。
你甚至不能使用缓存的信息,除非你销毁旧的 instance/device 并创建一个新的。
现在回答:
规范方面没有明确防止结果失效的语句。
更新2:因此可能随时更改。尽管那很少见。只有确定的结果是 vkCreateInstance()
returns VK_SUCCESS
或 VK_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
vkEnumerate*Properties return 有关调用时系统状态的信息。在我们编写规范时,这对我们来说似乎很明显,但我可以看出对于 Vulkan 新手来说这可能并不那么明显。
由于层是在 Vulkan 之外定义的,因此它们会随着时间而改变。不太可能,但他们可以。这就是这些调用可以 return VK_INCOMPLETE 的原因之一。一个典型的用途是首先调用以获取计数,为结果分配 space,然后获取数据。如果列表在这两个调用之间增长,应用程序会看到 VK_INCOMPLETE 并知道发生了一些变化。