加入星計(jì)劃,您可以享受以下權(quán)益:

  • 創(chuàng)作內(nèi)容快速變現(xiàn)
  • 行業(yè)影響力擴(kuò)散
  • 作品版權(quán)保護(hù)
  • 300W+ 專業(yè)用戶
  • 1.5W+ 優(yōu)質(zhì)創(chuàng)作者
  • 5000+ 長(zhǎng)期合作伙伴
立即加入
  • 正文
    • 1) 什么是 Graphics?
    • 2) 關(guān)于圖片 (picture) 和像素 (pixel)
    • 3) 和像素打交道的事情
    • 1) Display 相關(guān)硬件
    • 2) Rendering 和 Processing 相關(guān)硬件
    • 1) Display 相關(guān)的軟件概念
    • 2) Render 相關(guān)的軟件概念
    • Displaying Stack
    • Rendering Stack
    • Processing Stack
  • 推薦器件
  • 相關(guān)推薦
  • 電子產(chǎn)業(yè)圖譜
申請(qǐng)入駐 產(chǎn)業(yè)圖譜

深夜磨刀,Linux Graphics Stack 概述

2021/09/26
756
閱讀需 23 分鐘
加入交流群
掃碼加入
獲取工程師必備禮包
參與熱點(diǎn)資訊討論

1. 引言

1) 什么是 Graphics?

當(dāng)我們看到一個(gè)東西并在腦子里產(chǎn)生它的樣子時(shí),本質(zhì)上是眼睛感受到了光。

所以,圖形是光的數(shù)字化呈現(xiàn),形式為圖片 (picture) 或者叫幀 (frame),picture 和 frame 本質(zhì)上是一樣的東西。

物理世界中的光是連續(xù)的,而數(shù)字圖片是離散的或量化的;

數(shù)字圖片由許多的像素 (pixel) 構(gòu)成的,如何用數(shù)字來(lái)表示每一個(gè)像素的方式稱為 color model,例如包含 3 個(gè) color channel 的 RGB,而具體用多少位的數(shù)據(jù)來(lái)表示某個(gè)具體的顏色值的方式稱為 color space,

color model 是描述了顏色的組成方式,而 color space 則是物理圖形世界和數(shù)字圖形世界的準(zhǔn)確鏈接方式。

2) 關(guān)于圖片 (picture) 和像素 (pixel)

下面是關(guān)于圖片的幾個(gè)要點(diǎn):

1、圖片的尺寸 (dimension,寬度和高度),以像素為單位。

2、縱橫比 (aspect ratio) 是寬:高的比例,例如 16:9、4:3。

3、分辨率 (resolution),像素個(gè)數(shù)/物理長(zhǎng)度,可能是 pixels per inch 或者是 pixels per millimeter,容易和 dimension 混淆。

4、根據(jù)像素在內(nèi)存中的存儲(chǔ)順序的不同,顯示時(shí)也會(huì)有不同的掃描順序 (scan order),例如 linear scan order、raster scan order。

5、像素有特定的格式:

  • 多個(gè) color channel;透明 (alpha) 通道;Depth (不包含 alpha channel )和 bits per pixel (bpp,包含 alpha channel);像素在內(nèi)存里可能有不同的組織方式,可能是一個(gè)個(gè)像素存儲(chǔ),也可能是先存儲(chǔ)所有像素的 red channel,再存儲(chǔ)所有像素的 green channel,最后存儲(chǔ)所有像素的 blue channel;Sub-sampling,多個(gè)像素共享同一個(gè) color channel;

3) 和像素打交道的事情

Graphics 相關(guān)

Displaying: 根據(jù)數(shù)碼圖片的數(shù)據(jù),重現(xiàn)相應(yīng)的光,例如顯示器、屏幕、投影儀。

Rendering: 根據(jù) primitives (渲染時(shí)用的術(shù)語(yǔ),其實(shí)就是 points、lines 等最基礎(chǔ)的元素) 生成數(shù)碼圖片,包括 3D rendering, 2D shape drawing, font rendering 等。

Processing: 處理數(shù)碼圖片,包括 Filtering, scaling, converting, compositing 等。

Media 相關(guān)

Decoding/encoding: 壓縮/解壓縮圖片,Picture codecs (JPEG, PNG, etc), Video codecs (H.264, VP8, etc)。

Capturing/outputting: 采集或者輸出圖像,例如 Cameras, DVB 等。

