Vulkan教程翻译之三 列举Physical Device

原文链接: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可以设置它的值。步骤是:

  1.  以有效的integer指针作为count参数,以NULL作为pointer参数,调用该函数。
  2.  API把列表里的对象数量填到count参数里。
  3.  应用为存储列表分配足够的内存空间。
  4.  以刚刚分配的内存空间指针为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上开始工作。

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值