Vulkan检查可用的实例扩展

检查可用的实例扩展
Vulkan实例能够收集每个应用程序的状态信息,使我们得以创建几乎可执行所有操作的逻辑设备。在创建实例前,应该考虑启用哪些实例级扩展。典型的最重要的一种实例级扩展是与交换链(swapchain)有关的扩展,这种扩展用于显示图像。

与OpenGL相比,Vulkan中的扩展必须以明确的方式启用。我们无法创建没有扩展为其提供支持的Vulkan实例,因为创建这种实例的操作会失败。这就是我们需要查明指定的硬件平台支持哪些扩展的原因。

具体处理过程
(1)在应用程序的源代码中创建一个uint32_t类型的变量,将其命名为extensions_count。
(2)调用vkEnumerateInstanceExtensionProperties(nullptr,&extensions_count,nullptr)函数。除第二个参数(该参数为extensions_count变量的地址,用于指向extensions_count变量)外,应该将所有参数的值都设置为nullptr。
&是C语言中的取地址符号,如创建了一个变量a,&a代表指向变量a的指针,即变量a的地址。
(3)如果函数调用操作成功完成,那么可用实例级扩展的总数会被存储在extensions_count变量中。
(4)创建一个vkExtensionProperties类型的存储结构,使用该结构存储扩展的属性。最佳解决方案是使用std::vector容器,将该容器命名为available_extensions。vector容器是C++标准库(由标准类库和标准函数库构成)中的标准类。
(5)调整vector容器available_extensions的大小,使之能够容纳不小于extensions_count变量值数量的扩展数据(如扩展的名称、版本号等)。
(6)调用vkEnumerateInstanceExtensionProperties(nullptr,&extensions_count,&available_extensions[0])函数。将第一个参数设置为nullptr;将第二个参数设置为extensions_count变量的地址;将第三个参数设置为元素类型为VkExtensionProperties的数组,且该数组中元素的个数应不小于extensions_count变量的值。本例将第三个参数设置为vector容器available_extensions的第一个元素的地址。
(7)如果该函数调用操作成功完成,那么vector容器available_extensions中会含有指定硬件平台支持的所有扩展的名单。

具体运行情况
可以将用于获取实例级扩展的代码分成两个部分。先获取可用扩展的总数。

检查可用的实例扩展
当在将最后一个参数设置为nullptr的情况下调用vkEnumerateInstanceExtensionProperties()函数时,该函数会将可用扩展的数量存储在第二个参数指向的变量中。这样我们就能够了解指定硬件平台支持多少个扩展,以及需要使用多少空间存储这些扩展的参数。
完成获取扩展属性的准备工作后,就可以再次调用同一个函数。在执行这次调用操作时,应将最后一个参数设置为指向准备好的空间[一个数组元素类型为VkExtensionProperties的数组或vector容器(如本例)]的地址,扩展的属性会被存储到该空间中。

检查可用的实例扩展
TIP在使用Vulkan时,调用同一个函数两次的处理方式很常见。多个Vulkan函数会在将最后一个参数设置为nullptr时,将查询操作返回的元素数量保存起来。当将它们的最后一个参数指向合适的变量时,它们就会返回元素本身。

现在我们已经获得了可用设备名单,因而可以仔细查看该名单,查明指定硬件平台上是否有我们想要启用的扩展。

酷客网相关文章:

赞(0)

评论 抢沙发

评论前必须登录!

 

Vulkan实战