Linux - 图形驱动程序和 Mesa 之间的关系

Posted

技术标签:

【中文标题】Linux - 图形驱动程序和 Mesa 之间的关系【英文标题】:Linux - relations between graphics drivers and Mesa 【发布时间】:2015-07-19 04:30:53 【问题描述】:

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

【问题讨论】:

【参考方案1】:

首先要做的事:开源图形驱动程序都使用 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 的中间端。


我可以在 Mesa OpenGL 实现中使用 nvidia 驱动程序吗?

这取决于。如果您在 X11 上进行间接 OpenGL,那么实际上您可以将 Mesa libGL.so 用于您的程序,通过 X11 服务器与 nvidia 后端驱动程序进行通信。但是以这种方式使用 libGL.so 仅充当 GLX 管道。顺便说一句,它也可以反过来工作。

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

【讨论】:

以上是关于Linux - 图形驱动程序和 Mesa 之间的关系的主要内容,如果未能解决你的问题,请参考以下文章

RK3399应用开发 | 编译安装 mesa 3D 图形库(23.0.0)

RK3399应用开发 | 编译安装 mesa 3D 图形库(23.0.0)

带有 NVIDIA 驱动程序 (linux) 的 Mesa 标头

Linux OpenGL 实践篇-1

在Linux下使用gcc编译mesa文件报undefined reference to symbol 'sin@@GLIBC_2.2.5和DSO missing from command li

OpenGL + Mesa 3D + MinGW