原文链接:https://vulkan.lunarg.com/doc/sdk/1.2.131.2/windows/tutorial/html/02-enumerate_devices.html
列举Physical Device
这一章节的代码文件是 02-enumerate_devices.cpp。
示例程序中的下一步就是确定系统里存在的physical device。
在你创建完instance之后,loader就知道了有多少个Vulkan physical device可以使用,但是你的应用还不知道。应用通过向Vulkan API请求physical device列表来了解有多少设备可用。
如上图所示,physical device是和instance有关联的。
从Vulkan获取对象列表
在Vulkan里获取对象列表是很常见的操作,API里对这种操作有固定的模式。返回列表的API函数有count 和 pointer参数。count参数是一个integer指针,API可以设置它的值。步骤是:
- 以有效的integer指针作为count参数,以NULL作为pointer参数,调用该函数。
- API把列表里的对象数量填到count参数里。
- 应用为存储列表分配足够的内存空间。
- 以刚刚分配的内存空间指针为pointer参数,再次调用该函数。
在Vulkan API里你会经常看到这种模式。
vkEnumeratePhysicalDevices
函数
vkEnumeratePhysicalDevices函数返回的仅仅是系统里每一个physical device的句柄列表。physical device可能是插在台式机上的图形显卡,SoC上的某种GPU核心等等。如果存在多个可用的device,应用必须决定使用其中哪一个。
我们的示例代码列举了physical device,如下:
// 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变量是一个VkPhysicalDevice类型的vector,它是一个句柄。
所有这些要做的就是获取physical device句柄的列表。device程序,也就是教程中的下一节,会查询这些列表来决定使用哪一个device。
示例中的info结构体
你应该注意到了上述代码中info变量的使用。每一个示例程序中都使用全局info结构体变量来追踪Vulkan信息和应用状态。这有助于使用更加简洁的函数来调用执行本教程中涵盖的步骤。例如,enumerate程序中的这行代码:
`init_instance(info, "vulkansamples_enumerate");`
这里执行的是本教程中instance一节讨论的步骤。init_instance()创建了instance并且把句柄存在了info中。然后vkEnumeratePhysicalDevices()在调用里使用了info.inst。
现在你已经得到了device(GPU)的列表,是时候选择一个GPU并且创建一个Vukan logical device对象,好让你能在该GPU上开始工作。