Вулкан: Какой смысл в 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расширение может изменить существующие параметры.

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