代码之家  ›  专栏  ›  技术社区  ›  Makogan

vk::DeviceQueueCreateFlags()实际上做什么?

  •  0
  • Makogan  · 技术社区  · 7 年前

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

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

    C++方式,使用和滥用VurkAN。水电站总管,是:

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

    似乎很多工作都包含在函数中 vk::DeviceQueueCreateFlags() .

    然而,通过我的编辑查看源代码并没有透露任何有用的信息。我希望有更多经验的人能提供一些关于这个功能的信息。

    0 回复  |  直到 7 年前
        1
  •  4
  •   Nicol Bolas    7 年前

    这是我的别名 vk::Flags ,这是在类型安全庄园中处理Vulkan位字段的模板。

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

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

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

    显然,我不是唯一一个这样做的人,因为 vulkan.hpp 选择了不同的解决方案。他们创建了一个模板类 vk::标志 ,它接受两个模板参数。其中之一是包含所有有效位标志的枚举。第二个参数是“枚举”,表示 串联 由多个旗帜组成。这是vulkan。xml规范文件实际上理解:包含可能位的字段和位的聚合字段之间的区别。

    vk::标志 可以从位字段中给定位,您可以通过一些按位运算符使用该位字段中的位对其进行操作。它可以隐式转换为表示位聚合的类型。

    所以 DeviceQueueCreateInfo 只是一个化名 Flags<DeviceQueueCreateFlagBits, VkDeviceQueueCreateFlags> ,这是一个位字段,用于获取设备创建位并将其聚合到标志聚合中。