Surfaceflinger 概述



Android图像显示流程

ApplicationàSkia/OpenGLàSurface,Surface,Surface,...                                                      

FrameBufferßOpenGLßSurfaceFlingerßSurface,Surface,Surface,....

由此可知,Surface分为2大部分:AppSurfaceSFSurface

AppSurfaceApp画出每一个Surface

SFSurfaceSF将所有Surface的内容混合,投递至FB显示

接下来主要分析第二部分,即SurfaceFlingerSurface的关系





SurfaceFlinger主线程的位置


    bool SurfaceFlinger::threadLoop(){}


    (位frameworks/base/services/surfaceflinger/SurfaceFlinger.cpp中)


SurfaceFlinger主线程的作用


    混合图像


   (将各个Surface传输的数据混合后,传输到FrameBuffer中显示)





SurfaceFlinger主线程主要分5


   1waitForEvent


             (等待事件


    2handleTransaction


             (处理事务)


    3handlePageFlip


             (处理翻页)


    4handleRepaint


             (处理重绘)


   5postFrameBuffer


             (投递缓冲)




先看代码


waitForEvent()


{


   ....


    case MessageQueue::INVALIDATE:


        return;


    ....


}


当收到INVALIDATE这个消息后,便退出,执行主线程下一步


该消息的流程为


unlockCanvasAndPost()==>queueBuffer()==>mClient.signalServer()==>


mComposerService->signal()==>signal()==>signalEvent()==>


mEventQueue.invalidate()==>invalidate()==>mCondition.signal()



先看代码


handleTransaction()


{


   ....


    handleTransactionLocked(transactionFlags,ditchedLayers);


    ....


    ditchedLayers[i]->ditch();


    ....


}


这主要是处理一些Layer的控制操作


比如setPosition, setAlpha, show/hide,setSize, setFlag


ditch掉一些layer,比如该layer被遮住了




先看代码


handlePageFlip()


{


   ....


    lockPageFlip();   


    ....


    unlockPageFlip();


    ....


}


先通lockPageFlip()FrontBuffer的内容生成一张纹理


再通unlockPageFlip()做一些区域清理工作


样每个layer都准备好了新数据,执行主线程下一步



先看代码


handleRepaint()


{


    ....


    composeSurfaces();


    ....


}


composeSurfaces()函数将不同layer的内容进行混合


即按照Z轴顺序从里到外依次绘制,这是通过OpenGL实现的


具体流程


composeSurfaces()==>layer->draw()==>draw()==>onDraw()==>


drawWithOpenGL()==>validateTexture(),...,一系列OpenGL函数





先看代码


postFramebuffer()


{


   ....


    hw.flip();


    ....


}


先调hw.flip()flip()再调eglSwapBuffers()将混合后的图像转递到屏幕


样一张图就显示在屏幕上了



SurfaceFlinger投递完图像之后的流程是


framebuffer_device.cpp==>post_fb()==>ioctl()==>linuxframebuffer==>lcd


你可能感兴趣的:(Surfaceflinger 概述)