【发布时间】:2018-06-15 22:40:37
【问题描述】:
Vulkan API 函数vkEnumerateInstanceExtensionProperties 包含一个计数地址和数组地址作为参数。对于这个问题,可以忽略第一个参数。函数签名如下:
VkResult vkEnumerateInstanceExtensionProperties(
const char* pLayerName,
uint32_t* pPropertyCount,
VkExtensionProperties* pProperties);
vkEnumerateInstanceExtensionProperties 的行为由文档(上面链接)定义:
如果pProperties 参数是nullptr,则pPropertyCount 参数设置为可用结构的数量。
否则,pPropertyCount 应该反映所传递的 pProperties 数组的大小,并且该数组将被填充。如果数组太小,则返回前pPropertyCount 项(并且函数返回错误代码)。
我想这是 C++(或至少在 Vulkan API 中)中的一种常见设计选择,否则我在使用 Vulkan 的最初几个小时内不会偶然发现它,所以我的问题(哪个我在下面问)可能可以更一般地回答,但也欢迎 Vulkan 特定的答案。
我想检索该函数提供的所有结构。
我(松散地)遵循的Vulkan tutorial 指定我应该使用以下“算法”来实现它:
- 检索元素计数第一次调用
- 分配一些数组或数据结构
- 第二次调用填充数组
在看起来像这样的代码中(本教程使用向量并传递它的保留数组):
uint32_t count = 0;
vkEnumerateInstanceExtensionProperties(nullptr, &count, nullptr); // only retrieve count
VkExtensionProperties* list = new VkExtensionProperties[count];
vkEnumerateInstanceExtensionProperties(nullptr, &count, list); // now populate the array
// after use
delete[] list;
但是,这需要调用 Vulkan API 函数两次。我觉得这不是 Vulkan API 设计者的意图。是否有更优化的方法来检索结构列表?
Vulkan documentation page 指出,如果 API 状态发生变化,连续调用之间可用结构的数量可能会有所不同。
【问题讨论】:
-
还有其他函数需要相同的方法 - 第一次调用填充第二次实际调用返回的元素数量。这是一个设计选择。但请注意,Vulkan-Hpp 是 Vulkan 的 C++ 包装器,它简化了这一点:第一个(也是唯一一个)调用返回一个填充的 std::vector。