根據前面的介紹,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)。
- status_t SurfaceFlinger::readyToRun()
- {
- …
- …
- mServerHeap = new MemoryDealer(4096, MemoryDealer::READ_ONLY);//爲IPC分配共享內存
- …
- mSurfaceHeapManager = new SurfaceHeapManager(this, 8 << 20);//爲flinger分配heap,大小爲8M,存放具體的顯示數據
- {
- // initialize the main display
- GraphicPlane& plane(graphicPlane(dpy));
- DisplayHardware* const hw = new DisplayHardware(this, dpy);
- plane.setDisplayHardware(hw);//保存顯示接口
- }
- //獲取顯示相關參數
- const GraphicPlane& plane(graphicPlane(dpy));
- const DisplayHardware& hw = plane.displayHardware();
- const uint32_t w = hw.getWidth();
- const uint32_t h = hw.getHeight();
- const uint32_t f = hw.getFormat();
- …
- …
- // Initialize OpenGL|ES
- glActiveTexture(GL_TEXTURE0);
- glBindTexture(GL_TEXTURE_2D, 0);
- glTexParameterx(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE);
- glTexParameterx(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE);
- glTexParameterx(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
- …
- …
- }
2)、ThreadLoop
Surfaceflinger的loop函數,主要是等待其他接口發送的event,進行顯示數據的合成以及顯示
- bool SurfaceFlinger::threadLoop()
- {
- waitForEvent();//等待其他接口的signal event
- …
- …
- // post surfaces (if needed)
- handlePageFlip();//處理翻頁機制
- const DisplayHardware& hw(graphicPlane(0).displayHardware());
- if (LIKELY(hw.canDraw()))
- {
- // repaint the framebuffer (if needed)
- handleRepaint();//合併所有layer並填充到buffer中去
- …
- …
- postFramebuffer();//互換front buffer和back buffer,調用EGL接口進行顯示
- }
- …
- …
- }
3)、createSurface
提供給應用程序的主要接口,該接口可以創建一個surface,底層會根據參數創建layer以及分配內存,surface相關參數會反饋給上層
- sp<ISurface> SurfaceFlinger::createSurface(ClientID clientId, int pid,
- ISurfaceFlingerClient::surface_data_t* params,
- DisplayID d, uint32_t w, uint32_t h, PixelFormat format,
- uint32_t flags)
- {
- …
- …
- int32_t id = c->generateId(pid);
- if (uint32_t(id) >= NUM_LAYERS_MAX) //NUM_LAYERS_MAX=31
- {
- LOGE("createSurface() failed, generateId = %d", id);
- return
- }
- …
- layer = createNormalSurfaceLocked(c, d, id, w, h, format, flags);//創建layer,根據參數(寬高格式)分配內存(共2個buffer:front/back buffer)
- if (layer)
- {
- setTransactionFlags(eTransactionNeeded);
- surfaceHandle = layer->getSurface();//創建surface
- if (surfaceHandle != 0)
- surfaceHandle->getSurfaceData(params);//創建的surface參數反饋給應用層
- }
- }
4)、setClientState
處理上層的各個命令,並根據flag設置event通知Threadloop進行處理
- status_t SurfaceFlinger::setClientState(
- ClientID cid,
- int32_t count,
- const layer_state_t* states)
- {
- Mutex::Autolock _l(mStateLock);
- uint32_t flags = 0;
- cid <<= 16;
- for (int i=0 ; i<count ; i++) //檢測所有存在layer的狀態標誌
- {
- const layer_state_t& s = states[i];
- LayerBaseClient* layer = getLayerUser_l(s.surface | cid);
- if (layer)
- {
- const uint32_t what = s.what;
- // 檢測應用層是否設置各個標誌,如果有則通知底層完成對應操作,並通知ThreadLoop做對應的處理
- if (what & eDestroyed) //刪除該層Layer
- {
- if (removeLayer_l(layer) == NO_ERROR)
- {
- flags |= eTransactionNeeded;
- continue;
- }
- }
- if (what & ePositionChanged) //顯示位置變化
- {
- if (layer->setPosition(s.x, s.y))
- flags |= eTraversalNeeded;
- }
- if (what & eLayerChanged) //Layer改變
- {
- if (layer->setLayer(s.z))
- {
- mCurrentState.layersSortedByZ.reorder(
- layer, &Layer::compareCurrentStateZ);
- flags |= eTransactionNeeded|eTraversalNeeded;
- }
- }
- if (what & eSizeChanged)
- {
- if (layer->setSize(s.w, s.h))//設置寬高變化
- flags |= eTraversalNeeded;
- }
- if (what & eAlphaChanged) {//設置Alpha效果
- if (layer->setAlpha(uint8_t(255.0f*s.alpha+0.5f)))
- flags |= eTraversalNeeded;
- }
- if (what & eMatrixChanged) {//矩陣參數變化
- if (layer->setMatrix(s.matrix))
- flags |= eTraversalNeeded;
- }
- if (what & eTransparentRegionChanged) {//顯示區域變化
- if (layer->setTransparentRegionHint(s.transparentRegion))
- flags |= eTraversalNeeded;
- }
- if (what & eVisibilityChanged) {//是否顯示
- if (layer->setFlags(s.flags, s.mask))
- flags |= eTraversalNeeded;
- }
- }
- }
- if (flags)
- {
- setTransactionFlags(flags);//通過signal通知ThreadLoop
- }
- return NO_ERROR;
- }
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等)