了解 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
成员设置为零。不这样做可能会导致未定义的行为。
在尝试在 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
成员设置为零。不这样做可能会导致未定义的行为。