菜鳥修煉筆記-音視訊開發基礎知識-drm簡介
音視訊開發基礎知識-drm簡介
前言
最近工作上有些需求需要使用到drm中的plane,作為一名小菜鳥,在面對這個需求的時候,一堆問號又不由自主地從我的小腦瓜裡面冒了出來。drm是什麼?plane是什麼?它們有什麼用?它們有什麼關係?它們要怎麼用?所幸,萬能的網際網路存在各種知識,只需要我們花時間去尋找和學習,就能把各種各樣的問題解決。
特別宣告:
本文很大部分資訊來自其他博文,具體的博文網址見文末的參考資料。
一。DRM的基礎概念
1. DRM是什麼?
DRM是Linux目前主流的圖形顯示框架,相比FB架構,DRM更能適應當前日益更新的顯示硬體。比如FB原生不支援多層合成,不支援VSYNC,不支援DMA-BUF,不支援非同步更新,不支援fence機制等等,而這些功能DRM原生都支援。同時DRM可以統一管理GPU和Display驅動,使得軟體架構更為統一,方便管理和維護。
2. DRM的組成
DRM從模組上劃分,可以簡單分為3部分:libdrm、KMS、GEM。
其中KMS還包括:CRTC,ENCODER,CONNECTOR,PLANE,FB,VBLANK,property。
而GEM還包括:DUMB、PRIME、fence。
由於我目前需要了解的是plane屬於KMS模組,我們將著重瞭解的是KMS。
2.1 libdrm
libdrm對底層介面進行封裝,向上層提供通用的API介面,主要是對各種IOCTL介面進行封裝。應用層可以直接使用libdrm中的介面來達到影象顯示和影象處理等功能。
2.2 GEM
Graphic Execution Manager,主要負責顯示buffer的分配和釋放,也是GPU唯一用到DRM的地方。
屬於GEM模組的幾個專有名詞的意義如下:
元素 | 說明 |
---|---|
DUMB | 只支援連續實體記憶體,基於kernel中通用CMA API實現,多用於小解析度簡單場景 |
PRIME | 連續、非連續實體記憶體都支援,基於DMA-BUF機制,可以實現buffer共享,多用於大記憶體複雜場景 |
fence | buffer同步機制,基於核心dma_fence機制實現,用於防止顯示內容出現非同步問題 |
2.3 KMS
Kernel Mode Setting,所謂Mode setting,其實說白了就兩件事:
更新畫面和設定顯示引數
。
更新畫面:顯示buffer的切換,多圖層的合成方式,以及每個圖層的顯示位置。
設定顯示引數:包括解析度、重新整理率、電源狀態(休眠喚醒)等。
屬於KMS的幾個專有名詞的意義如下:
元素 | 說明 |
---|---|
CRTC | 對顯示buffer進行掃描,併產生時序訊號的硬體模組,通常指Display Controller |
ENCODER | 負責將CRTC輸出的timing時序轉換成外部裝置所需要的訊號的模組,如HDMI轉換器或DSI Controller |
CONNECTOR | 連線物理顯示裝置的聯結器,如HDMI、DisplayPort、DSI匯流排,通常和Encoder驅動繫結在一起 |
PLANE | 硬體圖層,有的Display硬體支援多層合成顯示,但所有的Display Controller至少要有1個plane |
FB | Framebuffer,單個圖層的顯示內容,唯一一個和硬體無關的基本元素 |
VBLANK | 軟體和硬體的同步機制,RGB時序中的垂直消影區,軟體通常使用硬體VSYNC來實現 |
property | buffer同步機制,基於核心dma_fence機制實現,用於防止顯示內容出現非同步問題 |
它們之間的關係和作用如下圖所示,值得注意的是與顯示屏連線的是connector,而plane可以存在多個也可以同時使用多個plane來進行影象顯示。
(圖片來源:The DRM/KMS subsystem from a newbie’s point of view)
二。KMS各個元素詳解
1. plane
1.1 定義:
Plane指的是Display Controller中用於多層合成的單個硬體圖層模組。
Plane是連線FB與CRTC的紐帶,是記憶體的搬運工。
意思就是說,plane的作用是將幀快取搬到CRTC中。
1.2 注意:
(1)要與YUV/YCbCr圖形格式中的plane區分開來:
DRM中的Plane和我們常說的YUV/YCbCr圖形格式中的plane完全是兩個不同的概念。YUV圖形格式中的plane指的是影象資料在記憶體中的排列形式,一般Y通道佔一段連續的記憶體塊,UV通道佔另一段連續的記憶體塊,我們稱之為YUV-2plane
(也叫YUV 2平面),屬於軟體層面。而DRM中的Plane指的是Display
Controller中用於多層合成的單個硬體圖層模組,屬於硬體層面。二者概念上不要混淆。
(2)並不是所有的Display Controller都支援Plane,即使沒有plane_id,螢幕也能正常顯示。