枚举可用的物理设备
译者注:示例代码点击此处
Vulkan中的几乎所有工作都是在逻辑设备上执行的:我们在它们上创建资源,管理内存,记录从它们创建的命令缓冲区,并提交命令以便处理它们的队列。 在我们的应用程序中,逻辑设备代表启用了一组功能和扩展的物理设备。 要创建逻辑设备,需要选择给定硬件平台上一个可用的物理设备。可是我们如何知道给定计算机上有多少物理设备可用呢?着需要枚举它们。
怎么做...
1.获取之前创建的Vulkan Instance的句柄,是名为instance的VkInstance类型变量。
2.准备一个名为devices_count的uint32_t类型变量。
3.调用vkEnumeratePhysicalDevices(instance, &devices_count,nullptr)。第一个参数传入Vulkan Instance的句柄指针,第二个参数指向devices_count变量,还有第三个参数设置为nullptr。
4.如果函数调用成功,则devices_count变量将包含可用物理设备的总数。
5.准备储存物理设备的容器,最好的解决方案是使用类型为VkPhysicalDevice的std::vector类型的变量,称之为available_devices。
6.调整容器的大小以至少能够储存devices_count数量元素。
7.调用vkEnumeratePhysicalDevices(instance ,&devices_count,& available_devices[0])。第一个参数再次传入Vulkan Instance的句柄指针,第二个参数扔应指向extensions_count的变量,第三个参数质量VkPhysicalDevice类型数量为extensions_count的元素数组。这里提供的是available_devices的第一个元素的地址。
8.如果调用返回成功,则available_devices向量将包含安装在支持Vulkan API的给定硬件平台上的所有物理设备的列表。
这个怎么运作...
枚举可用物理设备操作分为两个阶段:首先,我们检查在任何给定硬件上有多少物理设备可用。这是通过调用vkEnumeratePhysicalDevices()函数来完成的,最后一个参数设置为nullptr,如下所示:
uint32_t devices_count = 0;
VkResult result = VK_SUCCESS;
result = vkEnumeratePhysicalDevices( instance, &devices_count, nullptr );
if( (result != VK_SUCCESS) || (devices_count == 0) ) {
std::cout << "Could not get the number of available physical devices." << std::endl;
return false;
}
这样,我们知道有多少物理设备支持Vulkan,以及需要存储多少个物理设备的句柄。当准备好足够的空间时,我们可以进入第二阶段,得到物理设备的实际手柄。这是通过调用相同的vkEnumeratePhysicalDevices()函数完成的,但是这一次,最后一个参数必须指向VkPhysicalDevice数组的元素:
available_devices.resize( devices_count );
result = vkEnumeratePhysicalDevices( instance, &devices_count, &available_devices[0] );
if( (result != VK_SUCCESS) || (devices_count == 0) ) {
std::cout << "Could not enumerate physical devices." << std::endl;
return false;
}
return true;
当调用成功,available_devices里会填充物理设备句柄。
现在有了物理设备列表,我们就可以查看每个设备的属性、检查我们可以对其执行的操作,以及查看它所支持的扩展。