随着Vulkan的发布,我决定写一个基于Vulkan的GUI(作为一个爱好).但是,我目前陷入了第一步 - 加载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
}
Run Code Online (Sandbox Code Playgroud)
尝试全局分配新的函数指针给我2个编译时错误(使用VS2015编译):
vulkan.h标题中声明了函数原型,例如:
VKAPI_ATTR VkResult VKAPI_CALL vkCreateInstance(
const VkInstanceCreateInfo* pCreateInfo,
const VkAllocationCallbacks* pAllocator,
VkInstance* pInstance);
Run Code Online (Sandbox Code Playgroud)
这可能会阻止我在全局加载函数.如果我要定义VK_NO_PROTOTYPES,那么这些原型将被跳过,我相信我可以重新声明它们PFN_vkCreateInstance vkCreateInstance = nullptr;等等.但这是正确的方法吗?
所以,我的问题 - 在全球范围内加载Vulkan函数的正确方法是什么?
::vkCreateInstance = (PFN_vkCreateInstance)vkGetInstanceProcAddr(nullptr, "vkCreateInstance"); //does not work
Run Code Online (Sandbox Code Playgroud)
您正在尝试为该符号分配一个函数指针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
Run Code Online (Sandbox Code Playgroud)
一旦原型消失,您可以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;
}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
2422 次 |
| 最近记录: |