Android display架構分析七-Surfaceflinger process流程分析

根據前面的介紹,surfaceflinger作爲一個server process,上層的應用程序(作爲client)通過Binder方式與其進行通信。Surfaceflinger作爲一個thread,這裏把它分爲3個部分,如下:

1、 Thread本身處理部分,包括初始化以及thread loop。

2、 Binder部分,負責接收上層應用的各個設置和命令,並反饋狀態標誌給上層。

3、 與底層的交互,負責調用底層接口(HAL)。

結構圖如下:

註釋:

a、 Binder接收到應用程序的命令(如創建surface、設置參數等),傳遞給flinger。

b、 Flinger完成對應命令後將相關結果狀態反饋給上層。

c、 在處理上層命令過程中,根據需要設置event(主要和顯示有關),通知Thread Loop進行處理。

d、 Flinger根據上層命令通知底層進行處理(主要是設置一些參數,Layer、position等)

e、 Thread Loop中進行surface的合成並通知底層進行顯示(Post buffer)。

f、 DisplayHardware層根據flinger命令調用HAL進行HW的操作。

下面來具體分析一些SurfaceFlinger中重要的處理函數以及surface、Layer的屬性

1)、readToRun

SurfaceFlinger thread的初始化函數,主要任務是分配內存和設置底層接口(EGL&HAL)。

  1. status_t SurfaceFlinger::readyToRun()  
  2.    
  3. {  
  4.    
  5. …  
  6.    
  7. …  
  8.    
  9. mServerHeap = new MemoryDealer(4096, MemoryDealer::READ_ONLY);//爲IPC分配共享內存  
  10.    
  11. …  
  12.    
  13. mSurfaceHeapManager = new SurfaceHeapManager(this, 8 << 20);//爲flinger分配heap,大小爲8M,存放具體的顯示數據  
  14.    
  15.     {  
  16.    
  17.        // initialize the main display  
  18.    
  19.         GraphicPlane& plane(graphicPlane(dpy));  
  20.    
  21.         DisplayHardware* const hw = new DisplayHardware(this, dpy);  
  22.    
  23.         plane.setDisplayHardware(hw);//保存顯示接口  
  24.    
  25. }  
  26.    
  27. //獲取顯示相關參數  
  28.    
  29.     const GraphicPlane& plane(graphicPlane(dpy));  
  30.    
  31.     const DisplayHardware& hw = plane.displayHardware();  
  32.    
  33.     const uint32_t w = hw.getWidth();  
  34.    
  35.     const uint32_t h = hw.getHeight();  
  36.    
  37.     const uint32_t f = hw.getFormat();  
  38.    
  39. …  
  40.    
  41. …  
  42.    
  43.     // Initialize OpenGL|ES  
  44.    
  45.     glActiveTexture(GL_TEXTURE0);  
  46.    
  47.     glBindTexture(GL_TEXTURE_2D, 0);  
  48.    
  49.     glTexParameterx(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE);  
  50.    
  51.     glTexParameterx(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE);  
  52.    
  53.     glTexParameterx(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);  
  54.    
  55. …  
  56.    
  57. …  
  58.    
  59. }  


2)、ThreadLoop

Surfaceflinger的loop函數,主要是等待其他接口發送的event,進行顯示數據的合成以及顯示

  1. bool SurfaceFlinger::threadLoop()  
  2.    
  3. {  
  4.    
  5.     waitForEvent();//等待其他接口的signal event  
  6.    
  7. …  
  8.    
  9. …  
  10.    
  11.     // post surfaces (if needed)  
  12.    
  13.     handlePageFlip();//處理翻頁機制  
  14.    
  15.     const DisplayHardware& hw(graphicPlane(0).displayHardware());  
  16.    
  17.     if (LIKELY(hw.canDraw()))  
  18.    
  19.    {  
  20.    
  21.         // repaint the framebuffer (if needed)  
  22.    
  23.         handleRepaint();//合併所有layer並填充到buffer中去  
  24.    
  25. …  
  26.    
  27. …  
  28.    
  29.         postFramebuffer();//互換front buffer和back buffer,調用EGL接口進行顯示  
  30.    
  31.     }  
  32.    
  33. …  
  34.    
  35. …  
  36.    
  37. }  


3)、createSurface

提供給應用程序的主要接口,該接口可以創建一個surface,底層會根據參數創建layer以及分配內存,surface相關參數會反饋給上層

  1. sp<ISurface> SurfaceFlinger::createSurface(ClientID clientId, int pid,  
  2.    
  3.         ISurfaceFlingerClient::surface_data_t* params,  
  4.    
  5.         DisplayID d, uint32_t w, uint32_t h, PixelFormat format,  
  6.    
  7.         uint32_t flags)  
  8.    
  9. {  
  10.    
  11. …  
  12.    
  13. …  
  14.    
  15.     int32_t id = c->generateId(pid);  
  16.    
  17.     if (uint32_t(id) >= NUM_LAYERS_MAX) //NUM_LAYERS_MAX=31  
  18.    
  19.     {  
  20.    
  21.         LOGE("createSurface() failed, generateId = %d", id);  
  22.    
  23.         return  
  24.    
  25.     }  
  26.    
  27. …  
  28.    
  29. layer = createNormalSurfaceLocked(c, d, id, w, h, format, flags);//創建layer,根據參數(寬高格式)分配內存(共2個buffer:front/back buffer)  
  30.    
  31.     if (layer)  
  32.    
  33.     {  
  34.    
  35.         setTransactionFlags(eTransactionNeeded);  
  36.    
  37.         surfaceHandle = layer->getSurface();//創建surface  
  38.    
  39.         if (surfaceHandle != 0)  
  40.    
  41.             surfaceHandle->getSurfaceData(params);//創建的surface參數反饋給應用層  
  42.    
  43.     }  
  44.    
  45. }  


