在 Linyaps 的代码中,显卡扩展是通过一个专门的扩展接口类来实现的。这个扩展主要针对 NVIDIA 显卡驱动,其启用过程并不是手动开关,而是根据宿主机是否安装了 NVIDIA 驱动动态决定。 ### 扩展识别与工厂模式 * `libs/linglong/src/linglong/extension/extension.h` 中定义了 `ExtensionImplNVIDIADisplayDriver` 类,并给它分配了唯一标识符 `org.deepin.driver.display.nvidia`。 * 扩展工厂 `ExtensionFactory::makeExtension` 会比较传入的扩展名称,当名称与上述标识符相同时,创建 `ExtensionImplNVIDIADisplayDriver` 对象;否则创建一个空实现对象。这保证只有指定为 NVIDIA 显卡驱动的扩展才会使用 GPU 相关逻辑。 ### 检测宿主机驱动版本 * 扩展对象的构造函数会调用 `hostDriverEnable()` 读取 `/sys/module/nvidia/version` 文件,从而获得当前宿主机加载的 NVIDIA 驱动版本。 * 读取成功时,它会用 `std::replace` 把版本号中的点号 `.` 替换成短横线 `-`。若文件不存在或读取失败,表示宿主机没有加载 NVIDIA 驱动,此时版本号为空。 ### 判断是否启用扩展 * `shouldEnable` 函数用来决定扩展是否有效:只有当传入的扩展名称等于 `org.deepin.driver.display.nvidia` 并且在构造函数中检测到了非空的驱动版本时,才会返回 `true`。 * 若条件满足,函数会将扩展名称修改为 `org.deepin.driver.display.nvidia.<驱动版本>`(例如 `org.deepin.driver.display.nvidia.535-54-03`),并返回 `true`。这样运行时便可以按驱动版本选择正确的显卡扩展包。 * 如果找不到驱动版本,则返回 `false`,显卡扩展不会启用。 ### 总结 Linyaps 的显卡扩展通过工厂模式和条件判断实现了自动启用。系统会先检查请求的扩展名称是否是 NVIDIA 显卡扩展,然后读取宿主机 `/sys/module/nvidia/version` 获取当前加载的 NVIDIA 驱动版本。当检测到驱动版本时,扩展名称会拼接版本号并返回 `true`,从而使运行时加载对应版本的显卡扩展包。如果宿主机未安装或未加载 NVIDIA 驱动,`shouldEnable` 返回 `false`,显卡扩展便不会启用。
sudo ll-cli install org.deepin.driver.display.nvidia.570-124-04
安装了之后,如果应用是基于 25 的 base 制作的,就可以硬件加速
这种方法要保证宿主机驱动版本和玲珑扩展驱动版本一致才会自动加载
如果版本不一致只能强制使用oci配置强制挂载,
{ "ociVersion": "1.0.1", "patch": [ { "op": "add", "path": "/mounts/-", "value": { "destination": "/opt/extensions/org.deepin.driver.display.nvidia.570-124-04", "type": "bind", "source": "/var/lib/linglong/layers/bfdfac1726a019a3c87d31a405e11bd6c96129a92159c2f52d12efdf116487f6/files", "options": ["rbind","ro","rslave","nosuid","nodev"] } }, { "op": "add", "path": "/process/env/-", "value": "__NV_PRIME_RENDER_OFFLOAD=1" }, { "op": "add", "path": "/process/env/-", "value": "__GLX_VENDOR_LIBRARY_NAME=nvidia" }, { "op": "add", "path": "/process/env/-", "value": "__EGL_VENDOR_LIBRARY_DIRS=/opt/extensions/org.deepin.driver.display.nvidia.570-124-04/glvnd/egl_vendor.d:$ORIGIN" }, { "op": "add", "path": "/process/env/-", "value": "__EGL_EXTERNAL_PLATFORM_CONFIG_DIRS=/opt/extensions/org.deepin.driver.display.nvidia.570-124-04/egl/egl_external_platform.d" }, { "op": "add", "path": "/process/env/-", "value": "VK_ICD_FILENAMES=/opt/extensions/org.deepin.driver.display.nvidia.570-124-04/vulkan/icd.d/nvidia_icd.json" }, { "op": "add", "path": "/process/env/-", "value": "LD_LIBRARY_PATH=/opt/extensions/org.deepin.driver.display.nvidia.570-124-04/orig:/usr/lib/x86_64-linux-gnu:/usr/lib" } ] }
No replies yet
Featured Collection
Popular Ranking
Popular Events
在 Linyaps 的代码中,显卡扩展是通过一个专门的扩展接口类来实现的。这个扩展主要针对 NVIDIA 显卡驱动,其启用过程并不是手动开关,而是根据宿主机是否安装了 NVIDIA 驱动动态决定。 ### 扩展识别与工厂模式 * `libs/linglong/src/linglong/extension/extension.h` 中定义了 `ExtensionImplNVIDIADisplayDriver` 类,并给它分配了唯一标识符 `org.deepin.driver.display.nvidia`。 * 扩展工厂 `ExtensionFactory::makeExtension` 会比较传入的扩展名称,当名称与上述标识符相同时,创建 `ExtensionImplNVIDIADisplayDriver` 对象;否则创建一个空实现对象。这保证只有指定为 NVIDIA 显卡驱动的扩展才会使用 GPU 相关逻辑。 ### 检测宿主机驱动版本 * 扩展对象的构造函数会调用 `hostDriverEnable()` 读取 `/sys/module/nvidia/version` 文件,从而获得当前宿主机加载的 NVIDIA 驱动版本。 * 读取成功时,它会用 `std::replace` 把版本号中的点号 `.` 替换成短横线 `-`。若文件不存在或读取失败,表示宿主机没有加载 NVIDIA 驱动,此时版本号为空。 ### 判断是否启用扩展 * `shouldEnable` 函数用来决定扩展是否有效:只有当传入的扩展名称等于 `org.deepin.driver.display.nvidia` 并且在构造函数中检测到了非空的驱动版本时,才会返回 `true`。 * 若条件满足,函数会将扩展名称修改为 `org.deepin.driver.display.nvidia.<驱动版本>`(例如 `org.deepin.driver.display.nvidia.535-54-03`),并返回 `true`。这样运行时便可以按驱动版本选择正确的显卡扩展包。 * 如果找不到驱动版本,则返回 `false`,显卡扩展不会启用。 ### 总结 Linyaps 的显卡扩展通过工厂模式和条件判断实现了自动启用。系统会先检查请求的扩展名称是否是 NVIDIA 显卡扩展,然后读取宿主机 `/sys/module/nvidia/version` 获取当前加载的 NVIDIA 驱动版本。当检测到驱动版本时,扩展名称会拼接版本号并返回 `true`,从而使运行时加载对应版本的显卡扩展包。如果宿主机未安装或未加载 NVIDIA 驱动,`shouldEnable` 返回 `false`,显卡扩展便不会启用。
安装了之后,如果应用是基于 25 的 base 制作的,就可以硬件加速
这种方法要保证宿主机驱动版本和玲珑扩展驱动版本一致才会自动加载
如果版本不一致只能强制使用oci配置强制挂载,