Linux - 显卡驱动和Mesa的关系

Linux - relations between graphics drivers and Mesa

当我安装 nvidia 专有驱动程序时,将使用 Nvidia OpenGL 实现(我不需要 Mesa)。哪个 OpenGL 实现可以与开源 nvidia 驱动程序 - Nouveau 一起使用? Nouveau 是否也提供 OpenGL 实现或者它必须使用 Mesa OpenGL 实现?我可以将 nvidia 驱动程序与 Mesa OpenGL 实现一起使用吗?有哪些可能性?

第一件事:开源图形驱动程序,所有这些驱动程序都使用 Mesa 作为前端 OpenGL 接口和状态跟踪。

让我们分解一下:理论上,OpenGL 实现可以直接与硬件对话。这就是 NVidia 和 AMD 专有驱动程序实际执行的操作。

但在开源世界中,代码重用受到高度青睐。所以一个典型的开源图形驱动程序看起来像这样:

用户 API 前端(OpenGL + 状态跟踪器)→ 抽象层(Gallium3D 或设备特定的内部层)→ 内核后端。

Mesa 项目实际上涵盖了整个链条。 Mesa 的 OpenGL 部分(前端)可以附加到不同的抽象层(例如软件光栅器,例如 softpipe/llvm)。但 Mesa 项目也是其他部分的保护伞:用户空间图形驱动程序(nouveau、radeon、intel 等)、允许用户空间进程直接与图形驱动程序对话、绕过显示服务器 (DRI) 和内核接口 (DRM) 以及内核模块。

几周前,AMD 发布了一个使用 DRM API 的新内核模块 (amdgpu),它是开源的,将合并到 Linux 内核中。这个新的内核模块可供专有的 AMD OpenGL 驱动程序和开源 Mesa 驱动程序使用。 AMD 推动开源已经有一段时间了,合乎逻辑的下一步是,AMD 放弃他们自己的 OpenGL 前端以支持 Mesa,并提供他们的专有驱动程序作为插入 Mesa 的中间端。


Can I use nvidia drivers with Mesa OpenGL implementation ?

这取决于。如果您在 X11 上执行间接 OpenGL,那么实际上您可以为您的程序使用 Mesa libGL.so,通过 X11 服务器与 nvidia 后端驱动程序通信。然而,以这种方式使用 libGL.so 仅充当 GLX 管道。顺便说一句,反之亦然。

但是,由于它缺少 "direct GL context" 功能,您将无法使用未定义间接操作码的 OpenGL 功能;遗憾的是,这将是任何 OpenGL-3 或更高版本。此外,如果您的数据是高度动态的,则由于序列化命令流而存在一些重大瓶颈(理论上使用像 vmsplice 这样的系统调用可以减轻大部分开销)。