Vulkan创建逻辑设备

使用几何着色器、图形和计算队列创建逻辑设备
使用Vulkan创建各种对象时,需要使用许多不同类型的结构描述创建过程,而且在创建结构时可能还需要创建其他对象。
我们需要确认物理设备、检查物理设备的属性和它们支持哪些队列家族,并创建VkDeviceCreateInfo结构,创建该结构时需要更多的信息。
为了展示组织这些操作的方式,我们会使用一个支持几何着色器、图形和计算队列的物理设备,创建一个逻辑设备。
具体处理过程
(1)创建一个VkDevice类型的变量,将其命名为logical_device。
(2)创建两个VkQueue类型的变量,将它们分别命名为graphics_queue和compute_queue。
(3)创建一个std::vector<VkPhysicalDevice>类型的变量,将其命名为physical_devices。
(4)获取指定硬件平台上所有可用物理设备的名单,将该名单存储在vector容器变量physical_devices中。
(5)为每个physical_devices变量中存储的物理设备执行下列操作。
① 创建一个VkPhysicalDeviceFeatures类型的变量,将其命名为device_features。
② 获取指定物理设备支持功能的名单,将该名单存储在device_features变量中。
③ 查明device_features变量中geometryShader成员的值是否等于VK_TRUE(该值是否不等于0)。如果该值等于VK_TRUE,就重置device_features变量中的其他成员(将这些成员的值设置为0);如果该值不等于VK_TRUE,就处理另一个物理设备。
(6)创建两个uint32_t类型的变量,将它们分别命名为graphics_queue_family_index和compute_queue_family_index。
(7)获取支持图形和计算操作的队列家族的索引,将它们分别存储在graphics_queue_family_index和compute_queue_family_index变量中(请参阅“根据功能选择队列家族的索引”小节)。如果这些图形和计算操作中的任意一个没有得到队列家族的支持,就应查找另一个物理设备。
(8)创建std::vector容器类型的变量,将该容器中元素的类型设置为QueueInfo(请参阅“创建逻辑设备”小节),将该容器变量命名为requested_queues。
(9)使用requested_queues变量存储graphics_queue_family_index变量的值和值为浮点型1.0的单元素vector容器floats。如果compute_queue_family_index变量的值不等于graphics_queue_family_index变量的值,就使用compute_queue_family_index变量和值为浮点型1.0的单元素vector容器floats,在vector容器requested_queues变量中添加另一个元素。
(10)使用physical_device、requested_queues、device_features和logical_device变量,创建一个逻辑设备(请参阅“创建逻辑设备”小节)。如果函数调用操作失败了,就选择另一个物理设备重复执行上述处理步骤。
(11)如果成功创建逻辑设备,就加载设备级函数(请参阅“加载设备级函数”小节)。获取与graphics_queue_family_index变量所存储的索引对应的家族中队列的句柄,将该句柄存储在graphics_queue变量中。从与compute_queue_family_index变量所存储的索引对应的家族中获取队列,将该队列存储在compute_queue变量中。

具体运行情况
在创建逻辑设备前,需要获取指定计算机中所有可用物理设备的句柄。

Vulkan创建逻辑设备
还需要循环遍历所有可用的物理设备,获取每个可用物理设备的功能。通过这些信息我们可以了解到,可用物理设备是否支持几何着色器。

Vulkan创建逻辑设备
Vulkan创建逻辑设备


如果该物理设备支持几何着色器,就可以重置该物理设备拥有功能名单中的其他成员。在创建逻辑设备时会用到这份名单,但是我们不想启用该物理设备的其他功能。在本例中,几何着色器是我们唯一想要使用的附加功能。
应查明指定的物理设备提供了哪些支持图形和计算操作的队列家族。一个物理设备可能仅会提供一两个家族,我们获取了这些队列家族的索引。

Vulkan创建逻辑设备
创建一个队列家族列表,我们将通过该列表获取队列。为来自不同家族的每个队列赋予属性。

Vulkan创建逻辑设备
如果图形和计算队列家族含有相同的索引,就只需要从这两个队列家族其中之一获取一个队列。如果图形和计算队列家族的索引不同,就需要获取两个队列,一个队列来自图形队列家族,另一个队列来自计算队列家族。
必要的数据都准备好后,就可以创建逻辑设备了。成功创建了逻辑设备后,就可以加载设备级函数并获取必要队列的句柄。

Vulkan创建逻辑设备

酷客网相关文章:

赞(0)

评论 抢沙发

评论前必须登录!

 

Vulkan实战