获取物理设备的功能和属性信息
我们编写的使用Vulkan的应用程序,可能会在许多种类的硬件平台上运行。这些硬件平台包括:台式计算机、笔记本和智能手机。这些硬件平台都拥有不同的配置,并且含有性能各不相同的图形硬件(显卡),更为重要的是,这些显卡的功能各不相同。一台计算机可能会安装一块以上的显卡。因此,为了找到满足我们需要的设备,实现我们编写到代码中的操作,不仅需要查明硬件平台上安装了多少设备,还需要在这些设备中选出合适的设备。因而,我们需要查明每个设备的功能。
具体处理过程
(1)通过调用vkEnumeratePhysicalDevices()
函数获取物理设备的句柄,将该句柄存储到VkPhysicalDevice类型的变量physical_device中。
(2)创建一个VkPhysicalDeviceFeatures类型的变量,将其命名为device_features。
(3)创建一个VkPhysicalDeviceProperties类型的变量,将其命名为device_properties。
(4)要获取指定物理设备拥有功能的清单,可调用vkGetPhysicalDeviceFeatures(physical_device,&device_features)
函数。将第一个参数设置为通过调用vkEnumeratePhysical Devices()函数获得的物理设备句柄;将第二个参数设置为指向device_features变量的指针。
(5)要获取指定物理设备的属性,可调用vkGetPhysicalDeviceProperties(physical_device,&device_properties)
函数。将第一个参数设置为物理设备的句柄,该句柄必须是之前通过调用vkEnumeratePhysicalDevices()
函数获得的;将第二个参数设置为指向device_properties变量的指针。
具体运行情况
下面是本例的实现代码。

这段代码虽然短小且简单,但可以获得许多图形硬件信息。只有依据这些信息,我们才能使用Vulkan执行操作。
VkPhysicalDeviceProperties类型的结构可以存储物理设备的常规信息,通过该结构我们可以检查设备的名称、驱动程序的版本和该设备支持的Vulkan版本,可以查明设备的类型,比如,它是集成显卡(集成到主板中的显示芯片)的,还是独立显卡的,或者由CPU来处理图形显示任务。通过该结构我们还可以了解指定硬件平台的限定条件,如创建图像(纹理)的最大尺寸、在着色器中使用多大的缓冲区,以及在执行绘图操作的过程中创建顶点数量的上限。
VkPhysicalDeviceFeatures结构可以存储具体硬件平台支持但不在Vulkan核心规范要求中的附加功能。这些功能包括几何和曲面细分着色器、深度固定和偏移(depth clamp and bias)、多视口(multiple viewports)和宽线(wide line)。图形硬件已经支持了这些功能许多年。然而,Vulkan是便携式的,且能够在多种硬件平台上获得支持。Vulkan不仅要在高端的台式计算机上运行,还要在高功效、低能耗的智能手机和专用便携电子设备上运行。这就是这些对性能有极高要求的功能没有入选Vulkan核心规范的原因。这样可以使驱动程序更具有灵活性,更为重要的是,可以提高用电效率和节省内存。
在使用物理设备功能时,还需要注意一点:与扩展类似,在默认情况下附加功能不是自动启用的,不能像使用核心功能那样使用附加功能。要使用物理设备的附加功能,必须在创建逻辑设备时以显式方式启用它们。在创建逻辑设备时,不应强求启用的物理设备支持全部功能,因为一旦物理设备没有支持某个功能,创建逻辑设备的操作就会执行失败。如果用户对某个功能感兴趣,就需要查明该功能是否可用,确认该功能可用后,应在创建逻辑设备的过程中以显式方式启用它。如果物理设备不支持该功能,就不能在该物理设备上使用该功能,因而需要寻找支持该功能的其他物理设备。
如果用户想要启用某个物理设备支持的全部功能,则只需要查明该物理设备上的可用功能,并在创建逻辑设备的过程中提供通过该检查操作获取的数据。

酷客网相关文章:
评论前必须登录!
注册