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的開發環境。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章