Пытаясь настроить обратный вызов отладки в 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: parameter pCreateInfo->flags must be 0
Если я установлю debugCreateInfo.flags = 0; явно ошибка уходит. Но в этом больше нигде не было необходимости? Я никогда не использовал флаги и вообще их не понимаю.
Затем я обнаружил, что ошибка также исчезает, если я изменяю объявление структуры с:
VkDebugUtilsMessengerCreateInfoEXT debugCreateInfo;
// to
VkDebugUtilsMessengerCreateInfoEXT debugCreateInfo = {};
Итак, мой вопрос: что такое флаги и какова связь между тем, как я объявляю структуру, и объявлением флага?
Флаги в Vulkan работают так же, как и в других местах, и представляют собой простые битовые маски для передачи информации в реализацию, точно так же, как те, которые вы передаете через messageSeverity
в приведенном выше примере.
Но на данный момент нет действительных флагов, которые вы можете установить для отладочной утилиты, создающей информационную структуру в соответствии с спецификации:
flags is 0 and reserved for future use.
И в главе о допустимом использовании четко сказано:
flags must be 0
Этот член зарезервирован для использования в будущем, например для расширений, поэтому сейчас он всегда должен быть равен нулю.
В исходном фрагменте кода вы явно не очищаете структуру VkDebugUtilsMessengerCreateInfoEXT
, что может привести к тому, что pFlags
будет иметь какое-то случайное значение, не соответствующее правилам, установленным спецификацией.
Это также относится ко всем другим структурам Vulkan, которые используют, например, флаги. Поэтому, если вы явно не устанавливаете какие-либо флаги, вы всегда должны очищать информационные структуры создания, чтобы любой член pFlags
был установлен в ноль. Невыполнение этого может привести к неопределенному поведению.
Или краткая версия: всегда инициализируйте свои переменные!