Vulkan 设备和队列的整合
前面在应用程序层面实现创建设备和队列的完整代码。我们会通过每个步骤的介绍来了解信息流的整个过程。
首先,我们要通过函数enumeratePhysicalDevices()
枚举系统中的所有物理设备,并保存到向量gpuList中。为了简化流程,我们假设系统中只有一个GPU(它对应于gpuList中的第一个元素)。然后,我们尝试使用handShakeWithDevice()函数来连接设备:
用户函数VulkanApplication::enumeratePhysicalDevices()
会使用vkEnumeratePhysicalDevices来获取板载物理设备(VKPhysicalDevice)的数量。应用程序假设系统中必然存在至少一个可用的GPU。之后,它需要分配可用的内存空间,传入GPU的数量,然后再次执行同一个函数(vkEnumeratePhysicalDevices)将获得的信息保存到向量组中,得到所需的物理设备对象:
VulkanApplication::handShakeWithDevice()
负责创建逻辑设备对象以及相关联的队列。它还负责执行一些初始化工作,以便后续应用程序开发时使用,例如获取物理设备的属性、内存属性等。这个函数的语法如下:
函数的参数说明如表所示:
函数VulkanApplication::handShakeWithDevice()
的内部执行流程如下所示:
- 使用VulkanDevice对象查询当前物理设备对应的扩展。获取的扩展信息也可以用来交叉检查应用程序之前请求的扩展是否是设备支持的。
- 使用函数vkGetPhysicalDeviceProperties()获取物理设备的属性,并保存到类型为VulkanDevice的本地数据结构体(gpuProps),稍后使用。
- 获取物理设备的内存信息以及对应的属性,此处需要调用vkGetPhysicalDeviceMem-oryProperties()函数。
- 查询当前物理设备所支持的所有队列族,对应的函数是VulkanDevice类的getPhysi-calDeviceQueuesAndProperties()。获取的属性信息保存下来稍后使用。
- 遍历所有的队列并判断它们是否支持图形操作。我们使用函数getGraphicsQueue-Handle()来完成这一功能;这个函数会返回所需队列的索引号/句柄,从而实现图形操作的支持。
- 最后,
VulkanDevice::createDevice()
函数负责创建物理设备所对应的逻辑设备对象。这个函数使用图形队列句柄来创建逻辑设备所关联的图形队列。此外,这个函数还可以接受一个扩展的名字列表,从而在物理设备端启用某些扩展功能:
酷客网相关文章:
评论前必须登录!
注册