Понимание флагов в Вулкане - PullRequest
0 голосов
/ 21 октября 2018

Пытаясь настроить отладочный обратный вызов в Vulkan, я заметил кое-что странное в слоях проверки LunarG SDK.

При настройке структуры create info я делаю следующее:

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 голосов
/ 21 октября 2018

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

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

flags is 0и зарезервировано для будущего использования.

И в действующей главе об использовании четко указано:

флаги должны быть 0

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

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

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

...