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

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

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

Ответы

Ответ 1

Чтобы 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 расширение может изменять существующие параметры.