Vulkan检查可用的设备扩展

检查可用的设备扩展
在使用某些Vulkan功能时,需要以显式方式启用特定的扩展(这与OpenGL相反,OpenGL会通过自动/隐式方式启用扩展)。扩展可分为两个等级:实例级和设备级。与实例级扩展类似,设备级扩展是在创建逻辑设备的过程中启用的。如果指定的物理设备不支持某个设备级扩展或者我们无法为该设备级扩展创建逻辑设备,就不能启用该设备级扩展。因此,在创建逻辑设备前,需要先确保指定的物理设备支持所有必要的扩展;否则,就需要寻找支持所有这些必要扩展的其他设备。

具体处理过程
(1)在vkEnumeratePhysicalDevices()函数的返回结果中,选择一个物理设备句柄,将其存储在一个VkPhysicalDevice类型的变量中,将该变量命名为physical_device。
(2)创建一个uint32_t类型的变量,将其命名为extensions_count。
(3)调用vkEnumerateDeviceExtensionProperties(physical_device,nullptr,&extensions_count,nullptr)函数。将第一个参数设置为指定硬件平台上可用物理设备的句柄:physical_device变量;将第二个和第四个参数设置为nullptr,将第三个参数设置为指向extensions_count变量的指针。
(4)如果这个函数调用操作成功完成了,extensions_count变量就会含有所有可用设备级扩展的数量。
(5)为扩展的属性列表准备存储空间,最佳解决方案是使用元素类型为VkExtensionProperties的std::vector容器。将存储std::vector容器的这个变量命名为available_extensions。
(6)调整std::vector容器的大小,使它含有的元素数量不小于extensions_count变量的值。
(7)调用vkEnumerateDeviceExtensionProperties(physical_device,nullptr,&extensions_count,&available_extensions[0])函数。但这次应将该函数的最后一个参数设置为VkExtensionProperties类型数组的第一个元素的指针,该数组必须拥有足够的空间,即拥有不小于extensions_count变量值数量的数组元素。本例将available_extensions变量存储的std::vector容器中第一个元素的指针,设置为该函数的最后一个参数。
(8)如果这个函数调用操作成功完成了,std::vector容器的available_extensions变量就会含有指定物理设备支持的所有扩展的属性(如名称和版本号等)。

具体运行情况
可以将获取物理设备支持的设备级扩展名单的处理过程划分为两个阶段,第一个阶段是查明指定的物理设备支持多少个扩展。通过将最后一个参数设置为nullptr调用vkEnumerateDeviceExtensionProperties()函数,可以做到这一点。

Vulkan检查可用的设备扩展

第二个阶段需要准备一个数组,使该数组含有足够数量的VkExtensionProperties类型数组元素。本例创建了一个vector容器变量并调整它的大小,使该容器能够容纳不小于extensions_count变量值数量的元素。在第二次调用vkEnumerateDeviceExtensionProperties()函数时,将该函数的最后一个参数设置为available_extensions变量存储的vector容器中第一个元素的地址。该函数调用操作成功完成后,available_extensions变量会被赋予指定物理设备支持的所有扩展的属性(如名称和版本号等)。

Vulkan检查可用的设备扩展
Vulkan检查可用的设备扩展


如前所述,我们又使用了两次调用同一个函数的处理模式:第一次调用该函数(将最后一个参数设置为nullptr),可以查明第二次调用该函数返回值中含有的元素数量;第二次调用该函数(将最后一个参数设置为指向VkExtensionProperties类型数组元素的指针),获取了必要数据(本例为物理设备支持扩展的属性)。通过检查这些数据,可以查明指定的物理设备是否支持我们感兴趣的扩展。

酷客网相关文章:

赞(0)

评论 抢沙发

评论前必须登录!

 

Vulkan实战