如果设备不支持vulkan,就用swiftshader,否则就加载系统的vulkan的正确姿势(让程序能够智能的在vulkan-1.dll和libvk_swiftshader.dll之间切换)

Posted 重庆Debug的技术博客

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了如果设备不支持vulkan,就用swiftshader,否则就加载系统的vulkan的正确姿势(让程序能够智能的在vulkan-1.dll和libvk_swiftshader.dll之间切换)相关的知识,希望对你有一定的参考价值。

如果设备不支持vulkan,就用swiftshader,否则就加载系统的vulkan的正确姿势,让程序能够智能的在vulkan-1.dll和libvk_swiftshader.dll之间切换

一些老的显卡设备没有更新驱动,甚至根本就不支持Vulkan的显卡,遇到静态链接的vulkan-1.lib文件,启动exe就会崩溃。

 

你以为从别的机器拷贝这个vulkan-1.dll就可以了吗? 太傻太天真了,直接上图:

 

 

现在你的救星来了,Google出了一款SwiftShader,它是Vulkan的另外一种实现。

SwiftShader ( https://github.com/google/swiftshader )是一个高性能的 CPU-based Vulkan 实现,它可以提供高级 3D 图形的硬件独立性。

SwiftShader 的库可以作为图形驱动程序的替代品,使用它非常简单,只需将它们放在可执行文件的同一文件夹中,或者设置 VK_ICD_FILENAMES 环境变量指向 vk_swiftshader_icd.json 文件。

因此,如果想使用 SwiftShader 来切换成 CPU 运算,需要将 SwiftShader 库中的 libvk_swiftshader.dll 文件重命名为 vulkan-1.dll,并放在程序所在的文件夹中。

或者,可以保留原来的 vulkan-1.dll 文件,并设置 VK_ICD_FILENAMES 环境变量指向 SwiftShader 库中的 vk_swiftshader_icd.json 文件。

如果想让程序智能地在 vulkan-1.dll 和 libvk_swiftshader.dll 之间切换,可能需要使用 Vulkan Loader 来加载不同的 ICD(Installable Client Driver)。

Vulkan Loader 是一个共享库,它可以根据系统配置和环境变量来选择合适的 ICD 来执行 Vulkan API 调用。

如果你的设备不支持 Vulkan,那么可以使用 SwiftShader 库中的 libvk_swiftshader.dll 作为 ICD,并将其注册到 Vulkan Loader 中。

这样,当程序调用 vulkan-1.dll 时,Vulkan Loader 就会自动加载 libvk_swiftshader.dll 并使用 CPU 运算。

如果您的设备支持 Vulkan,那么您可以使用其他的 ICD(例如 NVIDIA 或 AMD 的驱动程序提供的),并将其注册到 Vulkan Loader 中。

这样,当程序调用 vulkan-1.dll 时,Vulkan Loader 就会自动加载相应的 ICD 并使用 GPU 运算。

要注册 ICD 到 Vulkan Loader 中,您需要创建一个 JSON 文件来描述 ICD 的信息,并将其放在一个特定的位置或者设置 VK_ICD_FILENAMES 环境变量来指向它。

SwiftShader 库中已经提供了一个 vk_swiftshader_icd.json 文件,可以参考它来创建其他 ICD 的 JSON 文件。

 

以上是关于如果设备不支持vulkan,就用swiftshader,否则就加载系统的vulkan的正确姿势(让程序能够智能的在vulkan-1.dll和libvk_swiftshader.dll之间切换)的主要内容,如果未能解决你的问题,请参考以下文章

Vulkan Tutorial 05 物理设备与队列簇

Vulkan Tutorial 06 逻辑设备与队列

Vulkan Tutorial 06 逻辑设备与队列

使用 Vulkan * API 并行渲染对象

[译]Vulkan教程(08)逻辑设备和队列

为啥 vulkan 在集成显卡和 GPU 的系统中报告单个设备?