顯示部分的幾個問題這幾天通過實際測試澄清了一下,主要是中各個模組的使用狀況以及HAL層幾個模組的調用流程。以問題的方式描述如下:
0. SurfaceFlinger主要功能
SurfaceFlinger只是負責merge Surface的控制,如計算出兩個Surface重疊的地區,至於Surface需要顯示的內容,則通過Skia、OpenGL和pixflinger來計算。
1. Ap是怎麼進行顯示的?
Surfaceflinger負責所有上層的顯示處理,對於AP(2D或是3D的應用程式)而言,只要到surfaceflinger中建立surface,設定好參數,接下來都是統一交給surfaceflinger進行處理
2. SurfaceFlinger是怎麼管理多個surface的?
不管有多少個surface,最終送到顯示部分的只能是螢幕大小資料,surfaceflinger中利用MDP或是GPU進行多個surface的合成處理,普通的合成MDP就可完成,但如果是複雜的比如3D的應用等就必須使用GPU,最終合成的好資料會被送到framebuffer中。
3. Framebuffer是什嗎?
Framebuffer是Linux中為顯示資料分配的一塊顯存(fb裝置中),通常大小是一整個螢幕資料的兩倍,對於上層AP而言,只需要將要顯示的資料丟到framebuffer中就OK了,但此時顯示資料並未真正的被送到LCD上,而是暫存在framebuffer中而已。
4. 上層是通過什麼方式將顯示內容送到framebuffer的?
有2個方式(二選一,不會同時在運行):
A、 普通的顯示,使用copybit(MDP)(未使用GPU)
Surfaceflinger通過copybit將要顯示的資料送到framebuffer。
Note:copybit可以看做是MDP PPP的介面,它提供了MDP的功能,如多個layer合成,scale、rotate等。
其介面在:android/hardware/msm7k/libcopybit/copybit.cpp
B、 使用GPU(即使用圖中的Graphics driver)
當進行複雜的顯示處理時,比如3D的應用,GPU把處理好的資料直接丟到framebuffer中,和MDP沒有任何關係
5. Framebuffer中的資料是如何被送到LCD顯示的?
圖中的Gralloc完成的。
Gralloc有2個功能:
1)一個是和copybit相同的,裡面有MDP PPP的介面(目前沒有使用)
2)另一個則是刷屏(整屏刷)的介面,即將framebuffer中的資料送到lcd上,調用的是MDP DMA的介面
這部分的code在android/hardware/msm7k/libgralloc-qsd8k目錄下,之前沒有留意,以為沒有使用。現在可以看出開機初始化後就建立了disp_loop thread,裡面的操作就是調用系統介面
ioctl(m->framebuffer->fd, FBIOPUT_VSCREENINFO, &m->info)
將資料送到lcd
Note:送資料的時候是2個buffer切換的
另外,上層surfaceflinger也是通過Gralloc中的介面獲知螢幕的大小,調用介面為
ioctl(fd, FBIOGET_VSCREENINFO, &info),info中的螢幕寬高對應的就是底層driver設定的寬高值
6. OpenGL是什嗎?
它是一個影像處理引擎,當需要一些複雜的顯示(2D/3D)操作時會用到它。它分為SW方案和HW方案,軟體方案就是圖中的libagl.so,對應到目前項目中是libGLES_android.so,它可以完成簡單的2D(文字,icon等)處理,通過trace看目前大部分顯示操作都是它來完成的。
Note:它是軟體方案,處理好的資料是通過copybit送到framebuffer的,而不是GPU。
其介面部分參考:android/frameworks/base/opengl/libagl
HW方案就是圖中的Graphics driver,它通過使用GPU硬體來完成影像處理,處理後的資料直接送到framebuffer中。其介面部分參考:android/frameworks/base/opengl/libs(有幾個版本)
7. OpenGL在項目中是如何配置的?
在android/vendor/qcom/msm7627_ffa目錄下有一個egl.cfg檔案,裡面指定了目前的版本中的OpenGL資訊,目前如下:
0 0 android
0 1 adreno200
第一行代表該codebase支援SW 方案的OpenGL,是android default的
第二行代表該codebase也支援HW方案的OpenGL,是高通的adreno引擎
如果該cfg檔案為空白,則只支援default的SW方案。
如果2個方案都在,上層將根據實際應用自行選擇使用其一。
該部分請參考:android/frameworks/base/opengl/libs/EGL/loader.cpp
0. SurfaceFlinger主要功能
SurfaceFlinger只是負責merge Surface的控制,如計算出兩個Surface重疊的地區,至於Surface需要顯示的內容,則通過Skia、OpenGL和pixflinger來計算。
1. Ap是怎麼進行顯示的?
Surfaceflinger負責所有上層的顯示處理,對於AP(2D或是3D的應用程式)而言,只要到surfaceflinger中建立surface,設定好參數,接下來都是統一交給surfaceflinger進行處理
2. SurfaceFlinger是怎麼管理多個surface的?
不管有多少個surface,最終送到顯示部分的只能是螢幕大小資料,surfaceflinger中利用MDP或是GPU進行多個surface的合成處理,普通的合成MDP就可完成,但如果是複雜的比如3D的應用等就必須使用GPU,最終合成的好資料會被送到framebuffer中。
3. Framebuffer是什嗎?
Framebuffer是Linux中為顯示資料分配的一塊顯存(fb裝置中),通常大小是一整個螢幕資料的兩倍,對於上層AP而言,只需要將要顯示的資料丟到framebuffer中就OK了,但此時顯示資料並未真正的被送到LCD上,而是暫存在framebuffer中而已。
4. 上層是通過什麼方式將顯示內容送到framebuffer的?
有2個方式(二選一,不會同時在運行):
A、 普通的顯示,使用copybit(MDP)(未使用GPU)
Surfaceflinger通過copybit將要顯示的資料送到framebuffer。
Note:copybit可以看做是MDP PPP的介面,它提供了MDP的功能,如多個layer合成,scale、rotate等。
其介面在:android/hardware/msm7k/libcopybit/copybit.cpp
B、 使用GPU(即使用圖中的Graphics driver)
當進行複雜的顯示處理時,比如3D的應用,GPU把處理好的資料直接丟到framebuffer中,和MDP沒有任何關係
5. Framebuffer中的資料是如何被送到LCD顯示的?
圖中的Gralloc完成的。
Gralloc有2個功能:
1)一個是和copybit相同的,裡面有MDP PPP的介面(目前沒有使用)
2)另一個則是刷屏(整屏刷)的介面,即將framebuffer中的資料送到lcd上,調用的是MDP DMA的介面
這部分的code在android/hardware/msm7k/libgralloc-qsd8k目錄下,之前沒有留意,以為沒有使用。現在可以看出開機初始化後就建立了disp_loop thread,裡面的操作就是調用系統介面
ioctl(m->framebuffer->fd, FBIOPUT_VSCREENINFO, &m->info)
將資料送到lcd
Note:送資料的時候是2個buffer切換的
另外,上層surfaceflinger也是通過Gralloc中的介面獲知螢幕的大小,調用介面為
ioctl(fd, FBIOGET_VSCREENINFO, &info),info中的螢幕寬高對應的就是底層driver設定的寬高值
6. OpenGL是什嗎?
它是一個影像處理引擎,當需要一些複雜的顯示(2D/3D)操作時會用到它。它分為SW方案和HW方案,軟體方案就是圖中的libagl.so,對應到目前項目中是libGLES_android.so,它可以完成簡單的2D(文字,icon等)處理,通過trace看目前大部分顯示操作都是它來完成的。
Note:它是軟體方案,處理好的資料是通過copybit送到framebuffer的,而不是GPU。
其介面部分參考:android/frameworks/base/opengl/libagl
HW方案就是圖中的Graphics driver,它通過使用GPU硬體來完成影像處理,處理後的資料直接送到framebuffer中。其介面部分參考:android/frameworks/base/opengl/libs(有幾個版本)
7. OpenGL在項目中是如何配置的?
在android/vendor/qcom/msm7627_ffa目錄下有一個egl.cfg檔案,裡面指定了目前的版本中的OpenGL資訊,目前如下:
0 0 android
0 1 adreno200
第一行代表該codebase支援SW 方案的OpenGL,是android default的
第二行代表該codebase也支援HW方案的OpenGL,是高通的adreno引擎
如果該cfg檔案為空白,則只支援default的SW方案。
如果2個方案都在,上層將根據實際應用自行選擇使用其一。
該部分請參考:android/frameworks/base/opengl/libs/EGL/loader.cpp