类似于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()
中似乎封装了很多工作。
但是用我的编辑器浏览源代码并没有发现有用的东西。我希望有更多经验的人可以提供有关该功能执行情况的信息。
答案 0 :(得分:4)
它是vk::Flags
的别名,它是处理类型安全的庄园中Vulkan位域的模板。
您希望枚举类型安全;您不希望隐式转换为整数或从整数隐式转换。因此,在C ++中,您可以通过将枚举定义为enum class
来实现此目的。
这对于常规枚举很好。但是位域很特殊。它们是特定枚举的组合。 C ++ 11后的典型解决方案是只给枚举类型重载运算符,以便您可以将&
和|
应用于枚举类型本身。
就个人而言,这种解决方案总是以错误的方式给我摩擦。对我来说,强枚举类型应包含一个枚举值,而不是多个。因此,使用运算符重载来有效地允许枚举值处于撒谎状态对我来说并不理想。
显然我并不孤单,因为vulkan.hpp
的作者选择了其他解决方案。他们创建了一个模板类vk::Flags
,它使用两个模板参数。其中之一是包含所有有效位标志的枚举。第二个参数是“枚举”,表示多个标志的串联。 vulkan.xml规范文件实际上可以理解这一点:包含可能位的字段与包含位的字段之间的区别。
vk::Flags
位域中的位,并且可以通过一些按位运算符使用该位域中的位来对其进行操作。并且可以隐式转换为表示位聚合的类型。
所以DeviceQueueCreateInfo
只是Flags<DeviceQueueCreateFlagBits, VkDeviceQueueCreateFlags>
的别名,{bit}是一个位域,它占用设备创建位并将其聚集到标志聚集中。