高通Android平台下關於display部分的幾個關鍵問題

來源:互聯網
上載者:User

       顯示部分的幾個問題這幾天通過實際測試澄清了一下,主要是中各個模組的使用狀況以及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

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.