type
status
date
slug
summary
tags
icon
password
Vulkan必须要在GPU之下运行,所以在创建实例之后必须要选择一个GPU设备(PhysicalDevice)。
选择的这个显卡被存储到VkPhysicalDevice句柄里面。这个句柄在销毁VkInstance的时候隐式的销毁(意味着不需要在cleanup函数里面destroy Physical device
1、 首先是选择一个物理设备(创建Instance之后)
选择一个物理设备的前提是列出整个物理设备。列出的思想就是:执行一遍函数得到数量,然后再创建Vector得到所有显卡。
2、自我检查设备适用性
3、查找队列族(queue family)
Vulkan里面的很多操作都需要将Command提交到一个Queue里面来实现。有不同类型的队列来源于不同的Queue family,每个Queue family只允许部分commands。例如,可以有一个队列族,只允许处理计算commands或者只允许内存传输commands。

4、指定要创建的队列
上面一个步骤查询了哪些queue families可用,在这个步骤我们就需要指定创建哪些队列。首先第一个创建的信息就是VkDeviceQueueCreateInfo,这个结构体描述了我们想要的单个Queue family中的Queue数量。
此结构体中,需要关注的成员是最后三个:
queueFamilyIndex: 队列族的索引,传入mGraphicsQueueFamilyIndex
queueCount: 此队列族中创建队列的个数,前面提到过,队列族是功能相同队列的集合,目前只需要1个队列即可;
pQueuePriorities: 指向队列优先级的指针。优先级在0.0~1.0之间,优先级更高的队列会被更频繁地调度,目前设置为1.0即可。
5、创建逻辑设备
物理设备逻辑设备
逻辑设备和物理设备之间的关系

可以看出一个物理设备可以对应很多的逻辑设备
逻辑设备和队列之间的关系

每个逻辑设备里面也可以包含很多个Queues
可以看出物理设备和Queue之间的联系就是通过逻辑设备来交流的。

① 创建VkDeviceCreateInfo
sType设置为结构体的类型,pNext设置为nullptr, flags设置为0即可,和之前填充的结构体类似;
queueCreateInfoCount, pQueueCraeteInfos: 需要将一个VkDeviceQueueCreateInfo数组传给此结构体;(这个数组在上面选择队列的时候就已经弄好了)
enabledLayerCount, ppEnabledLayerNames: 将mRequiredLayers这个vector传给结构体;
enableExtensionCount, ppEnabledExtensionsNames: 将mRequiredExtensions这个vector传给结构体;
pEnabledFeatures: 表示应用程序需要哪些扩展,暂时将其设置为nullptr.
② 创建vkCreateDevice
名称 | 描述 |
physicalDevice | 物理设备的句柄 |
*pCreateInfo | 指向VkDeviceCreateInfo结构的指针 |
*pAllocator | 控制主机内存分配 |
*pDevice | 指向VkDevice句柄的指针 |
vkCreateDevice成功的结果是:VK_SUCCESS
③ 将设置好的逻辑设备、队列族、队列绑定在一起
队列随着逻辑设备的创建而自动创建,但是它俩之间没有任何的联系(也就是说我们现在要将队列和逻辑设备联系在一起->通过句柄进行联系)
此函数的第一个参数是逻辑设备device,第二个参数是队列族的索引,第三个参数是队列的索引(由于我们在队列族中只使用了一个队列,因此此处队列的索引传入0),最后一个参数返回相应的图形句柄
6、在函数里面销魂对象
- 作者:JucanaYu
- 链接:https://jucanayu.top/article/c3c53043-ee2e-4881-8bfa-25ed750bb876
- 声明:本文采用 CC BY-NC-SA 4.0 许可协议,转载请注明出处。