vkGetInstanceProcAddr
а также vkGetDeviceProcAddr
полностью отсутствуют в API документация. Однако они обязаны выполнять команды с цепочками обмена (и, следовательно, создавать любое значимое приложение Vulkan). Кроме того, демо cube / tri, которые идут с SDK, используют их очень непоследовательно.
Являются ли эти два метода взаимозаменяемыми, и если нет, то в чем разница?
vkGetInstanceProcAddress
получить указатель на функцию, которая всегда будет работать с любым устройством, созданным из переданного экземпляра.
Однако возвращаемые функции могут включать в себя логику диспетчеризации (обычно для учета расширений, которые могут или не могут быть включены для устройства), которые могут замедлять вызов. Вот почему vkGetDeviceProcAddress
существует, чтобы получить функцию, которая не имеет логики диспетчеризации. Вы не обязаны их использовать, но это может помочь получить дополнительную скорость.
Это особенно заметно, когда вы активировали несколько слоев:
С помощью указателя на функцию устройства можно удалить окончательную отправку:
изображения из документация по загрузчику khonos и интерфейсу слоя
Если вы используете только 1 устройство, порядок операций для приложения будет следующим:
получить vkGetInstanceProcAddress
с платформы / погрузчика.
нагрузка vkCreateInstance
от него и расширение, и слой запросов. (используя ноль в качестве параметра экземпляра)
создать экземпляр. (вы будете использовать это как первый параметр для загрузки других функций)
нагрузка vkEnumeratePhysicalDevices
и связанные с запросом устройств.
создать устройство с vkCreateDevice
указав нужные вам расширения.
загрузить все остальные функции, которые вам понадобятся vkGetDeviceProcAddress
и передача устройства в качестве первого параметра.
Выше ответ правильный. Я добавлю, что для расширений WSI загрузчики Windows, Linux и Android заявили, что будут экспортировать точки входа расширений WSI.
Таким образом, на этих платформах vkGetInstanceProcAddr и vkGetDeviceProcAddr НЕ требуется использовать для получения точек входа WSI. Но в целом точки входа расширения должны быть получены через vkGet * ProcAddr в Vulkan.