Graphics Stack总结(四) Mesa source tree概览

 回顾

上篇文章中我们介绍了Mesa的loder模块,该模块负责自动为我们的硬件选择正确的driver。如果loader没能为找到匹配的hardware driver,那么它会fall back到software driver,但我们也可以为了debug等需求在某些情景下强制使用software driver。我们同样简单介绍了glxinfo tool,可以用它来查询选定driver的capabilities和features。

今天的话题是聚焦在Mesa source code tree的快速概览,这会帮助我们识别除mesa中的哪些代码是与我们的兴趣/正在工作的feature相关。

Browsing the source code

首先,on the Mesa 3D website上已经有一些文档作为一个很好的开始。由于这已经对mesa repo的每个部分是干啥的已经做出了解析,所以我将会专注于对我接触过的比较重要的部分进行一些细节的补充。

  • src/egl/ 中我们进行了EGL标准的实现。如果你工作在EGL的特定features,追踪EGL的特性问题或者只是好奇EGL是如何链接到GL的实现中,这里就是你需要访问的地方。这里包括了X11,DRM和Wayland平台的EGL实现(implementation)。
  • src/glx/ 中是OpenGL相关与X11平台的部分,known as GLX。如果你工作在GLX层,就去这个文件夹下。在这里面是所有于X server进行交互的部分,以及client端的DRI的实现等。
  • src/glsl/ 中包含了Mesa中的关键部分:被Mesa所有driver用到的GLSL编译器。包含了一个GLSL解析器,Mesa IR的定义,也称为GLSL IR,用于在内部表示着色器程序、着色器链接器和在Mesa IR上运行的各种优化过程。GLSL编译器生成的Mesa IR随后被各种驱动程序使用,这些驱动程序将其转换为可在硬件中加载和运行的本地GPU代码。
  • src/mesa/main/ 包含了核心的Mesa元素。这包含了硬件无关的核心部分:比如纹理(textures),缓冲区(buffers),顶点数组对象(vertex arrary objects),OpenGL上下文,以及基本基础设施,比如链接列表(linked lists)。
  • src/mesa/drivers/包含了实际的经典driver(非Gallium).特别一提,DRI driver在src/mesa/drivers/dri中。比如Intel i965 driver在src/mesa/drivers/dri/i965中。这里面的code很大程度上是针对底层硬件平台的。
  • src/mesa/swrast*/src/mesa/tnl*/ 为光栅化(rasterization)和顶点变换(vertex transforms)等提供了软件实现(software implementation)。这被某些software drivers和某些hardware drivers所用,以实现他们没有硬件支(hardware support)持或者driver中尚未提供硬件支持的某些特性(features)。举个例子,i965驱动通过这些模块以software的方式实现了累加和选择buffers的操作。
  • src/mesa/vbo/是另外一个重要的模块。通过它的各种各样的版本,OpenGL在一个程序中指定了许多方法,这个程序可以告诉OpenGL关于顶点数据,从 使用glBegin()/glEnd()代码块中glVertex*()  faimily中的函数,到顶点数组、顶点数组对象、显示列表等。然而,驱动程序不需要处理这一切,Mesa来处理这些工作,使得其始终接收顶点数据,这些顶点数据是是顶点数组的集合,显著降低了驱动实现器(driver implementation)一侧的复杂性。这是一个负责管理所有这些的模块,因此无论您的GL程序正在做什么类型的绘图,或者它如何指定顶点数据,它都会在到达驱动程序之前通过这个模块。
  • src/loader/,是我们在之前的文章中介绍过的,包含了Mesa的driver loader,它用来根据不同的特定硬件调用正确的mesa driver,这样Mesa的libGL.so在加载时就可以自动检测正确的driver.
  • src/gallium/ 包含了Gallium 3D架构的实现。如果你像我一样工作在classic driver上,你完全不需要管这块内容。然而如果你工作在Gallium  driver上,你在这里可以找到开发中的各种各样的Gallium driver(inside src/gallium/drivers/), 比如各种各样的Gallium ATI/AMD driver, Nouveau或者基于LLVM实现的software driver,和Gallium状态追踪器

所以,你有足够的信息知道,如果有问题的话该从哪部分代码看起。

  • 如果兴趣点在于vertex data时怎样被操纵和提供给OpenGL,然后上传至GPU的,vbo模块很可能是正确的地方来查看。
  • 如果我们想研究具体硬件驱动程序的特定方面,如果它是classic驱动程序,我们应该转到src/mesa/drivers/中的相应目录;如果它是Gallium驱动程序,则应该转到src/gallium/drivers中的对应目录。
  • 如果我们想了解Mesa框架如何抽象各种OpenGL概念,如纹理、顶点数组对象、着色器程序等,我们应该看看src/Mesa/main/。
  • 如果我们对特定于平台的支持感兴趣,无论是EGL还是GLX,我们都希望了解src/EGL或src/GLX。
  • 如果我们对GLSL实现感兴趣,它涉及从编译器到中间IR和各种优化过程的任何内容,我们需要研究src/GLSL/。
  • 如果兴趣点在于

Coming up next

我们现在已经对Mesa repo的内容已经有了宏观(鸟瞰,eagle view)的了解,接下来将看如何准备Mesa的开发环境。

posted @ 2022-11-07 15:10  青山牧云人  阅读(566)  评论(1编辑  收藏  举报