1.架構圖
1.App或者GUI tool發起繪畫請求,最終經過libdrm到kernel驅動GPU進行渲染操作;或者pixel-man經過CPU渲染,或者overlay這種;
2.GPU將渲染結果通過memory最終傳給上層[與其他類型的圖層也在一併交給compositor]。
3.渲染的一張張結果[多張不同圖層]經過kms:displayconntroller合成一張圖裝換成合適的數據格式最終輸出到屏幕上。
a.高通方面的源碼路徑如下
kernel/driver/gpu/drm/xxxx
kernel/driver/gpu/drm/msm/xxxx
kernel/driver/gpu/drm/msm/sde/xxxx
sde和以前的mdp是同一個模塊
2.概念
a. libdrm
libdrm是包裝大多數Drm IOCTL的庫。包括vblank事件處理,內存管理,輸出管理,幀緩衝管理等。是用戶空間與內核交互的重要方式。api分兩套,legacy和atomic
b. drm& c. kms& d. gem& framebuffer
Linux
DRM層包含用於支持複雜圖形設備需求的代碼,通常包含非常適合3D圖形加速的可編程管道。內核中的圖形驅動程序可以利用DRM函數來簡化內存管理,中斷處理和DMA等任務,併爲應用程序提供統一的接口。
KMS 負責modeset,負責將圖像合成,變成電信號,最終送到顯示設備上。
這兩個合起來負責渲染以及送顯。也就是整個圖像的生成以及顯示到硬件上的整個過程。
GEM是負責管理framebuffer的模塊。也是drm重點的一部分。
e. plane
Display Controller的數據源通道,每個crtc至少要有一個plane;切記這是硬件設備
f. crtc
1.DPMS (Display Power Manage System) 電源狀態管理 (crtc_funcs->dpms)
2.將 Framebuffer 轉換成標準的 LCDC Timing ,其實就是一幀圖像刷新的過程(crtc_funs->mode_set)
3.幀切換,即在 VBlank 消影期間,切換 Framebuffer(crtc_funcs->page_flip)
4.Gamma 校正值調整(crtc_funcs->gamma_set)
g. encoder
1.DPMS (Display Power Manage System) 電源狀態管理 (encoder_funcs->dpms)
2.將 VOP 輸出的 lcdc Timing 打包轉化爲對應接口時序 HDMI TMDS / … (encoder_funcs->mode_set)
h. bridge
1.轉換作用,將一種信號轉換或者加解串成另一種信號
比如mipi -> hdmi
i.connector
1.獲取上報熱拔插Hotplug狀態
2.讀取並解析屏(Panel)的EDID信息
高通自身在msm裏面有個sde文件夾,裏面有自己重新封裝的connector。文件爲sde_connector.c以及sde_connector.h文件。
注:
順序buffer -> plane -> crtc -> encoder -> (bridge) -> connector -> hw panel;
plane-crtc-encoder對應的實體,都是包含在mdp內部;
j.Makefile
1類drm-xxx,drm基礎模塊。
2類drm-xxx-helper-xxx,drm的helper模塊。
3類xxx/文件夾,第三方廠商對drm,對自己硬件的實現與封裝。