回顾
我的上一篇文章介绍了 Mesa 的加载器,作为负责为我们的硬件自动选择正确驱动程序的模块。如果加载程序找不到合适的硬件驱动程序,它将回退到软件驱动程序,但我们也可以自己强制加载软件驱动程序这种情况,这在某些情况下可能会派上用场。我们还快速浏览了glxinfo工具,我们可以使用该工具查询所选驱动程序公开的功能和特性。
今天的主题重点是提供 Mesa 源代码树的快速概述,这将帮助我们根据驱动程序和/或我们打算使用的功能识别与我们的兴趣相关的代码部分。
浏览源代码
首先,Mesa 3D 网站上已经有一些关于此主题的文档,这是一个很好的起点。由于这已经对存储库的每个部分的内容提供了一些见解,因此我将专注于补充该信息,为我迄今为止与之交互的一些最重要的部分提供更多细节:
- 在src/egl/目录,有 EGL 标准的实现。如果您正在研究特定于 EGL 的特性,追踪特定于 EGL 的问题,或者您只是对 EGL 如何链接到 GL 实现感到好奇,那么这就是您想要访问的地方。这包括 X11、DRM 和 Wayland 平台的 EGL 实现。
- 在src/glx/ 中,我们有专门与 X11 平台相关的 OpenGL 位,称为 GLX。因此,如果您正在处理 GLX 层,这就是您要去的地方。这里有处理与 XServer 交互、客户端 DRI 实现等的所有内容。
- src/glsl/,包含 Mesa 的一个关键方面:所有 Mesa 驱动程序使用的 GLSL 编译器。它包括一个 GLSL 解析器,Mesa IR 的定义,也称为 GLSL IR,用于在内部表示着色器程序、着色器链接器和在 Mesa IR 上运行的各种优化通道。由 GLSL 编译器生成的 Mesa IR 然后由各种驱动程序使用,这些驱动程序将其转换为可在硬件中加载和运行的本机 GPU 代码。
- src/mesa/main/,包含核心 Mesa 元素。这包括核心对象的硬件独立视图,如纹理、缓冲区、顶点数组对象、OpenGL 上下文等,以及基本基础设施,如链表。
- src/mesa/drivers/,包含实际的经典驱动程序(不是 Gallium)。特别是 DRI 驱动程序进入src/mesa/drivers/dri。例如,英特尔 i965 驱动程序进入src/mesa/drivers/dri/i965。大多数情况下,这里的代码非常特定于底层硬件平台。
- src/mesa/swrast*/和src/mesa/tnl* /, 为诸如光栅化或顶点变换之类的东西提供软件实现。由一些软件驱动程序和一些硬件驱动程序使用,以实现它们没有硬件支持或驱动程序中的硬件支持尚不可用的某些功能。例如,i965驱动程序通过这些模块在软件中实现对累加和选择缓冲区的操作。
- src/mesa/vbo/,是另一个重要的模块。在其各种版本中,OpenGL 指定了许多程序可以将其顶点数据告知 OpenGL 的方式,从使用glBegin()/glEnd()块中的glVertex*()系列函数,到顶点数组、顶点数组等对象、显示列表等……然而,驱动程序不需要处理所有这些,Mesa 使它们始终接收作为顶点数组集合的顶点数据,从而显着降低了驱动程序实现者方面的复杂性。这是负责管理所有这些的模块,因此无论您的 GL 程序正在做什么类型的绘图或它如何指定其顶点数据,它始终会在到达驱动程序之前通过该模块。
- src/loader/,正如我们在上一篇文章中看到的,包含 Mesa 驱动程序加载器,它提供了必要的逻辑来决定哪个 Mesa 驱动程序是用于特定硬件的正确驱动程序,以便 Mesa 的 libGL.so 可以自动选择加载时正确的驱动程序。
- src/gallium/,包含Gallium3D框架实现。如果像我一样,您只在经典驱动程序上工作,则根本不需要关心其中的内容。但是,如果您正在开发 Gallium 驱动程序,那么您可以在此处找到各种开发中的 Gallium 驱动程序(在src/gallium/drivers/ 中),例如各种 Gallium ATI/AMD 驱动程序、Nouveau 或基于 LLVM 的软件驱动程序( llvmpipe)和镓状态跟踪器。
所以考虑到这一点,人们应该有足够的信息来知道从哪里开始寻找特定的东西:
- 如果对如何操作提供给 OpenGL 的顶点数据并将其上传到 GPU感兴趣,那么vbo模块可能是正确的地方。
- 如果我们希望处理具体硬件驱动程序的特定方面,如果是经典驱动程序,我们应该转到src/mesa/drivers/ 中的相应目录,如果是 Gallium 驱动程序,我们应该转到src/gallium/drivers。
- 如果我们想知道框架 Mesa 如何抽象各种 OpenGL 概念,如纹理、顶点数组对象、着色器程序等,我们应该查看src/mesa/main/。
- 如果我们对特定于平台的支持感兴趣,无论是 EGL 还是 GLX,我们都想查看src/egl或src/glx。
- 如果我们对 GLSL 实现感兴趣,它涉及从编译器到中间 IR 和各种优化传递的任何内容,我们需要查看src/glsl/。
接下来的是
现在我们对Mesa仓库的内容有了一个清晰的了解,让我们看看如何准备一个开发环境,这样我们就可以开始做一些事情了。我将在下一篇文章中介绍这一点。