android JB surfaceflinger重点

来源:互联网 发布:淘宝外卖会员卡好用吗 编辑:程序博客网 时间:2024/05/21 17:04

 

vsync:

vsync从hardwarecomposer拿到。 hardwarecomposer调用surfaceflinger的基类eventhandler的onVSyncReceived, 将event通知给surfceflinger, surfacflinger的onVSyncReceived调用EventThread的onVSyncReceived, 将message通知给MessageQueue的Looper, Looper会调用MessageQueue注册的event callback, 这个callback调用MessageQueue的Looper的sendMessage给looper。MessageQueue::waitMessage中的mLooper->pollOnce(-1)将会调用MessageQueue::Handler::handleMessage(handler继承自MessageHandler)处理前面发送给looper的message。 在handleMessage中, handler的dispatchInvalidate将会调用MessageQueue::mFlinger的onMessageReceived将此消息通知给surfaceflinger。然后surfaceflinger调用hardwarecomposer或者gralloc的相关函数进行后续操作。

这样来自hardwarecomposer的vsync的事件的处理在MessageQueue这一层跟来自surfaceflinge的上层的应用的invalidate和refresh的请求统一起来(onframeavailable)。(这也是为何surfaceflnger不直接处理来自hardwarecomposer的vsync的原因)。

 

初始化:

mReadyToRunBarrier用于线程同步, wait是等待, open是通知退出等待。(这里主要是system server主线程需要等待surfaceflinger的readyToRun完成)。

onFirstRef将调用Thread的run函数。在run中, 将会创建_threadloop线程. 这个线程第一次运行的时候, 调用readyToRun, hardwarecomposer将被初始化, 并且egl等将根据hwc的返回值被初始化。

在readyToRun的结尾, startBootAnim将被调用,   两个属性被设置:

 property_set("service.bootanim.exit", "0");
 property_set("ctl.start", "bootanim");

其中属性service.bootanim.exit在bootFinished时被设为1.  在android的以前的版本中没有这个属性, 而是处理 property_set("ctl.stop", "bootanim");

 

在_threadloop线程中, surfaceflinger的threadloop将被调用。 这个threadloop调用eventqueue的waitMessage, waitMessage将调用mLooper->pollOnce的, 这个pollOnce将调用MessageQueue::Handler::handleMessage(如前所述)。

 

 

native client在libgui中, createsurface的参数不尽相同。 transaction的函数名字也变了。

 

client createsurface:

createSurface will call surfaceflinger's createLayer and produce ISurface and  SurfaceComposerClient will produce SurfaceControl based on ISurface and return it.

 

client getsurface:

SurfaceControl's getsurface returns Surface. Surface includes ISurface. setISurfaceTexture(surfaceTexture) and setUsage(USAGE_HW_RENDER) will be called.
surface'sgetSurfaceTexture()  will call Layer's BSurface's getSurfaceTexture。  BSurface inherits from BnSurface. client side's Surface inherits from SurfaceTextureClient.
Layer's SurfaceTexture will call getBufferQueue to get ISurfaceTexture

 

 

 client lock:

 Surface's lock will call SurfaceTextureClient::lock to get ANativeWindow_Buffer(outputbuffer) and transfer it to SurfaceInfo. lock calls dequeueBuffer. dequeueBuffer calls SurfaceTexture's dequeueBuffer and got buffer from bufferslot. If slotbuffer is empty, will requestBuffer. GraphicBuffer(backBuffer) lock is called. when dequeuebuffer, graphicbuffer will be created, which call gralloc's allocate function to get gfx buffer

 

 

client unlock:

Surface's unlock will call SurfaceTextureClient::unlock . backbuffer's unlock is called. queueBuffer to queue backbuffer. SurfaceTexture's queueBuffer is called. Then listener->onFrameAvailable will be called, then surfaceflinger knows the change.

 

 

ConsumerBase's onFrameAvailable是Implementation of the BufferQueue::ConsumerListener interface。

 

 

SurfaceTexture inherits from ConsumerBase, surfaceflinger's lay will register setFrameAvailableListener to client, when unlockandpost, the onFrameAvailable will be called.

When Layer is create and first time run, based on SurfaceTextureLayer, bufferqueue will be created, and it will be transfered to SurfaceText(layer.cpp)

 

SurfaceTexture has no onframeavailable member function. And its parent class's onframeavailable will be used. Thus Layer::FrameQueuedListener will be called, but FramebufferSurface has onframeavailable member function and will cover its parent class ComsumerBase's onframeavailable member function.FramebufferSurface's BufferQueue is produced in the internal of FramebufferSurface

 

in DisplayDevice::init, SurfaceTextureClient will be registered as egl's window surface.SurfaceTextureClient includes FramebufferSurface's bufferqueue and inherits from ANativeWindow. in SurfaceTextureClient, queuebuffer's hook function should be called by egl!!!! Thus queuebuffer's queuebuffer will be called and onframeavailable will be called. Thus FramebufferSurface's onframeavailable will be called.

 

 

client的createSurface将在surfaceflinge测创建layer。 layer线程第一次run的时候生成SurfaceTexture。

 

client的surface继承自SurfaceTextureClient。

 client的getsurface将调用layer的createsurface。 这生成isurface。 isurface包含继承自bnsurface的getSurfaceTexture。surface的init中将调用父类的setISurfaceTexture初始化父类的mSurfaceTexture。

BufferQueue继承bnSurfaceTexture.  SurfaceTextureClient的queuebuffer调用mSurfaceTexture的queuebufer, 最终调用服务器BufferQueue的queueBuffer(在layer的onFirstRef生成).

所以, client的unlock将会最终调用layer的onframeavailable通知buffer变化。

 

FramebufferSurface继承自consumebase, 并生成queuebuffer。 framebuffersurface的onframeavailble复写consumebase的onframeavailable, 当queuebuffer的queuebuffer被调用时,framebuffersurface的onframeavailable将被调用。framebuffersurface设置了queuebuffer的下面的userbits:GRALLOC_USAGE_HW_FB|GRALLOC_USAGE_HW_RENDER |GRALLOC_USAGE_HW_COMPOSER。

这里的queuebuffer(SurfaceTextureClient的hook_queueBuffer_DEPRECATED)将被egl调用(nativewindow, DisplayDevice::init的eglCreateWindowSurface)。

 

 

一般流程:

应用层的lock调用dequeuebuffer从gralloc的gfx中得到buffer. 然后应用程序填充buffer,  应用层的unlock调用dequeubuffer, 引起onframeavailable调用, 再引起surfaceflinger的invalidate和refresh. 在surfaceflinger的transactionhandle里, 生成framebuffer, 供opengl es进行各层的新的compose. framebuffer的dequeuebuffer/queuebuffer将被opengl es调用, 将各层的dirty区域(包括alpha) blend到framebuffer上。

 

 

 

 

 

 

原创粉丝点击