Вулкан: Какой смысл в sType в структурах vk*CreateInfo?
Во всех информационных структурах создания (vk*CreateInfo
) в новом Vulkan API ВСЕГДА есть .sType
член. Почему это так, если значение может быть только одно? Также спецификация Vulkan очень ясна, что вы можете использовать только vk*CreateInfo
в качестве параметров для их соответствующих vkCreate*
функция. Кажется, немного излишним. Я вижу, что если драйвер передавал эту структуру прямо в GPU, вам, возможно, понадобится ее (я заметил, что это всегда первый участник). Но это кажется плохой идеей для приложения, потому что если бы драйвер это сделал, приложения были бы гораздо менее подвержены ошибкам, а добавление int к структуре не выглядит крайне неэффективной вычислительной операцией. Я просто не понимаю, почему это существует.
TL; DR
Почему vk*CreateInfo
структуры имеют .sType
член?
1 ответ
Так что API может быть изменен без нарушения обратной совместимости.
Если Vulkan версии 1.1 хочет расширить, например, создание пулов буферов команд, как это будет сделано? Ну, они могли бы добавить совершенно новую точку входа: 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
расширение может изменить существующие параметры.