С выходом Vulkan я решил написать (в качестве хобби) графический интерфейс на основе Vulkan. Однако в настоящее время я застрял на самом первом шаге — загрузке функций Vulkan. Я использую оболочку Nvidia C ++ Vulkan, которая, насколько я вижу, требует загрузки глобальных функций Vulkan.
Я могу загружать локальные функции успешно, однако ::vkCreateInstance
терпит неудачу:
void loadInstanceFunctions() {
PFN_vkCreateInstance vkCreateInstance = (PFN_vkCreateInstance)vkGetInstanceProcAddr(nullptr, "vkCreateInstance"); //works
::vkCreateInstance = (PFN_vkCreateInstance)vkGetInstanceProcAddr(nullptr, "vkCreateInstance"); //does not work
}
Попытка назначить новый указатель на функцию глобально дает мне 2 ошибки времени компиляции (скомпилированные с использованием VS2015):
Есть прототипы функций, объявленные в vulkan.h
заголовок, например:
VKAPI_ATTR VkResult VKAPI_CALL vkCreateInstance(
const VkInstanceCreateInfo* pCreateInfo,
const VkAllocationCallbacks* pAllocator,
VkInstance* pInstance);
Это то, что может помешать мне загружать функции глобально. Если бы я должен был определить VK_NO_PROTOTYPES
, тогда эти прототипы будут пропущены, и я считаю, что я мог бы просто повторно объявить их как PFN_vkCreateInstance vkCreateInstance = nullptr;
и так далее. Но так ли это?
Итак, мой вопрос — как правильно загружать функции Vulkan глобально?
::vkCreateInstance = (PFN_vkCreateInstance)vkGetInstanceProcAddr(nullptr, "vkCreateInstance"); //does not work
Вы пытаетесь назначить указатель функции на символ vkCreateInstance
который по умолчанию определяется как прототип в vulkan.h.
определяющий VK_NO_PROTOTYPES
предварительно обработаем все прототипы:
#ifndef VK_NO_PROTOTYPES
VKAPI_ATTR VkResult VKAPI_CALL vkCreateInstance(
const VkInstanceCreateInfo* pCreateInfo,
const VkAllocationCallbacks* pAllocator,
VkInstance* pInstance);
...
#endif
После того, как прототипы ушли, вы можете загрузить vkCreateInstance
глобально согласно документация:
#define VK_NO_PROTOTYPES
#include <vulkan/vulkan.h>
#ifdef __cplusplus
extern "C" {
#endif
VKAPI_ATTR PFN_vkVoidFunction VKAPI_CALL vkGetInstanceProcAddr(VkInstance instance, const char *pName);
#ifdef __cplusplus
}
#endif
PFN_vkCreateInstance vkCreateInstance;
int main()
{
vkCreateInstance = (PFN_vkCreateInstance) vkGetInstanceProcAddr(NULL, "vkCreateInstance");
return 0;
}
Других решений пока нет …