【架構分析】MESA (EGL/GLES)架構分析

HaoBBNuanMM發表於2020-10-13

目錄

 

背景介紹

MESA 軟體架構

非-Gallium3D 架構

Gallium3D 架構

Intel i915 Backend

VirtIO-GPU Backend

核心資料結構層次關係

MESA 核心函式呼叫時序

非Gallium3D架構

eglGetDisplay呼叫時序

eglInitialize呼叫時序

eglCreateContext呼叫時序

eglCreateWindowSurface呼叫時序

eglMakeCurrent呼叫時序

eglSwapBuffers呼叫時序

glFlush呼叫時序

Gallium3D架構

Gallium3D-eglInitialize 時序圖

Gallium3D- eglCreateContext時序圖

Gallium3D- glFlush時序圖


 

背景介紹

GPU的user space driver是GPU廠商的技術核心模組,迫於kernel的GPL license 要求kernel的GPU driver必須開源,所以GPU 廠商將GPU的核心技術程式碼實現在user space的EGL和GLES相關庫並以binary的形式釋出保護核心IP.

MESA 是一個開源的graphics庫,它提供了一個EGL和GLES 的user space driver的參考實現,但MESA不限於支援EGL和GLES,參考https://www.mesa3d.org可以看到它幾乎支援所有GPU上的API

本文基於MESA 18.0.5版本對它EGL/GLES的實現進行了架構和關鍵時序的分析,MESA 程式碼下載:https://archive.mesa3d.org//

 

MESA 軟體架構

MESA 可以分為非-Gallium3D 與 Gallium3D兩種架構

非-Gallium3D 架構

MESA 非Gallium3D 架構

早期的MESA架構中,vendor DRI driver(比如上圖的intel i915 顯示卡驅動)和mesa 庫耦合比較緊密,跨平臺移植較為困難

 

Gallium3D 架構

Intel i915 Backend

MESA Gallium3D 架構 + i915 backend

 MESA演進為Gallium3D架構後,可以通過Gallium模組+不同平臺相關的Backend實現,進一步分割了Vendor HW driver 模組以及與平臺視窗系統有關的WinSys 模組(軟體架構設計模式仁者見仁,是不是搞的更復雜了。。。)

 

VirtIO-GPU Backend

MESA Gallium3D 架構 + VirtIO-GPU Backend

 

Gallium3D架構由於backend模組獨立(即Vendor HW driver 模組以及與平臺視窗系統有關的WinSys 模組獨立),所以Gallium3D可以選擇不同的backend,比如上圖某個Hypervisor虛擬機器的方案商可以通過採用MESA-Gallium3D + virtIO-GPU backend在Guest VM中實現虛擬GPU了功能,在Host VM中通過libvirglrenderer 來替Guest VM的應用響應3D GPU的繪圖命令

 

核心資料結構層次關係

核心資料結構層次關係圖

 

MESA的核心資料結構很多很複雜,上圖列舉了一些核心資料結構主要強調了它們的層次關係,即上層使用下層的抽象結構(比如 函式指標呼叫),下層為上次做具體的實現(比如具體的函式實現),雖然是C程式碼但設計理念基本上與C++的繼承類似

 

MESA 核心函式呼叫時序

非Gallium3D架構

eglGetDisplay呼叫時序

eglGetDisplay時序圖

 

eglInitialize呼叫時序

eglInitialize呼叫時序

 

eglCreateContext呼叫時序

eglCreateContext呼叫時序

 

eglCreateWindowSurface呼叫時序

eglCreateWindowSurface呼叫時序

 

eglMakeCurrent呼叫時序

eglMakeCurrent呼叫時序

 

eglSwapBuffers呼叫時序

eglSwapBuffers呼叫時序

 

glFlush呼叫時序

glFlush呼叫時序

 

Gallium3D架構

Gallium3D-eglInitialize 時序圖

Gallium3D-eglInitialize 時序圖

 

 

Gallium3D- eglCreateContext時序圖

Gallium3D- eglCreateContext時序圖

 

Gallium3D- glFlush時序圖

Gallium3D- glFlush時序圖

 

從上面的幾個Gallium3D的時序圖可以看出,對比非Gallium3D架構,Vendor和平臺相關的實現移到了HW Vendor Driver和WinSys 模組的具體實現中,libmesa_dri_drivers 面向Gallium3D提供的介面實現EGL和GLES的呼叫,實現了API OS HW的三層分割

 

 

 

相關文章