初始化此结构的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的别名,enum class是用于处理类型安全的庄园中的Vulkan位域的模板。

您希望枚举是类型安全的;您不希望隐式转换为整数或从整数隐式转换。因此,在C++中,您可以通过将枚举定义为&来实现此目的。

对于常规枚举没问题。但是位域很特殊。它们是来自特定枚举的枚举数的组合。 C++ 11之后的典型解决方案是仅给枚举类型重载运算符,以便您可以将|vulkan.hpp应用于枚举类型本身。

就个人而言,这种解决方案总是使我误解。对我来说,强枚举类型应包含一个枚举值,而不是多个。因此,使用运算符重载有效地允许枚举值处于撒谎状态对我而言并不理想。

显然我并不孤单,因为vk::Flags的作者选择了其他解决方案。他们创建了一个模板类vk::Flags,它带有两个模板参数。其中之一是包含所有有效位标志的枚举。第二个参数是“枚举”,表示多个标志的串联。 vulkan.xml规范文件实际上可以理解这一点:包含可能位的字段与位的集合之间的差异。

可以给DeviceQueueCreateInfo位域中的位,您可以通过一些按位运算符使用该位域中的位来对其进行操作。它可以隐式转换为表示位聚合的类型。

因此,Flags<DeviceQueueCreateFlagBits, VkDeviceQueueCreateFlags>只是ojit_code的别名,ojit_code是一个位域,它占用设备创建位并将其聚集到标志聚合中。

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

10-10 16:57