列举物理设备
这一节的代码文件是 02-enumerate_devices.cpp
示例程序的下一步是确定系统上的物理设备。
在您创建了一个实例之后,加载器知道有多少Vulkan物理设备可用,但是您的应用程序还不知道这一点。应用程序通过访问Vulkan API来获取一个有多少可用物理设备的列表。
物理设备与实例相关,如上图所示。
从Vulkan获取对象列表
获取对象列表是Vulkan中相当常见的操作,并且API有一个一致的模式。返回列表的API函数有count和指针参数。count参数是一个指向整数的指针,以便API能够设置它的值。步骤如下:
- 用一个指向整型的count参数和一个空指针来调用函数。
- API填充count值,表示列表中对象的数量。
- 应用分配足够的空间来存储列表。
- 应用再次调用这个函数,指针参数指向刚刚分配的空间。
你会在Vulkan API中经常看到这种模式。
vkEnumeratePhysicalDevices函数
vkEnumeratePhysicalDevices
函数只返回系统上每个物理设备的句柄列表。一个物理设备可能是一个图形卡,它可以插入到桌面计算机中,在SoC上的某种GPU核心,等等。如果有多个设备可用,应用程序必须决定它将使用哪一个。
代码如下:
// Get the number of devices (GPUs) available.
VkResult res = vkEnumeratePhysicalDevices(info.inst, &gpu_count, NULL);
// Allocate space and get the list of devices.
info.gpus.resize(gpu_count);
res = vkEnumeratePhysicalDevices(info.inst, &gpu_count, info.gpus.data());
请注意info.gpus
是一个vector,元素为 VkPhysicalDevice
。
所有的enumerate
都是获得物理设备句柄的列表。device
程序是这一进程的下一个步骤,它查看这个列表来决定使用哪一个设备。
info
结构体
你会注意到在上面的代码中使用了info
变量。每个示例程序使用全局info
结构变量来跟踪Vulkan信息和应用程序状态。这有助于使用更紧凑的函数调用来执行本教程中已经介绍过的步骤。例如,在enumerate
程序中看到代码行:
init_instance(info, "vulkansamples_enumerate");
它执行本教程的创建Vulkan实例
页面上讨论的步骤。init_instance()
创建实例并将句柄保存到 info
中。然后 vkEnumeratePhysicalDevices()
会将info.inst
用于调用vkEnumeratePhysicalDevices()
.
现在您已经拥有了设备列表(GPU),现在是时候选择GPU并创建一个Vulkan逻辑设备对象,这样你就可以开始使用GPU了。
© Copyright 2016 LunarG, Inc