Vulkan: В чем смысл sType в vk * CreateInfo structs?

Во всех .sType ( vk*CreateInfo ) в новом API Vulkan есть ВСЕГДА элемент .sType . Почему это происходит, если значение может быть только одним? Также спецификация Vulkan очень ясна, что вы можете использовать только vk*CreateInfo structs в качестве параметров для их соответствующей функции vkCreate* . Это кажется немного лишним. Я вижу, что если драйвер передавал эту структуру прямо на графический процессор, вам может потребоваться ее (я заметил, что это всегда первый элемент). Но для приложения это выглядит очень плохо, потому что если драйвер сделает это, приложения будут гораздо меньше подвержены ошибкам, и добавление int в структуру не кажется чрезвычайно вычислительной неэффективной операцией. Я просто не понимаю, почему он существует.

TL; DR
Почему структуры vk*CreateInfo имеют член .sType ?

Чтобы API можно было изменить, не нарушая совместимости с предыдущими версиями.

Если версия 1.1 Vulkan хочет расширить на создание, например, пулов командного буфера, как бы это сделать? Ну, они могут добавить совершенно новую точку входа: vkCreateCommandPool2 . Но эта функция имела бы почти ту же подпись, что и vkCreateCommandPool ; Единственное отличие состоит в том, что они принимают разные структуры pCreateInfo .

Таким образом, все, что вам нужно сделать, это объявить структуру VkCommandPoolCreateInfo2 . И затем объявите, что vkCreateCommandPool может взять любой из них. Как будет реализована реализация, с которой вы проходили?

Поскольку первые 4 байта любой такой структуры являются sType . Они могут проверить это значение. Если значение VK_STRUCTURE_TYPE_COMMAND_POOL_CREATE_INFO , то это старая структура. Если это VK_STRUCTURE_TYPE_COMMAND_POOL_CREATE_INFO_2 , то это новый.

Это также упрощает для расширений полностью переопределять структуру CreateInfo . Поле pNext предназначено для расширения API с дополнительными параметрами. С помощью sType расширение может изменять существующие параметры.