2. Graphics 相關(guān)的硬件組件

包括 Display、Rendering and Processing 相關(guān)的硬件。

1) Display 相關(guān)硬件

顯示輸出是通過(guò)下面的組件實(shí)現(xiàn),這些組件就構(gòu)成了一條 pipeline:

Frame buffer:一塊用于存儲(chǔ)像素的內(nèi)存,可能有多個(gè) Frame buffer,一個(gè) Frame buffer 就對(duì)應(yīng)一個(gè)圖層 (plane);

Display engine:充當(dāng) hardware compositer 的角色,負(fù)責(zé)對(duì)圖層 (plane) 進(jìn)行合成,例如將鼠標(biāo)圖層,視頻圖層、桌面圖層合成在一起;

Timings controller:當(dāng)我們已經(jīng)擁有了一張已經(jīng)合成好的圖片后,我們就需要通過(guò) Timings controller 將像素以正確的時(shí)序發(fā)送出去。由于都會(huì)兼容以前的 CRT 顯示器,所以也叫 CRT controller,簡(jiǎn)稱 CRTC。

Display protocol controller:當(dāng)像素能以正確的時(shí)序發(fā)送時(shí),它們就會(huì)到達(dá) Display protocol controller,這里會(huì)將像素以某個(gè)格式打包,或者叫編碼以滿足相應(yīng)的協(xié)議,例如 HDMI、eDP、MiPi dsi 的數(shù)據(jù)包都有各自的編碼格式。

Display interface PHY:負(fù)責(zé)物理鏈 路上信號(hào)的發(fā)送和接收,例如 HDMI 的 tmds (transition minimized differential signaling),現(xiàn)在一般都是差分信號(hào),并且不斷地追求更大的吞吐量。

Connector and cable:最后就是通過(guò)線纜連接到顯示設(shè)備,例如顯示器、屏幕。

在 Soc 的顯示模塊里,一般都會(huì)包含 Display engine、Timings controller、Display interface PHY。

2) Rendering 和 Processing 相關(guān)硬件

Rendering 和 Processing 有幾種不同的實(shí)現(xiàn):

GPU(圖形處理單元):

  • 最常見(jiàn)的實(shí)現(xiàn);高度定制的架構(gòu)和指令集;專為 3D 渲染設(shè)計(jì),也可以做 2D 渲染和處理;通過(guò)加載名為 shaders 的程序,shaders 被添加到 的 command stream 后,GPU 會(huì)建立 pipeline 以渲染出相應(yīng)的內(nèi)容;

DSP數(shù)字信號(hào)處理器):

  • 具有專用指令集的專用處理器;

固定功能 ISP(圖像信號(hào)處理器):

  • 特定任務(wù)的硬件實(shí)現(xiàn);

基于 CPU 的實(shí)現(xiàn)

  • 軟件實(shí)現(xiàn)(經(jīng)常使用 SIMD);

3. 圖形相關(guān)的軟件概念

包括 Display、Render 兩個(gè)類型。

1) Display 相關(guān)的軟件概念

1、某個(gè)時(shí)刻,只能有一個(gè)應(yīng)用訪問(wèn)顯示設(shè)備,不同 app 的顯示需求應(yīng)該被合成一張圖片然后再被顯示出來(lái),因此需要一個(gè)叫 display server 的處理這些事情;

2、display server 負(fù)責(zé):

管理 frame buffer;

給 client app 提供一個(gè)協(xié)議供它們?cè)L問(wèn)顯示設(shè)備,app 通過(guò)這個(gè)協(xié)議將要顯示的內(nèi)容提交給 display server;

協(xié)調(diào)更新 client app 的 frame buffer;

處理輸入事件,將事件轉(zhuǎn)發(fā)給相關(guān)的 client app,例如當(dāng)你通過(guò)鍵盤(pán)輸入密碼時(shí),你當(dāng)然是希望只有你正在使用的 app 能接收到你輸入的內(nèi)容,其他 app 無(wú)權(quán)獲得你的密碼;

將 client app 隔離開(kāi)來(lái),保護(hù)它們的數(shù)據(jù)安全;

3、compositor 是另外一個(gè)常見(jiàn)的概念,一般會(huì)集成在 display server 中,它負(fù)責(zé)將各個(gè) client app 的 buffer 合成一張圖片,然后將其發(fā)送給顯示設(shè)備。

