了解Vulkan中的标志

时间:2018-10-21 11:37:18

标签: api validation struct 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)

我不太理解该消息,该链接仅带我进入Vulkan规范页面的开头。所以我能理解的是:

  

vkCreateDebugUtilsMessengerEXT:参数pCreateInfo-> flags必须为0

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

然后我发现,如果我将结构声明从以下位置更改,该错误也会消失:

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

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

1 个答案:

答案 0 :(得分:1)

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

但是到目前为止,没有specs可以为调试实用程序创建信息结构实际设置的有效标志:

  

标志为0,并保留以供将来使用。

有效用法一章明确指出:

  

标志必须为0

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

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

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