Mesa & Gullium3D 介紹

keyou發表於2019-05-09

一、Mesa 介紹

Mesa (或Mesa3D)是一個 OpenGL/Vulkan 的實現,以及為所有開源圖形驅動提供各種 GL 的入口點, 它是一個專案的名字。由它編譯出來的庫是下面這些:

Mesa & Gullium3D 介紹

或者這些檔案:

Mesa & Gullium3D 介紹

其中需要注意的是這幾個檔案:libGL.so,libEGL.so,libGLESv2.so,根據名字很顯然,他們分別實現了對應的API。

Mesa有兩個作用:

  1. 對接各種GPU硬體,將應用層對GL API的呼叫轉換到對硬體GPU的呼叫上;
  2. 各種 GL API 的純軟實現,當沒有可用的硬體時,它可以提供傳軟體的 GL API 的實現;

它可以用於Linux,Windows,Mac等系統平臺。在Windows上執行時它提供OpenGL API over DirectX的轉換。

它實現了 OpenGL,Vulkan以及其他的圖形API。Mesa把這些API呼叫轉換到相應驅動程式(其實並不是真正的驅動程式,是使用者態的DRI驅動程式)呼叫上。AMD和Intel都提供他們對Mesa支援的驅動程式,Nvidia官方沒有提供開源的支援Mesa的驅動程式,只提供了商用的驅動程式,因此開源界開發了 Nouveau 作為支援Nvidia顯示卡的開源版本的支援Mesa的驅動程式。

在Ubuntu上它由libglvnd-dev包提供(vnd=Vendor neutral GL dispatch library),大部分帶圖形介面的Linux發行版會內建Mesa(還沒有找到特例,甚至ChromeOS系統都內建Mesa)。

具體來講它實現了包括但不限於這些API: OpenGL,Vulkan,OpenVG,OpenGL ES,EGL,GLX。對每種API的支援情況如下:

Mesa & Gullium3D 介紹

二、Mesa對SL的支援情況

SL指 Shading Language,著色器語言,是用來寫那些跑在GPU上的程式的語言,常見的有微軟的 HLSL,以及OpenGL的 GLSL。他們需要先轉換成IR(類似彙編指令)指令才能跑在GPU上,就像不同的CPU架構會有不同的指令集一樣,各個GPU廠家也都開發了不同的GPU指令集。NIR是Mesa支援的用來統一各種IR的指令集。Intel對它的支援是最完善的。

Mesa中的IR架構:

Mesa & Gullium3D 介紹

三、Gallium3D

Gallium3D 是Mesa提出的用於簡化GPU驅動開發的框架。

下面是Mesa結構圖,展示了mesa如何通過libGL庫跟核心打交道,以及展示了新舊兩種使用者態裝置驅動程式的實現方式。

Mesa & Gullium3D 介紹

左邊的驅動實現方式非常簡單直接,DeviceDriver部分直接是和硬體相關的,一般由硬體廠商開發,這個方案的mesa就相當於一個OpenGL的轉換器,把上層應用對OpenGL的呼叫轉換到對特定硬體的呼叫上,缺點是裝置廠商需要針對不同的作業系統,不同的GL API開發不同的驅動。

右邊的方案是Gallium3D的方案,特點是新增了分層,它把DeviceDriver部分的上下都給抽象了出來,OS WInSys部分抽象了當前的作業系統使得同一個DeviceDriver可以用於不同的作業系統,API State Tracker部分抽象了上層的不同的GL介面,使得同一個DeviceDriver可以支援不同的GL介面。整體大大降低了DeviceDriver的開發和適配難度。

下圖展示了基於Gallium3D的驅動實現方案的詳細資訊,可以看到各種GL API都可以通過不同的State Tracker來統一和不同的硬體驅動互動,並且不同的硬體驅動也可以通過WinSys和不同的系統對接。

Mesa & Gullium3D 介紹

四、極客發燒友動手指南

如果你想從0到1手工搭建出來GUI圖形棧,你需要知道一個廠家是如何支援Linux圖形棧的,以及如何使用各個廠家的驅動程式,可以去他們的官網上查詢,比如Intel整合顯示卡的相關驅動以及韌體可以在 01.org/zh/linuxgra… 下載。

其他廠商的驅動:

Hardware drivers include:

Software drivers include:

  • llvmpipe - uses LLVM for x86 JIT code generation and is multi-threaded
  • softpipe - a reference Gallium driver
  • swrast - the legacy/original Mesa software rasterizer

Additional driver information:


參考連結:

en.wikipedia.org/wiki/Mesa_(…

mesa3d.org/systems.htm…

01.org/zh/linuxgra…

en.wikipedia.org/wiki/Free_a…

www.freedesktop.org/software/ga…

www.freedesktop.org/wiki/Softwa…

www.mesa3d.org/relnotes/18…

packages.debian.org/sid/libglvn…

www.linuxfromscratch.org/blfs/view/s…