1. Android顯示系統框架
Android Graphic UI with GPU Hardware Acceleration
https://community.nxp.com/docs/DOC-93612
a. 顯示驅動framebuffer的原理及改進
只有一個FrameBuffer的缺點:
(1)如果App寫入FB的速度慢,LCD圖像變化慢
(2)如果App寫FB速度不快不慢,LCD圖像會閃爍
因此,在僅使用一個FB的基礎上做出改進,使用多個FB來改進:
(1)DisplayController使用FB0
(2)APP寫FB1
(3)DisplayController使用FB1
(4)APP寫FB0
(5)重復以上步驟
最繪制圖片方面:以前在linux中是對在FB中繪制整個空間的數據,如果需要繪制手機界面,步驟如下:狀態欄、導航欄、背景、圖標;每個界面都需要上述四個步驟
在Android中引入層的概念:狀態欄和導航欄為一層、背景為一層、圖片為一層,最后把繪制好的層合並,合並使用HardwareComposer
HWC稱為硬件合並
驅動支持HWC:每一層對應一個驅動/dev/fbx,APP操作某一層,直接寫對應的FrameBuffer,硬件會自動合並它們(比如我們的4412的fb0~fb4就是對應的LCD)
b. 多任務系統的顯示: 必定有一個顯示管理者
APP不能直接訪問LCD驅動程序,有一個稱為SurfaceFlinger(統一操作顯示設備)的管理者,其功能:
(1)SurfaceFlinger給APP提供buffer,給APP存放界面(這樣APP和SurfaceFlinger之間就不需要傳輸buffer了)
a、SurfaceFlinger通過gralloc模塊(HAL)向ashmem(驅動層)申請內存
b、得到一個fd,用這個文件句柄描述申請的buffer
c、通過binder把fd傳給APP
d、APP通過mmap(fd)之后直接訪問buffer
(2)APP1/APP 2/APP3 把各自的界面發給SurfaceFlinger,它根據層次、大小進行合成顯示;
a、根據各個界面的Z值(高度,相對XY坐標理解)決定前后順序,Z值肯定是由WindowManagerService確定
b、把這些排序后的buffer傳給HardwareComposer模塊,如果硬件不支持該模塊或者層數超過了模塊的限制,用軟件GL(graphicLibrary)處理
(3)當HardwareComposer不能處理(無硬件/超過硬件支持最大層數),使用GL來處理
android系統通過libEGL.so來加載硬件GL庫或者軟件GL庫(引腳GL庫可能是對GPU的訪問),除了SurfaceFlinger可以通過libEGL.so來加載GL庫之外,APP也可以libEGL.so庫來使用GL庫