4、window manager 也是一個(gè)比較重要的概念,它負(fù)責(zé)定義 client app 的共存策略,例如哪個(gè) app 位于最上層、哪個(gè)應(yīng)用被選中了、哪個(gè)應(yīng)用正在被移動(dòng);

2) Render 相關(guān)的軟件概念

1、與顯示不同,GPU 可以并行運(yùn)行不同的工作;

2、GPU 渲染基于 primitives,其實(shí)就是點(diǎn)、線之類的東西,這些數(shù)據(jù)都是 3d 的,但是會(huì)被渲染到一個(gè)平坦的 2d frame buffer 里;

3、還有許多可以被渲染的單元,例如 Texture、Map 等;

3、GPU 運(yùn)行的程序叫 Shader,它們會(huì)被添加到 GPU 的 command stream,告訴 GPU 應(yīng)該渲染什么。

4、Shader 有不同的類型,例如負(fù)責(zé)轉(zhuǎn)換幾何大小的 Vertex shader、負(fù)責(zé)定義顏色和紋理的 Fragment shaders 等

4. Linux 的 Graphics Stack

同樣分為 Displaying、Rendering、Processing。

Displaying Stack

1) Kernel

fbdev 是傳統(tǒng)的 display subsystem,目前已接近被完全淘汰,目前在內(nèi)核里只有 fb console 還在使用它。

fbdev 存在許多問(wèn)題:

所有東西都是靜態(tài)設(shè)置、沒(méi)有 pipeline 的概念、緩沖區(qū)是預(yù)分配的、不支持熱插拔、不支持同步訪問(wèn)等;

現(xiàn)在基本都切換到 drm/kms 這套 display subsystem 了。

drm/kms 的好處在于:

引入了 pipeline 的思想,用面向?qū)ο蟮姆绞綄?duì)顯示相關(guān)的組件進(jìn)行抽象,將它們封裝成不同的對(duì)象,這些組件可以獨(dú)立被配置,并且組合在一起以構(gòu)成一條完整的 display pipeline。

對(duì)上層提供通用的 API (DRM uAPI,u 代表 userspace),所有基于這套 API 的顯示應(yīng)用 (一般是 display server ) 可以運(yùn)行在不同的硬件平臺(tái)上。

另外還有一些好處,例如動(dòng)態(tài)分配 frame buffer、提供 Atomic API 以支持同步等。

2) 用戶空間的 Protocols 和 Servers

X 是一個(gè)歷史悠久的 Linux userspace 顯示框架。

經(jīng)常被提起的X11 (X protocol version 11) ,其實(shí)是一個(gè)協(xié)議,由于它設(shè)計(jì)比較早,所以并不是很適應(yīng)現(xiàn)在的硬件和顯示需求,因此有了許多針對(duì) X11 的擴(kuò)展協(xié)議,例如 XrandR (用于動(dòng)態(tài)修改顯示配置), XSHM (共享內(nèi)存以避免拷貝), Xinput2, Composite 等。

X11 定義了 client app 如何和 display server 通訊,但是它本身不是 display server ,Xorg 是 X11 的一個(gè)實(shí)現(xiàn),所以 Xorg 才是 display server。

X 在顯示和輸入方面使用的是 driver 的概念,例如 xf86-input-libinput, xf86-video-modesetting (用于 drm/kms), xf86-video-fbdev (用于 fbdev)。

X仍然是在 server 端進(jìn)行渲染,并且有許多安全問(wèn)題和功能限制,因此在 PC 和 嵌入式設(shè)備上都慢慢地拋棄它了,替代品是 Wayland。

Wayland 是一個(gè)更現(xiàn)代的協(xié)議,它的出現(xiàn)就是為了代替掉 X,解決 X 所遇到的所有問(wèn)題。

實(shí)現(xiàn) Wayland 協(xié)議的 display server 被稱為 Wayland compositors,最出名的實(shí)現(xiàn)是 Wayland 官方的 Weston,其他的還有 wlroots 的 sway,GNOME 的 mutter,KDE 的 Kwin。

為了在使用 Wayland 的設(shè)備上兼容 X 的程序,還引入了 Xwayland 兼容層。

最后還有一個(gè)值得提起的 display server,就是 Android 的 SurFlinger,它是為 Android 深度定制的,基本不可能跑在傳統(tǒng)的 Linux 系統(tǒng)上。

