Понимание флагов в 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: parameter pCreateInfo->flags must be 0

Если я установлю debugCreateInfo.flags = 0; явно ошибка уходит. Но в этом больше нигде не было необходимости? Я никогда не использовал флаги и вообще их не понимаю.

Затем я обнаружил, что ошибка также исчезает, если я изменяю объявление структуры с:

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

Итак, мой вопрос: что такое флаги и какова связь между тем, как я объявляю структуру, и объявлением флага?

Как сделать HTTP-запрос в Javascript?
Как сделать HTTP-запрос в Javascript?
В JavaScript вы можете сделать HTTP-запрос, используя объект XMLHttpRequest или более новый API fetch. Вот пример для обоих методов:
Создание ресурсов API Laravel: Советы по производительности и масштабируемости
Создание ресурсов API Laravel: Советы по производительности и масштабируемости
Создание API-ресурса Laravel может быть непростой задачей. Она требует глубокого понимания возможностей Laravel и лучших практик, чтобы обеспечить...
Как создать простое погодное приложение на Python с API OpenWeatherMap
Как создать простое погодное приложение на Python с API OpenWeatherMap
Этот учебник проведет вас через процесс создания простого погодного приложения с помощью Python и OpenWeatherMap API.
Пакеты Java
Пакеты Java
Пакет java - это группа классов, интерфейсов и подпакетов схожего типа. Думайте об этом как о папке в каталоге файлов. Мы используем пакеты, чтобы...
Как использовать API парсинга квитанций с помощью JavaScript за 5 минут?
Как использовать API парсинга квитанций с помощью JavaScript за 5 минут?
В этом руководстве вы узнаете, как использовать API парсинга квитанций за 5 минут с помощью JavaScript. Eden AI предоставляет простой и удобный для...
0
0
456
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Флаги в Vulkan работают так же, как и в других местах, и представляют собой простые битовые маски для передачи информации в реализацию, точно так же, как те, которые вы передаете через messageSeverity в приведенном выше примере.

Но на данный момент нет действительных флагов, которые вы можете установить для отладочной утилиты, создающей информационную структуру в соответствии с спецификации:

flags is 0 and reserved for future use.

И в главе о допустимом использовании четко сказано:

flags must be 0

Этот член зарезервирован для использования в будущем, например для расширений, поэтому сейчас он всегда должен быть равен нулю.

В исходном фрагменте кода вы явно не очищаете структуру VkDebugUtilsMessengerCreateInfoEXT, что может привести к тому, что pFlags будет иметь какое-то случайное значение, не соответствующее правилам, установленным спецификацией.

Это также относится ко всем другим структурам Vulkan, которые используют, например, флаги. Поэтому, если вы явно не устанавливаете какие-либо флаги, вы всегда должны очищать информационные структуры создания, чтобы любой член pFlags был установлен в ноль. Невыполнение этого может привести к неопределенному поведению.

Или краткая версия: всегда инициализируйте свои переменные!

Nicol Bolas 21.10.2018 19:25

Другие вопросы по теме