了解 Vulkan 中的标志

Understanding flags in Vulkan

在尝试在 Vulkan 中设置调试回调时,我注意到 LunarG SDK 验证层有些奇怪。

在设置创建信息结构时,我执行以下操作:

VkDebugUtilsMessengerCreateInfoEXT debugCreateInfo;
debugCreateInfo.sType = VK_STRUCTURE_TYPE_DEBUG_UTILS_MESSENGER_CREATE_INFO_EXT;
debugCreateInfo.messageSeverity = VK_DEBUG_UTILS_MESSAGE_SEVERITY_VERBOSE_BIT_EXT | VK_DEBUG_UTILS_MESSAGE_SEVERITY_WARNING_BIT_EXT | VK_DEBUG_UTILS_MESSAGE_SEVERITY_ERROR_BIT_EXT;
debugCreateInfo.messageType = VK_DEBUG_UTILS_MESSAGE_TYPE_GENERAL_BIT_EXT | VK_DEBUG_UTILS_MESSAGE_TYPE_VALIDATION_BIT_EXT | VK_DEBUG_UTILS_MESSAGE_TYPE_PERFORMANCE_BIT_EXT;
debugCreateInfo.pfnUserCallback = debugCallback;

一切正常,但是当我 运行 应用程序时,我收到以下消息:

VUID-VkDebugUtilsMessengerCreateInfoEXT-flags-zerobitmask(ERROR / SPEC): msgNum: 1138790405 - vkCreateDebugUtilsMessengerEXT: parameter pCreateInfo->flags must be 0. The spec valid usage text states 'flags must be 0' (https://www.khronos.org/registry/vulkan/specs/1.0-extensions/html/vkspec.html#VUID-VkDebugUtilsMessengerCreateInfoEXT-flags-zerobitmask)

我不太理解该消息,link 只是将我带到了 Vulkan 规范页面的开头。所以我能理解的是:

vkCreateDebugUtilsMessengerEXT: parameter pCreateInfo->flags must be 0

如果我设置 debugCreateInfo.flags = 0;明确地错误消失了。但这在其他任何地方都没有必要吗?我从来没有使用过这些标志,我也完全不理解它们。

然后我发现,如果我更改结构声明,错误也会消失:

VkDebugUtilsMessengerCreateInfoEXT debugCreateInfo;
// to
VkDebugUtilsMessengerCreateInfoEXT debugCreateInfo = {};

所以我的问题是什么是标志,我声明结构的方式和标志的声明之间有什么联系?

Vulkan 中的标志就像其他任何地方的标志一样工作,并且是将信息传递给实现的简单位掩码,就像您在上面的示例中通过 messageSeverity 传递的那些一样。

但是截至目前,您还没有可以根据 specs:

实际为调试实用程序创建信息结构设置的有效标志

flags is 0 and reserved for future use.

有效用法章节明确指出:

flags must be 0

该成员保留供将来使用,例如对于扩展,所以现在它必须始终为零。

在您的初始代码片段中,您没有明确清除 VkDebugUtilsMessengerCreateInfoEXT 结构,这可能会导致 pFlags 具有一些不符合规范设置规则的随机值。

这也适用于所有其他 Vulkan 结构,例如使用旗帜。因此,如果您没有明确设置任何标志,您应该始终清除创建信息结构,以便将任何 pFlags 成员设置为零。不这样做可能会导致未定义的行为。