另外還有一個(gè)叫 display manager 的軟件,其實(shí)就是登陸界面,它會(huì)負(fù)責(zé)啟動(dòng) display server 以啟動(dòng)桌面環(huán)境。在嵌入式系統(tǒng)中,一般都不需要 display manager。

3) 用戶空間的 Libraries、Toolkits

下面會(huì)列舉一些與圖形相關(guān)的庫(kù)、toolkits、或者是桌面環(huán)境。

實(shí)現(xiàn) display server 協(xié)議的底層庫(kù):

Wayland: libwayland-client, libwayland-server

X11: XCB, Xlib

上層應(yīng)用不會(huì)直接使用這些庫(kù)來(lái)開(kāi)發(fā)應(yīng)用,而是使用 Graphics toolkits。

用于編寫(xiě) GUI 應(yīng)用的 Graphics toolkits:

GTK (C): Widget-based UI toolkit,支持 X 和 Wayland;

Qt (C++): Widget-based UI toolkit,支持 X 和 Wayland

EFL (C): Lightweight UI and application library

SDL (C): Drawing-oriented graphics library,一般用于游戲開(kāi)發(fā),雖然它算不上是一套 toolkits,但是它和其他 toolkits 起的作用是差不多的,都是輔助開(kāi)發(fā)者開(kāi)發(fā)圖形應(yīng)用。

有了 Graphics toolkits 就可以開(kāi)發(fā)出一套完整的桌面環(huán)境了,一般會(huì)包括::

一套基礎(chǔ)的 app;

Window manager 和 compositor;

最后一個(gè)要提到的庫(kù)就是 libdrm:

它是對(duì) DRM uAPI 的封裝,它會(huì)訪問(wèn) kernel space 里的 DRM driver。

事實(shí)上,如果你不是要寫(xiě) display server,或者做一些特別硬件相關(guān)的活的話,基本不會(huì)直接基于 libdrm 寫(xiě)程序,甚至很多內(nèi)核里寫(xiě) DRM driver 的驅(qū)動(dòng)工程師也不是很熟悉 libdrm。

Rendering Stack

1) Kernel

在 kernel space 里,DRM 同時(shí)也負(fù)責(zé)管理 GPU。

但是和顯示不同,在應(yīng)用層并沒(méi)有一套通用的 API 來(lái)訪問(wèn) GPU,即對(duì)于不同 GPU 的 DRM driver,都會(huì)提供自己特有的 API 給應(yīng)用層。這是因?yàn)椴煌瑥S商的 GPU 的實(shí)現(xiàn)都太硬件相關(guān)了,很難設(shè)計(jì)一套統(tǒng)一的 API 來(lái)使用這些 GPU。

通常的情況是,在 kernel space 里,GPU driver 只實(shí)現(xiàn)最底層的 io 相關(guān)功能,例如使用 DRM GEM api 對(duì) Memory buffers (或者叫 buffer object,簡(jiǎn)稱 BO) 進(jìn)行管理、command stream 的驗(yàn)證與提交,而更核心的活都留給 userspace libraries (例如芯片廠商提供的 libdrm 和 libGLES 之類的,或者是開(kāi)源社區(qū)提供的 Mesa3D ) 去實(shí)現(xiàn)。

2) Userspace APIs for 3D

芯片廠商提供的 GPU userspace libraries 向下會(huì)訪問(wèn) GPU,向上實(shí)現(xiàn)通用的 API 以便上層應(yīng)用進(jìn)行 3D 渲染,目前常見(jiàn)的 3D 渲染 API 包括:

OpenGL,用于 desktop GPUs,使用 GL shading language (簡(jiǎn)稱 GLSL) 作為其編程語(yǔ)言,其 shader 的格式為 glsl。OpenGL,用于的特點(diǎn)是在易用性和功能性方面比較均衡,以不太復(fù)雜的方式提供了常用的 GPU 訪問(wèn)操作。

OpenGL ES,用于 embedded GPUs,OpenGL 的子集,但是其實(shí)一般都會(huì)同時(shí)支持 OPenGL 和 OpenGL ES。

EGL,OpenGL 和 OpenGL ES 都是只負(fù)責(zé)渲染 (即使用 GPU 生成圖像),但是還有另外一個(gè)重要的活就是如何將圖像從 GPU端 導(dǎo)到 Graphics 端,這就是通過(guò) EGL 這個(gè) api 來(lái)實(shí)現(xiàn)的。它負(fù)責(zé)協(xié)調(diào) render 和 display,具體的就是提供一些內(nèi)部會(huì)使用 openGL 的函數(shù),然后通過(guò) X / Wayland 協(xié)議將 buffer 提交給 display server。

