Vulkan: разница между vkGetInstanceProcAddress и vkGetDeviceProcAddress

vkGetInstanceProcAddr а также vkGetDeviceProcAddr полностью отсутствуют в API документация. Однако они обязаны выполнять команды с цепочками обмена (и, следовательно, создавать любое значимое приложение Vulkan). Кроме того, демо cube / tri, которые идут с SDK, используют их очень непоследовательно.

Являются ли эти два метода взаимозаменяемыми, и если нет, то в чем разница?

8

Решение

vkGetInstanceProcAddress получить указатель на функцию, которая всегда будет работать с любым устройством, созданным из переданного экземпляра.

Однако возвращаемые функции могут включать в себя логику диспетчеризации (обычно для учета расширений, которые могут или не могут быть включены для устройства), которые могут замедлять вызов. Вот почему vkGetDeviceProcAddress существует, чтобы получить функцию, которая не имеет логики диспетчеризации. Вы не обязаны их использовать, но это может помочь получить дополнительную скорость.

Это особенно заметно, когда вы активировали несколько слоев:

введите описание изображения здесь

С помощью указателя на функцию устройства можно удалить окончательную отправку:

введите описание изображения здесь
изображения из документация по загрузчику khonos и интерфейсу слоя

Если вы используете только 1 устройство, порядок операций для приложения будет следующим:

  1. получить vkGetInstanceProcAddress с платформы / погрузчика.

  2. нагрузка vkCreateInstance от него и расширение, и слой запросов. (используя ноль в качестве параметра экземпляра)

  3. создать экземпляр. (вы будете использовать это как первый параметр для загрузки других функций)

  4. нагрузка vkEnumeratePhysicalDevices и связанные с запросом устройств.

  5. создать устройство с vkCreateDevice указав нужные вам расширения.

  6. загрузить все остальные функции, которые вам понадобятся vkGetDeviceProcAddress и передача устройства в качестве первого параметра.

13

Другие решения

Выше ответ правильный. Я добавлю, что для расширений WSI загрузчики Windows, Linux и Android заявили, что будут экспортировать точки входа расширений WSI.
Таким образом, на этих платформах vkGetInstanceProcAddr и vkGetDeviceProcAddr НЕ требуется использовать для получения точек входа WSI. Но в целом точки входа расширения должны быть получены через vkGet * ProcAddr в Vulkan.

1

По вопросам рекламы [email protected]