首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >全局加载Vulkan函数

全局加载Vulkan函数
EN

Stack Overflow用户
提问于 2016-03-27 12:00:33
回答 1查看 4.5K关注 0票数 4

随着Vulkan的发布,我决定(作为一种爱好)编写一个基于Vulkan的GUI。不过,我目前还停留在第一步加载Vulkan函数。我使用的是Nvidia的C++ Vulkan包装器,据我所见,它需要全局加载Vulkan函数。

我可以成功地加载本地函数,但是::vkCreateInstance失败了:

代码语言:javascript
复制
void loadInstanceFunctions() {
    PFN_vkCreateInstance vkCreateInstance = (PFN_vkCreateInstance)vkGetInstanceProcAddr(nullptr, "vkCreateInstance"); //works

    ::vkCreateInstance = (PFN_vkCreateInstance)vkGetInstanceProcAddr(nullptr, "vkCreateInstance");  //does not work
}

尝试全局分配新函数指针会给我带来两个编译时错误(使用VS2015编译):

  • 表达式必须是可修改的lvalue。
  • '=':作为左操作数的函数。

vulkan.h头中声明了一些函数原型,例如:

代码语言:javascript
复制
VKAPI_ATTR VkResult VKAPI_CALL vkCreateInstance(
    const VkInstanceCreateInfo*                 pCreateInfo,
    const VkAllocationCallbacks*                pAllocator,
    VkInstance*                                 pInstance);

这可能会阻止我在全球范围内加载函数。如果我要定义VK_NO_PROTOTYPES,那么这些原型将被跳过,我相信我可以将它们重新声明为PFN_vkCreateInstance vkCreateInstance = nullptr;等等。但这是正确的方式吗?

那么,我的问题-什么是正确的方式加载Vulkan函数全球?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2016-03-27 14:11:05

代码语言:javascript
复制
::vkCreateInstance = (PFN_vkCreateInstance)vkGetInstanceProcAddr(nullptr, "vkCreateInstance");  //does not work

您正在尝试为符号vkCreateInstance分配一个函数指针,默认情况下,它是在vulkan.h中定义为原型的。

定义VK_NO_PROTOTYPES将预处理出所有原型:

代码语言:javascript
复制
#ifndef VK_NO_PROTOTYPES
VKAPI_ATTR VkResult VKAPI_CALL vkCreateInstance(
    const VkInstanceCreateInfo*                 pCreateInfo,
    const VkAllocationCallbacks*                pAllocator,
    VkInstance*                                 pInstance);
...
#endif

一旦原型消失,您就可以按照vkCreateInstance全局加载文档

代码语言:javascript
复制
#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;
}
票数 7
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/36247054

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档