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。
notion image

4、指定要创建的队列

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

5、创建逻辑设备

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

创建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、在函数里面销魂对象

窗口表面交换链验证层
Loading...
JucanaYu
JucanaYu
干饭人,干饭魂🍚
最新发布
Python练习-类型转换
2025-4-9
Python练习-count、remove、append、extend
2025-4-8
Python练习-set和sorted
2025-4-6
Python练习-insert和del
2025-4-6
Python练习-range
2025-4-6
Python练习-双指针法
2025-4-6