检查可用实例扩展
译者注:示例代码点击此处
Vulkan Instance收集应用程序状态,并允许我们创建逻辑设备,几乎所有的操作都在该逻辑设备上执行。在创建实例对象之前,我们应该考虑要启用的实例级扩展。其中一个最重要的实例级扩展是交换链相关扩展,用于在屏幕上显示图像。
与OpenGL相反,Vulkan中的扩展是显式启用的。我们不能创建不支持的Vulkan实例和请求扩展,因为实例创建操作将失败。这就是为什么我们需要检查在给定硬件平台上到底支持哪些扩展的原因。
怎么做...
1.准备一个名为extensions_count的uint32_t类型变量。
2.调用vkEnumerateInstanceExtensionProperties( nullptr, &extensions_count, nullptr )。除了第二个参数之外,都应该设置nullptr为,第二个参数指向extensions_count变量。
3.如果函数调用成功,则将可用实例级扩展的总数存储在extensions_count变量中。
4.为扩展属性列表准备一个存储区,它的元素类型是VkExtensionProperties。最好的解决方案是使用一个std::vector容器,命名为available_extensions。
5.调整vector容器大小以至少能够储存extensions_count数量的元素。
6.调用vkEnumerateInstanceExtensionProperties(nullptr, &extensions_count, &available_extensions[0])。第一个参数再次设置为nullptr;第二个参数指向extensions_count变量;第三个参数指向由VkExtensionProperties类型extensions_count数量组成的数组。这里,在第三个参数使用的是available_extensions容器的第一个元素地址。
7.如果函数返回成功,available_extension容器将包含给定硬件平台上支持的所有扩展的列表。
这个怎么运作...
获取实例级扩展的代码可以分为两个阶段。首先,我们要得到可用扩展的总数如下:
uint32_t extensions_count = 0;
VkResult result = VK_SUCCESS;
result = vkEnumerateInstanceExtensionProperties( nullptr, &extensions_count, nullptr );
if( (result != VK_SUCCESS) || (extensions_count == 0) ) {
std::cout << "Could not get the number of Instance extensions." << std::endl;
return false;
}
当最后一个参数设置为nullptr时,vkEnumerateInstanceExtensionProperties()函数将可用扩展的数量存储在第二个参数指向的变量中。通过这种方式,我们就知道给定平台上有多少扩展,以及需要多少空间来存储所有扩展的参数。
当我们准备获取扩展属性时,可以再次调用相同的函数。这次,最后一个参数应该指向准备的空间(在本例中是VkExtensionProperties元素的数组或向量(std::vector)),在其中存储这些属性:
available_extensions.resize( extensions_count );
result = vkEnumerateInstanceExtensionProperties( nullptr, &extensions_count, &available_extensions[0] );
if( (result != VK_SUCCESS) || (extensions_count == 0) ) {
std::cout << "Could not enumerate Instance extensions." << std::endl;
return false;
}
return true;
提示:在Vulkan中这种调用相同函数的模式是常见的。这些函数当最后一个参数设置为nullptr时会查询返回的元素数量。当它们的最后一个元素指向一个适当的变量时,会返回数据本身。
现在有了该列表,我们可以查看它并检查我们想启用的扩展是否在给定平台上可用。