Загрузка Vulkan функционирует глобально

С выходом 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):

  • выражение должно быть изменяемым lvalue.
  • ‘=’: функция как левый операнд.

Есть прототипы функций, объявленные в vulkan.h заголовок, например:

VKAPI_ATTR VkResult VKAPI_CALL vkCreateInstance(
const VkInstanceCreateInfo*                 pCreateInfo,
const VkAllocationCallbacks*                pAllocator,
VkInstance*                                 pInstance);

Это то, что может помешать мне загружать функции глобально. Если бы я должен был определить VK_NO_PROTOTYPES, тогда эти прототипы будут пропущены, и я считаю, что я мог бы просто повторно объявить их как PFN_vkCreateInstance vkCreateInstance = nullptr; и так далее. Но так ли это?

Итак, мой вопрос — как правильно загружать функции Vulkan глобально?

3

Решение

::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;
}
6

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

Других решений пока нет …

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