linux 圖形棧的演進

1. 最開始,就是一段代碼直接訪問圖形卡:XFree8 server;root運行XFree86 server,使之從用戶態訪問圖形卡,不需要內核支持2D加速,非常容易在各操作系統間移植,不需要內核組件,就像這樣:

圖片發自簡書App

2. 然後Utah-GLX 3D加速設計出現,也是從用戶態訪問圖形卡,與2D完全獨立,於此同時FrameBuffer驅動也開始推廣,FB實現了另外的組件可以同時訪問圖形卡,爲防止與XFree86衝突,在VT切換是,內核會給X server發出保存圖像硬件狀態的信號。但這中保存GPU狀態的的操作是非常脆弱難搞,整體是這樣的:

圖片發自簡書App

所有GL加速必須通過X中轉,在數據量大(比如說傳紋理)時,性能不行,於是就出現了X.org

3. DRI模塊在XFree86和Xorg(XFree86的後代)都有,DRI依賴於一個內核態的組件來檢查3D指令流的正確性和安全性,於是OpenGL程序不必root權限就可以向內核的指令緩存提數據,然後內核模塊做安全檢查後發到硬件。不過來自XFree86的2D指令流依舊直接進硬件而不是走DRM,所以Xserver還是要root,具體架構開始變成這樣:

圖片發自簡書App

4. 前面這一代架構還是需要root權限,並且存在不同的驅動同時操作同一圖形硬件的問題,於是就要講內核的FB功能加到DRM中,然後將Xorg訪問圖形卡也通過DRM,這樣Xorg就不需要root,並且只有一個驅動訪問圖形硬件了,最終架構變成:

圖片發自簡書App

DRM爲Xorg搞了個KMS(Kernel Modeseting),在KMS模塊,DRM負責同時作爲FB,併爲Xorg提供modsetting服務。

4便是當前流行的linux圖形架構,有一些詞需要解釋:

GLX:GL都知道,加上X就是表示GL的一個擴展,用來將GL與X11窗口系統組合起來,在X窗口使能3D繪圖。就等同Android上的EGL,Windows系統上的WGL,MacOS上的AGL。

DRI:Direct Rendering Infrastructure,直接渲染基礎設施,使能了GL程序的直接渲染能力,目前有三種X協議擴展實現了DRI,XFree86-DRI,DRI2,DRI3,DRI3應該是最快的。Direct Rendering是相對於Indirect Rendering說的,間接渲染是通過X繞一下實現GL渲染,更慢一些,應該是不支持Opengl1.5後的版本。

DRI driver和DRM driver:DRI driver將GL渲染指令轉換成硬件指令來下發到DRM driver,DRM driver是DRI的內核態組件,負責安全、資源爭用、buffer管理(DRI2)以及基本上全部非直接3D狀態相關的操作硬件工作;DRI driver的大部分代碼都Mesa中共享。

Mesa是一個BrianPaul和很多開發者寫的GL的軟實現,包含軟的光柵化,GL狀態機,並且可以組合到很多窗口系統如X或Win32。所有開源DRI driver都是基於Mesa,很多閉源DRI驅動也是。

DRI的實現分散在X server和它相關的client庫中,Mesa 3D和DRM內核子系統。

5. 最後,在kernel3.12 render nodes提出,DRM和KMS driver分離,Wayland用EGL direct rendering,架構如下:

 

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