Vulkan列举物理设备

列举物理设备

这一节的代码文件是 02-enumerate_devices.cpp

示例程序的下一步是确定系统上的物理设备。

在您创建了一个实例之后,加载器知道有多少Vulkan物理设备可用,但是您的应用程序还不知道这一点。应用程序通过访问Vulkan API来获取一个有多少可用物理设备的列表。

这里写图片描述

物理设备与实例相关,如上图所示。

从Vulkan获取对象列表

获取对象列表是Vulkan中相当常见的操作,并且API有一个一致的模式。返回列表的API函数有count和指针参数。count参数是一个指向整数的指针,以便API能够设置它的值。步骤如下:

  1. 用一个指向整型的count参数和一个空指针来调用函数。
  2. API填充count值,表示列表中对象的数量。
  3. 应用分配足够的空间来存储列表。
  4. 应用再次调用这个函数,指针参数指向刚刚分配的空间。

你会在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

猜你喜欢

转载自blog.csdn.net/hccloud/article/details/81382774