所以我想创建一个库来使Vulkan编程更容易。你可以在Github看到它,但不要期待任何大的事情;)。我想创建一个名为getInstanceLayerProperties
的函数,它返回所有图层属性(显然)。看到这可能会变慢,我想优化它。我的想法很简单:将其存储为预先计算的数组。我需要知道的是:Vulkan层可以在运行时更改。例如,假设我缓存了vkEnumerateInstanceLayerProperties
的值。可以删除,添加或更改新的图层属性,这样如果我再次调用该函数,我会得到不同的结果吗?
答案 0 :(得分:4)
vkEnumerate * Properties返回有关系统状态的信息,因为它在调用时存在。在我们撰写规范时,对我们来说这似乎是显而易见的,但我可以看到对于Vulkan的新手来说,这可能不那么明显。
由于图层是在Vulkan之外定义的,因此它们可以随时间变化。不太可能,但他们可以。这是这些调用可以返回VK_INCOMPLETE的原因之一。典型的用法是首先进行调用以获取计数,为结果分配空间然后获取数据。如果列表在这两个调用之间增长,应用程序将看到VK_INCOMPLETE并知道某些内容发生了变化。
答案 1 :(得分:1)
首先,我要注意,这是一种不优化代码的完美方式。它不是和语义甚至不能成为一个热点 除非您销毁旧的实例/设备并创建新的实例/设备,否则您甚至无法使用缓存的信息。
现在回答:
规范地说,没有明确阻止结果失效的陈述。
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