gpt4 book ai didi

c++ - vk::DeviceQueueCreateFlags() 实际上做了什么?

转载 作者:搜寻专家 更新时间:2023-10-31 00:51:23 26 4
gpt4 key购买 nike

初始化这个结构的类似 C 的方法是:

VkDeviceQueueCreateInfo queueCreateInfo = {};
queueCreateInfo.sType = VK_STRUCTURE_TYPE_DEVICE_QUEUE_CREATE_INFO;
queueCreateInfo.queueFamilyIndex = queueFamily;
queueCreateInfo.queueCount = 1;
queueCreateInfo.pQueuePriorities = &queuePriority;

使用和滥用 vulkan.hpp header 的 C++ 方式是:

vk::DeviceQueueCreateInfo deviceQueueCreateInfo(vk::DeviceQueueCreateFlags(), static_cast<uint32_t>(graphicsQueueFamilyIndex), 1, &queuePriority);

vk::DeviceQueueCreateFlags()函数中似乎封装了很多工作。

然而,用我的编辑器查看源代码并没有揭示任何有用的东西。我希望有更多经验的人可以提供一些有关该功能正在做什么的信息。

最佳答案

它是 vk::Flags 的别名,这是一个用于在类型安全庄园中处理 Vulkan 位域的模板。

你希望枚举是类型安全的;您不希望与整数之间进行隐式转换。所以在 C++ 中,您可以通过将枚举定义为 enum class 来实现。 .

这对于常规枚举来说很好。但是位域是特殊的;它们是来自特定枚举的枚举数的组合。典型的后 C++11 解决方案是只给枚举类型重载运算符,这样你就可以应用 &|枚举类型本身。

就我个人而言,这个解决方案总是让我感到不快。对我来说,强枚举类型应该包含 一个 枚举值,而不是其中的几个。因此,我不喜欢使用运算符重载来有效地允许枚举值说谎。

显然我并不孤单,因为 vulkan.hpp 的作者选择了不同的解决方案。他们创建了一个模板类 vk::Flags ,它有两个模板参数。其中之一是包含所有有效位标志的枚举。第二个参数是代表多个标志的连接的“枚举”。这是 vulkan.xml 规范文件实际理解的内容:包含可能位的字段与作为位聚合的字段之间的区别。

vk::Flags可以从位域中给定位,并且您可以通过一些按位运算符使用该位域中的位来操作它。并且它可以隐式转换为表示位聚合的类型。

所以 DeviceQueueCreateInfo只是 Flags<DeviceQueueCreateFlagBits, VkDeviceQueueCreateFlags> 的别名,这是一个位域,它获取设备创建位并将它们聚合到标志聚合中。

关于c++ - vk::DeviceQueueCreateFlags() 实际上做了什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55328943/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com