C++ Vulkan层可以在运行时更改吗?

C++ Vulkan层可以在运行时更改吗?,c++,c,graphics,runtime,vulkan,C++,C,Graphics,Runtime,Vulkan,所以我想制作一个库,使Vulkan编程更容易。你可以看到它在,但不要期待什么大的很快;)。我想创建一个名为getInstanceLayerProperties的函数,它返回所有图层属性(显然)。考虑到这可能会更慢,我想对其进行优化。我的想法很简单:将其存储为预先计算的数组。我需要知道的是:Vulkan层在运行时会发生变化吗。例如,假设我缓存了vkEnumerateInstanceLayerProperties的值。是否可以删除、添加或更改新的图层属性,以便再次调用该函数时得到不同的结果?首先,我

所以我想制作一个库,使Vulkan编程更容易。你可以看到它在,但不要期待什么大的很快;)。我想创建一个名为
getInstanceLayerProperties
的函数,它返回所有图层属性(显然)。考虑到这可能会更慢,我想对其进行优化。我的想法很简单:将其存储为预先计算的数组。我需要知道的是:Vulkan层在运行时会发生变化吗。例如,假设我缓存了
vkEnumerateInstanceLayerProperties
的值。是否可以删除、添加或更改新的图层属性,以便再次调用该函数时得到不同的结果?

首先,我要指出,这是一种不优化代码的完美方法。它不是,语义甚至不能成为热点。
除非销毁旧实例/设备并创建新实例/设备,否则您甚至无法使用缓存的信息

现在回答:

就规范而言,没有明确防止结果无效的语句

更新2:因此那些可能会在任何时候改变。虽然那是罕见的。唯一确定的结果是wheter
vkCreateInstance()
返回
VK_SUCCESS
VK_ERROR_LAYER_NOT_PRESENT

(实际上我有点不喜欢,实际上所有的
vkGet*
vkEnumerate*
命令都没有说明其结果不变性的性质。但后来我有点忘记了将其作为GitHub问题提出来……更新2:在我再次忘记之前,现在就这么做了)

实现方面的代码应该是开源的。这应该是官方“加载程序”的一部分(也是LunarG SDK的一部分)。我以后可能会调查。尽管可以合理地假设每次从注册表(即Windows上)读取新的层集。诚然,无论如何,这都是一些无用的信息,因为他们可能会决定改变这种行为

更新:我只是快速扫描了它,但实际上,似乎每次调用
vkEnumerateInstanceLayerProperties
,都会重新扫描层:

vkEnumerate*属性返回有关调用时系统状态的信息。在我们编写规范时,这对我们来说似乎很明显,但我可以看出,对于Vulkan的新手来说,这可能不那么明显


由于这些层是在Vulkan外部定义的,因此它们可以随时间变化。不太可能,但他们可以。这就是这些调用可以返回VK_complete的原因之一。典型的用法是首先调用以获取计数,为结果分配空间,然后获取数据。如果列表在这两次通话之间增加,应用程序将看到VK_不完整,并且知道发生了变化。

我认为您答案的第一部分是错误的。调用
vkEnumerateInstanceLayerProperties
以及
vkEnumerateInstanceExtensionProperties
完全独立于任何单个实例,并且在创建实例之前进行。这些函数的全部要点是看你是否能用这些特定的层/扩展创建一个实例!怎么会错呢?规范中是否有此类声明?永远不要声称任何关于“共同原因”/“期望他们应该如何表现”,或者你指的是“回答前”部分。只是说,没有什么需要优化的。每个实例/设备创建只应执行一次枚举。。。(当然是在创建之前)为什么要为每个实例创建调用一次?正如我之前所说,这两个函数独立于任何单个实例,这意味着层及其后续扩展世界在不同的创建中保持相同(假设层在运行时不发生更改)。因此,理想情况下,您只想给他们打一次电话,因为一旦您获得了信息,就不需要再次排队。(仍然假设图层不变)。我想问的是这个假设是否正确。另外,从您的编辑来看,似乎层属性在每次调用时都会排队。问题是,为什么要多次调用这些属性(因此需要对其进行合理的优化);;你的第二句话是重言式的(“不要改变,假设他们不改变”)——此外,依赖实例与此无关;;为了简化,理想情况下,您可以在组装中完成。这并不意味着它是合理的。在您的情况下,平均而言,您可以节省0个CPU来消耗一些内存。它甚至不重要,因为它不是热点命令;;在Windows上,层在注册表中枚举(指向一些json文件)。除非我把代码看错了,否则这些可能会改变。