【问题标题】:What does vk::DeviceQueueCreateFlags() actually do?vk::DeviceQueueCreateFlags() 实际上做了什么?
【发布时间】:2019-08-15 04:06:57
【问题描述】:

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

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

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

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

好像很多工作都封装在vk::DeviceQueueCreateFlags()这个函数里了。

但是,使用我的编辑器查看源代码并没有发现任何有用的信息。我希望有更多经验的人可以提供一些关于该功能正在做什么的信息。

【问题讨论】:

  • 由于vk::DeviceQueueCreateInfo ctor 总是将标志类型作为第一个字段,您可以通过将一组空标志表示为{} 而不是vk::DeviceQueueCreateFlags() 之类的东西来减少样板文件

标签: c++ graphics gpu vulkan


【解决方案1】:

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

您希望枚举是类型安全的;您不希望与整数进行隐式转换。因此,在 C++ 中,您可以通过将枚举定义为 enum class 来做到这一点。

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

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

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

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

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

【讨论】:

    猜你喜欢
    • 2013-06-02
    • 2020-11-21
    • 2015-02-26
    • 2017-06-29
    • 2013-06-13
    • 2021-10-25
    • 2011-08-12
    • 1970-01-01
    • 2010-11-27
    相关资源
    最近更新 更多