4)、setClientState

處理上層的各個命令,並根據flag設置event通知Threadloop進行處理

  1. status_t SurfaceFlinger::setClientState(  
  2.    
  3.         ClientID cid,  
  4.    
  5.         int32_t count,  
  6.    
  7.         const layer_state_t* states)  
  8.    
  9. {  
  10.    
  11.     Mutex::Autolock _l(mStateLock);  
  12.    
  13.     uint32_t flags = 0;  
  14.    
  15.     cid <<= 16;  
  16.    
  17.     for (int i=0 ; i<count ; i++) //檢測所有存在layer的狀態標誌  
  18.    
  19.     {  
  20.    
  21.         const layer_state_t& s = states[i];  
  22.    
  23.         LayerBaseClient* layer = getLayerUser_l(s.surface | cid);  
  24.    
  25.         if (layer)  
  26.    
  27.              {  
  28.    
  29.             const uint32_t what = s.what;  
  30.    
  31.             // 檢測應用層是否設置各個標誌,如果有則通知底層完成對應操作,並通知ThreadLoop做對應的處理  
  32.    
  33.             if (what & eDestroyed) //刪除該層Layer  
  34.    
  35.                  {  
  36.    
  37.                 if (removeLayer_l(layer) == NO_ERROR)  
  38.    
  39.                  {  
  40.    
  41.                     flags |= eTransactionNeeded;  
  42.    
  43.                     continue;  
  44.    
  45.                 }  
  46.    
  47.             }  
  48.    
  49.             if (what & ePositionChanged) //顯示位置變化  
  50.    
  51.                  {  
  52.    
  53.                 if (layer->setPosition(s.x, s.y))  
  54.    
  55.                     flags |= eTraversalNeeded;  
  56.    
  57.             }  
  58.    
  59.             if (what & eLayerChanged) //Layer改變  
  60.    
  61.                  {  
  62.    
  63.                 if (layer->setLayer(s.z))  
  64.    
  65.                   {  
  66.    
  67.                     mCurrentState.layersSortedByZ.reorder(  
  68.    
  69.                             layer, &Layer::compareCurrentStateZ);  
  70.    
  71.                     flags |= eTransactionNeeded|eTraversalNeeded;  
  72.    
  73.                 }  
  74.    
  75.             }  
  76.    
  77.             if (what & eSizeChanged)  
  78.    
  79.                   {  
  80.    
  81.                 if (layer->setSize(s.w, s.h))//設置寬高變化  
  82.    
  83.                     flags |= eTraversalNeeded;  
  84.    
  85.             }  
  86.    
  87.             if (what & eAlphaChanged) {//設置Alpha效果  
  88.    
  89.                 if (layer->setAlpha(uint8_t(255.0f*s.alpha+0.5f)))  
  90.    
  91.                   flags |= eTraversalNeeded;  
  92.    
  93.             }  
  94.    
  95.             if (what & eMatrixChanged) {//矩陣參數變化  
  96.    
  97.                 if (layer->setMatrix(s.matrix))  
  98.    
  99.                     flags |= eTraversalNeeded;  
  100.    
  101.             }  
  102.    
  103.             if (what & eTransparentRegionChanged) {//顯示區域變化  
  104.    
  105.                 if (layer->setTransparentRegionHint(s.transparentRegion))  
  106.    
  107.                     flags |= eTraversalNeeded;  
  108.    
  109.             }  
  110.    
  111.             if (what & eVisibilityChanged) {//是否顯示  
  112.    
  113.                 if (layer->setFlags(s.flags, s.mask))  
  114.    
  115.                     flags |= eTraversalNeeded;  
  116.    
  117.             }  
  118.    
  119.         }  
  120.    
  121.     }  
  122.    
  123. if (flags)  
  124.    
  125. {  
  126.    
  127.         setTransactionFlags(flags);//通過signal通知ThreadLoop  
  128.    
  129.     }  
  130.    
  131.     return NO_ERROR;  
  132.    
  133. }  


5)、composeSurfaces

該接口在Threadloop中被調用,負責將所有存在的surface進行合併,OpenGl模塊負責這個部分。

6)、postFramebuffer

該接口在Threadloop中被調用,負責將合成好的數據(存於back buffer中)推入在front buffer中,然後調用HAL接口命令底層顯示。

7)、從3中可知,上層每創建一個surface的時候,底層都會同時創建一個layer,下面看一下surface及layer的相關屬性。

Note:code中相關結構體太大,就不全部羅列出來了

A、Surface相關屬性(詳細參考文件surface.h)

a1:SurfaceID:根據此ID把相關surface和layer對應起來

a2:SurfaceInfo

包括寬高格式等信息

a3:2個buffer指針、buffer索引等信息

B、Layer相關屬性(詳細參考文件layer.h/layerbase.h/layerbitmap.h)

包括Layer的ID、寬高、位置、layer、alpha指、前後buffer地址及索引、layer的狀態信息(如eFlipRequested、eBusy、eLocked等)


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章