检查可用的设备扩展
译者注:示例代码点击此处
我们想要使用的一些Vulkan功能要求我们明确启用某些扩展(与OpenGL相反,其中扩展是自动/隐式启用的)。 扩展有两种或两种级别:实例级和设备级。 与实例扩展类似,在逻辑设备创建期间启用设备扩展。 如果某个物理设备不支持设备扩展,或者我们无法为其创建逻辑设备,则不能要求设备扩展。 因此,在我们开始创建逻辑设备之前,我们需要确保给定物理设备支持所有请求的扩展,或者我们需要搜索另一个支持它们的设备。
怎么做...
1.获取vkEnumeratePhysicalDevices()返回的一个VkPhysicalDevice类型的值并赋值给physical_device变量。
2.准备一个名为extensions_count的uint32_t类型的变量。
3.调用vkEnumerateDeviceExtensionProperties(physical_device, nullptr, &extensions_count, nullptr)。第一个参数为给定硬件平台上可用的物理设备的句柄:physical_device变量。第二个和最后一个参数给nullptr,第三个参数指向extensions_count变量。
4.如果函数返回成功,则extensions_count变量里储存可用设备级别扩展的数量。
5.准备个容器储存扩展属性列表,最好的解决方案是使用类型为VkExtensionProperties的std::vector类型变量,名称为available_extensions。
6.设置available_extensions容器元素数量不少于extensions_count。
7.调用vkEnumerateDeviceExtensionProperties(physical_device, nullptr, &extensions_count, &available_extensions[0])。但是,这次使用指向数组的第一个元素指针替换最后一个参数,其中元素的类型为VkExtensionProperties。次数组必须具有足够的空间以至少包含extensions_count数量的元素。在这里提供指向available_extensions变量的第一个元素的指针。
8.如果函数返回成功,则available_extensions向量里存储了物理设备支持的全部的扩展。
这个怎么运作...
获取支持的设备级扩展列表的过程可分为两个阶段:首先,我们检查给定物理设备支持的扩展数量。 这是通过调用名为vkEnumerateDeviceExtensionProperties()的函数并将其最后一个参数设置为nullptr来完成的,如下所示:
uint32_t extensions_count = 0;
VkResult result = VK_SUCCESS;
result = vkEnumerateDeviceExtensionProperties( physical_device, nullptr, &extensions_count, nullptr );
if( (result != VK_SUCCESS) || (extensions_count == 0) ) {
std::cout << "Could not get the number of device extensions." << std::endl;
return false;
}
其次,我们需要准备一个能够储存类型为VkExtensionProperties的元素数组。在该实例中,创建一个向量变量并调整其大小,使其具有extensions_count个数量。在第二次vkEnumerateDeviceExtensionProperties()函数调用中,我们提供了available_extensions变量的第一个元素的地址。当调用返回成功时,available_extensions将被填充给定物理设备支持的所有扩展属性(名称和版本)。
available_extensions.resize( extensions_count );
result = vkEnumerateDeviceExtensionProperties( physical_device, nullptr, &extensions_count, &available_extensions[0] );
if( (result != VK_SUCCESS) || (extensions_count == 0) ) {
std::cout << "Could not enumerate device extensions." << std::endl;
return false;
}
return true;
再一次,我们可以看到两次调用相同的函数的模式:第一次调用(最后一个参数为nullptr)获取我们第二次调用的元素数量。第二次调用(最后一个参数指向VkExtensionProperties元素的数组)返回请求的数据,在本例中为设备扩展,我们可以迭代并检查我们感兴趣的扩展是否在给定的物理设备上可用。