С выпущенным Vulkan я решил написать (как хобби) графический интерфейс на основе Vulkan. Тем не менее, я сейчас застрял на самом первом этапе - загружая функции Vulkan. Я использую Nvidia C++ Vulkan wrapper, которая требует, насколько я вижу, функций 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):
- выражение должно быть модифицируемым значением l.
- '=': функция как левый операнд.
Есть прототипы функций, объявленных в vulkan.h
заголовка, например:
VKAPI_ATTR VkResult VKAPI_CALL vkCreateInstance(
const VkInstanceCreateInfo* pCreateInfo,
const VkAllocationCallbacks* pAllocator,
VkInstance* pInstance);
Это то, что могло бы помешать мне погрузочных функций в глобальном масштабе. Если бы я определил VK_NO_PROTOTYPES
, то эти прототипы были бы пропущены, и я считаю, что могу просто повторно объявить их как PFN_vkCreateInstance vkCreateInstance = nullptr;
и так далее. Но верно ли это?
Итак, мой вопрос - каков правильный способ загрузки функций Vulkan по всему миру?
Что вы имеете в виду под «не делает Работа". Есть ли ошибка времени компиляции, и если да, можете ли вы скопировать/вставить весь вывод компилятора из этой ошибки? Или вы имеете в виду поведение во время работы? – Yakk
Есть ли причина, по которой вы не можете просто использовать Vulkan SDK для загрузки указателей на функции? Я имею в виду, если вы используете оболочку на C++ для NVIDIA, то вы явно не против стороннего программного обеспечения. И действительно, работа с Vulkan с валидационным слоем похожа на работу с нитроглицерином без оборудования для обеспечения безопасности. –
Скопируйте ошибки дословно: не перефразируйте и не копируйте/не вставляете его часть. Каждое сообщение об ошибке и информации и предупреждения, генерируемое компиляцией, кодами ошибок и номерами строк, именами файлов и т. Д. Если вы посмотрите на свой код, у вас есть локальная переменная с именем 'vkCreateInstance', то вы используете разрешение области видимости для доступа к тому, что кажется глобальной переменной под названием' vkCreateInstance' (или, по крайней мере, глобальное имя с именем 'vkCreateInstance' - кто знает!) , Я понятия не имею, что вы пытаетесь сделать. Отправьте сообщение [MCVE], которое генерирует вашу ошибку. – Yakk