微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

Vulkan静态和动态线性化之间有什么区别,vkGetInstanceProcAddress的角色有何不同?

如何解决Vulkan静态和动态线性化之间有什么区别,vkGetInstanceProcAddress的角色有何不同?

当我已经看过一些基本的Vulkan教程时,我同时遇到了linink Vulkan的两种可能性-静态(使用vulkan-1.lib / a)和动态(使用vulkan-1.dll / so),这些教程通常会指出这两种可能性之间没有什么区别,但是真的是这样吗?

当我不得不研究一些Nvidia示例并使用其扩展加载方式并以某种方式将其合并到我的应用程序中时(因为我需要他们的display扩展支持),对我来说,事情变得非常混乱。现在同时链接-.dll和.lib。我认为这不好,我正在尝试根除这一点,但是对我来说,它揭示了一些我不确定我是否正确理解的东西,即:

  • 使用vkGetInstanceProcAddr进行动态和静态链接有什么区别?

我想在需要访问Vulkan api函数调用的情况下需要调用函数,它将通过分发树为我提供指向ICD的函数指针。但是为什么我需要再次调用它来访问某些扩展功能(例如验证层),但是不需要通过额外调用vkGetInstanceProcAddr来访问某些扩展功能调用(例如VkSurfaceKHR或VkSwapchianKHR扩展的方法),为什么呢,以及我所缺少的?

解决方法

两者都是动态\运行时链接。 *.lib只是为您执行dll链接的存根实现,这不是Vulkan特有的,而是Visual C ++编译器提供的。

具有“静态链接”的官方加载程序将加载核心命令和基本的本地WSI扩展,而其余部分将被卸载\未导出。直接使用*.dll意味着您需要以特定于操作系统的方式加载dll,然后以特定于操作系统的方式提取vkGetInstanceProcAddr,然后使用vkGetInstanceProcAddr加载所需的所有内容。 / p>

您可以在LoaderAndLayerInterface.md上阅读更多内容。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。