Vulkan,一種更新的 API 的。它提供了更多 GPU 的高級(jí)用法,它涉及更多以及更細(xì)粒度的 GPU 底層操作,因此要編寫(xiě)的代碼也更復(fù)雜。另外,Vulkan 有自己和 display stack 交互的方式,稱為 Vulkan WSI (Window System Integration),因此它不再需要使用 EGL。Vulkan 不僅僅能用 GPU 進(jìn)行渲染,還能使用 GPU 進(jìn)行計(jì)算。Vulkan 的 shader 格式為 SPIR-V。

3) Userspace Implementations for 3D

上面說(shuō)的是 API,而具體的實(shí)現(xiàn)一般有兩種形式:

芯片廠商提供的閉源實(shí)現(xiàn),以動(dòng)態(tài)庫(kù)的形式提供;

開(kāi)源社區(qū)提供的實(shí)現(xiàn):Mesa 3D,有源碼。

我們重點(diǎn)了解一下開(kāi)源的 Mesa 3D。

https://docs.mesa3d.org/

Mesa 3D 的特性如下::

支持 OpenGL, OpenGL ES 和 Vulkan APIs;

支持有 DRM render driver (或者叫 DRM userspace driver) 的 GPU,包括 radeon, amdgpu, nouveau, etnaviv, vc4/v3d (樹(shù)梅派的 GPU), lima (ARM 的 Mali-4XX 系列), panfrost (Arm 的 Mali-TXXX / Mali-GXX 系列);

支持 software render,包括 softpipe, swr, llvmpipe, lavapipe;

支持 GPU video decoding,使用 VDPAU、VAAPI、OMX api;

支持使用 OpenCL 進(jìn)行計(jì)算,目前只支持 clover driver (intel);

4) Libraries for 2D

再來(lái)看一下 2D 的渲染,我們即可以用 CPU 進(jìn)行 2D 渲染,也可以用 GPU 實(shí)現(xiàn) 2D 渲染。

相關(guān)的庫(kù):

cairo: 一個(gè)廣泛使用 drawing library;

Skia: 谷歌提供的 drawing library;

FreeType: 傳統(tǒng)的矢量字體渲染 library;

HarfBuzz: 比較新的矢量字體渲染 library;

Processing Stack

這一塊我也不是特別懂,但是為了內(nèi)容的完整性我就進(jìn)行簡(jiǎn)單的介紹吧。

對(duì)于 Processing,會(huì)有下面幾種實(shí)現(xiàn):

使用優(yōu)化的基于 CPU 的算法;

使用特定的 SIMD CPU 指令(NEON、SSE、AVX);

使用 GPU;

相關(guān)的庫(kù):

用于像素格式轉(zhuǎn)換和縮放 FFmpeg libswscale;

用于各種像素操作的 Pixman;

用于 NEON 加速像素操作的 ARM's Ne10;

用于快速傅立葉變換的 FFTW;

圖像處理框架 G’MIC ;

到此,關(guān)于 Linux 圖形顯示的框架就介紹完畢了,感謝閱讀!

推薦器件

更多器件
器件型號(hào) 數(shù)量 器件廠商 器件描述 數(shù)據(jù)手冊(cè) ECAD模型 風(fēng)險(xiǎn)等級(jí) 參考價(jià)格 更多信息
MW6HP-18P 1 TE Connectivity RF RELAY, DPDT, MOMENTARY, 0.02A (COIL), 18VDC (COIL), 360mW (COIL), 6000MHz, THROUGH HOLE-STRAIGHT MOUNT, ROHS COMPLIANT
$213.27 查看
ISO124P 1 Texas Instruments ±10-V input, precision voltage sensing low-cost isolated amplifier 8-PDIP -25 to 85

ECAD模型

下載ECAD模型
$26 查看
MIC29302WU-TR 1 Microchip Technology Inc 1.25 V-25V ADJUSTABLE POSITIVE LDO REGULATOR, 0.6V DROPOUT, PSSO5

ECAD模型

下載ECAD模型
$2.39 查看

相關(guān)推薦

電子產(chǎn)業(yè)圖譜