使用Vulkan-Loader将ncnn代码改成Dynamic Loader Vulkan的形式

这篇具有很好参考价值的文章主要介绍了使用Vulkan-Loader将ncnn代码改成Dynamic Loader Vulkan的形式。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

原本你写的程序是静态链接的系统的vulkan-1.dll,如果系统不存在vulkan-1.dll,则会直接崩溃。

关于将ncnn静态链接vulkan改成动态加载vulkan的形式,然后提供这两个函数

bool ncnn::has_vulkan();
void ncnn::use_vulkan(bool);

请教过ncnn的作者nihui,她对此issue表示不以为意,没有必要,优先级不高。

那就只有自己动手丰衣足食了。

本文的目标是将其改为动态加载的方式,用到了KhronosGroup组织下的Vulkan-SDK里面的CPP部分,即vulkan.hpp

本人的上一篇文章(https://www.cnblogs.com/hyb1/p/17361775.html)说的是如何动态判断是否存在vulkan-1.dll并且再加载的过程,

但是没提到如何针对现有的项目改动,比如说现在的ncnn含有的大量C Style的vulkan函数符号直接调用的代码,如果直接修改,需要将每一个vulkan函数的地方都加一个前缀,类似这样:

mVulkanDispatchLoaderDynamic->vkCreateInstance(&instanceCreateInfo, 0, &instance);

mVulkanDispatchLoaderDynamic->vkEnumeratePhysicalDevices(g_instance, &physicalDeviceCount, 0);

跨越了很多.cpp和.h文件,修改起来相当麻烦,而且还会遇到全局变量是否有效等等问题。

废话不多说,直接说总结:

Vulkan Loader提供了多个宏定义:VULKAN_HPP_STORAGE_API和VULKAN_HPP_STORAGE_SHARED和VULKAN_HPP_STORAGE_SHARED_EXPORT
它们是vulkan.hpp中用来控制vulkan函数的存储类别的宏。
VULKAN_HPP_STORAGE_API:

这个宏用来指定vulkan函数的存储类别,比如__declspec(dllexport)或者__declspec(dllimport)。
这个宏可以在编译时由外部定义,以便于将vulkan函数导出或者导入。


VULKAN_HPP_STORAGE_SHARED:

这个宏用来启用动态链接库的模式,即将vulkan函数作为dll的导出或者导入。
如果定义了这个宏,那么VULKAN_HPP_STORAGE_API会根据VULKAN_HPP_STORAGE_SHARED_EXPORT是否定义来自动设置为__declspec(dllexport)或者__declspec(dllimport)。
如果没有定义这个宏,那么VULKAN_HPP_STORAGE_API会被设置为空。


VULKAN_HPP_STORAGE_SHARED_EXPORT:

这个宏用来控制动态链接库的模式下,vulkan函数是作为dll的导出还是导入。
如果定义了这个宏,那么VULKAN_HPP_STORAGE_API会被设置为__declspec(dllexport),表示vulkan函数是dll的导出。

如果没有定义这个宏,那么VULKAN_HPP_STORAGE_API会被设置为__declspec(dllimport),表示vulkan函数是dll的导入。

如果你是希望通过vk::DispatchLoaderDynamic加载到defaultDispatchLoaderDynamic之后,仍旧按照静态链接的模式来编写代码,但是不是链接到真正的vulkan-1.dll上,而是由vulkan-loader生成的符号,应该这样做(重点来了):

1. 定义VULKAN_HPP_ENABLE_DYNAMIC_LOADER_TOOL和VULKAN_HPP_DISPATCH_LOADER_DYNAMIC两个宏,以启用动态加载vulkan库和函数的功能。
2. 不要定义VULKAN_HPP_STORAGE_SHARED和VULKAN_HPP_STORAGE_SHARED_EXPORT两个宏,以避免使用dll的模式。
3. 使用vk::DynamicLoader类来动态加载vulkan-loader生成的符号,并且获取vkGetInstanceProcAddr函数的地址。
4. 调用VULKAN_HPP_DEFAULT_DISPATCHER.init(vkGetInstanceProcAddr)来初始化默认的函数指针封装对象。
5. 使用默认的函数指针封装对象或者自定义的vk::DispatchLoaderDynamic对象来调用其他vulkan函数。

#define VULKAN_HPP_ENABLE_DYNAMIC_LOADER_TOOL 1
#define VULKAN_HPP_DISPATCH_LOADER_DYNAMIC 1
//#define VULKAN_HPP_STORAGE_API 0
#undef VULKAN_HPP_STORAGE_SHARED
#undef VULKAN_HPP_STORAGE_SHARED_EXPORT

#include <vulkan/vulkan.hpp>

//定义一个全局的vk::DispatchLoaderDynamic对象defaultDispatchLoaderDynamic
VULKAN_HPP_DEFAULT_DISPATCH_LOADER_DYNAMIC_STORAGE


//初始化的时候这样写
try
{
#ifdef WIN32
    std::string vulkanLibraryFilePath = "vulkan-1.dll";
#else //APPLE
    std::string vulkanLibraryFilePath = diropt::CurrentPath() + "/Contents/Frameworks/libMoltenVK.dylib";
#endif
    mVulkanDynamicLoader = std::make_unique<vk::DynamicLoader>(vulkanLibraryFilePath);
}
catch(std::runtime_error ex)
{
    mSupportVulkan = false;
    printf("vk::DynamicLoader is null\n");
    return;
}
if(!mVulkanDynamicLoader)
{
    mSupportVulkan = false;
    printf("mVulkanDynamicLoader is null\n");
    return;
}
mSupportVulkan = mVulkanDynamicLoader->success();
if(!mSupportVulkan)
{
    mSupportVulkan = false;
    printf("mSupportVulkan is false\n");
    return;
}
PFN_vkGetInstanceProcAddr vkGetInstanceProcAddr = mVulkanDynamicLoader->getProcAddress<PFN_vkGetInstanceProcAddr>("vkGetInstanceProcAddr");
if(!vkGetInstanceProcAddr)
{
    mSupportVulkan = false;
    printf("vkGetInstanceProcAddr is null\n");
    return;
}

mVulkanDispatchLoaderDynamic = std::make_unique<vk::DispatchLoaderDynamic>(vkGetInstanceProcAddr);
VULKAN_HPP_DEFAULT_DISPATCHER.init(vkGetInstanceProcAddr);

 文章来源地址https://www.toymoban.com/news/detail-709750.html

只要这样按照这上面的5点来修改ncnn的话,就可以编译出动态加载vulkan版本的ncnn了,如果你看到了这里觉得对你有帮助的话,就分享到qq群里的各位小伙伴吧~

 

到了这里,关于使用Vulkan-Loader将ncnn代码改成Dynamic Loader Vulkan的形式的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • C#用dynamic一行代码实现反射操作

    dynamic简介 dynamic是.NET Framework4.0的新特性。dynamic的出现让C#具有了弱语言类型的特性。编译器在编译的时候不再对类型进行检查,编译时默认dynamic对象支持你想要的任何特性。 dynamic简化反射实现 使用dynamic来简化反射实现是一种比较常见的编程技巧,它可以减少代码的复杂性

    2023年04月24日
    浏览(30)
  • 【vue3】对axios进行封装,方便更改路由并且可以改成局域网ip访问(附代码)

    对axios封装是在main.js里面进行封装,因为main.js是一个vue项目的入口 在1处创建一个axios实例为http,baseURL是基础地址(根据自己的需求写),写了这个在vue界面调用后端接口时只用在post请求处写路由地址就可以了 在2处将创建的axios实例挂到app上 在3处,vue页面进行调用后端接

    2024年02月12日
    浏览(37)
  • 更有效地将2D图像转换成3D场景 – 在Adreno GPU上使用Vulkan进行Mobile Nerf渲染

    Snapdragon 和 Qualcomm 品牌产品是 Qualcomm Technologies, Inc. 和 /或其子公司的产品。 假设您刚刚度假回来,带回来几十张从不同角度拍摄的埃菲尔铁塔、泰姬陵或米开朗基罗大卫的照片。如果您希望再“虚拟地”逛一逛这些景点,该怎么办呢?这需要拼接所有的 2D 图像,创建一个

    2024年04月15日
    浏览(40)
  • 树莓派4B使用NCNN部署Yolov5-lite

    目录 文章目录 前言 一、树莓派配置NCNN 1.安装依赖 2.下载NCNN并编译 二、Yolov5-lite模型训练 1.源码地址 2.安装所需要的包  3.训练自己的数据集(YOLO格式) 4.模型训练  5.模型转换 6.onnx模型简化 三、树莓派部署lite模型 1.将onnx模型转换为ncnn 2.添加Yolov5-lite.cpp 3.修改eopt.param  4.修

    2024年02月05日
    浏览(65)
  • Dynamic-Programming(动态规划)最细解题思路+代码详解(1)

    案例二:二维数组的 DP 我做了几十道 DP 的算法题,可以说,80% 的题,都是要用二维数组的,所以下面的题主要以二维数组为主,当然有人可能会说,要用一维还是二维,我怎么知道?这个问题不大,接着往下看。 问题描述 一个机器人位于一个 m x n 网格的左上角 (起始点在

    2024年04月26日
    浏览(38)
  • 使用Android studio,安卓手机编译安装yolov8部署ncnn,频繁出现编译错误

    从编译开始就开始出现错误,解决步骤: 1.降低graddle版本,7.2-bin  ---   降低为 6.1.1-all 2.仍旧有报错,jdk从17降为 jdk 13, 在setting配置里, 进入build,excution,deployment文件夹中,(是一个文件夹,名字长,不是三个) 进入build tools,再进入 Gradle,  如图所示, 勾选,选择

    2024年04月28日
    浏览(52)
  • 03-loader使用

    loader其实就是解析器,用来解析模块的,前面说到过webpack只认识js和json文件。配置方式如下: module.rules rules下放的是一个个的rule,一个rule对应一种解析规则。rule是一个对象,可设置多个属性: test:对于模块资源进行匹配,通常使用正则表达式 use: loader:必须有一个loa

    2024年02月10日
    浏览(37)
  • 67、C#调用Visual Studio 2019生成的Paddle+OCR(使用ncnn库),去完成业务任务

    基本思想:这里使用飞哥写的android代码,将其取出纯c++代码逻辑,自己尝试转了paddle+ocr模型,可以成功转换,不在详细阐述生成ncnn模型的过程和写后处理ocr识别过程,这里要实现的目的是使用c#调用ncnn的ocr工程,完成对应部门的业务支撑~ 一、在window10+ncnn+clion+mingw32测试结

    2024年02月09日
    浏览(59)
  • 如何把ntfs改成苹果电脑使用及mac写入ntfs硬盘软件教程

    ntfs是一种功能强大的文件系统,该格式的文件系统具有存储空间大,传输单个文件能力强,安全系数高等诸多优点,被广泛应用在移动硬盘中。但ntfs格式硬盘,不能在mac中被正常读写,那么ntfs怎么在mac使用?我们可以使用数据读写软件。如何把ntfs改成苹果电脑使用?除了使

    2024年02月15日
    浏览(50)
  • 编码技巧 --- 使用dynamic简化反射

    dynamic 是 Framework 4.0 就出现特性,它的出现让 C# 具有了弱语言类型的特性。编译器在编译的时候不再对类型进行检查,默认 dynamic 对象支持开发者想要的任何特性。 在C#中,dynamic是一种类型,它允许你在运行时动态地确定对象的类型。 使用dynamic类型可以使代码更加灵活,因

    2024年02月16日
    浏览(35)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包