Android Surfac eFlinger process 流程分析

原文链接:http://hi.baidu.com/leowenj/blog/item/7abbe33a309367ff3b87ce6f.html

------------------------------------------------------------------------------------------------------------------------


根据前面的介绍,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

SurfaceFlingerthread的初始化函数,主要任务是分配内存和设置底层接口(EGL&HAL)。

  1. status_tSurfaceFlinger::readyToRun()
  2. mServerHeap=newMemoryDealer(4096,MemoryDealer::READ_ONLY);//为IPC分配共享内存
  3. mSurfaceHeapManager=newSurfaceHeapManager(this,8<<20);//为flinger分配heap,大小为8M,存放具体的显示数据
  4. {
  5. //initializethemaindisplay
  6. GraphicPlane&plane(graphicPlane(dpy));
  7. DisplayHardware*consthw=newDisplayHardware(this,dpy);
  8. plane.setDisplayHardware(hw);//保存显示接口
  9. }
  10. //获取显示相关参数
  11. constGraphicPlane&plane(graphicPlane(dpy));
  12. constDisplayHardware&hw=plane.displayHardware();
  13. constuint32_tw=hw.getWidth();
  14. constuint32_th=hw.getHeight();
  15. constuint32_tf=hw.getFormat();
  16. //InitializeOpenGL|ES
  17. glActiveTexture(GL_TEXTURE0);
  18. glBindTexture(GL_TEXTURE_2D,0);
  19. glTexParameterx(GL_TEXTURE_2D,GL_TEXTURE_WRAP_S,GL_CLAMP_TO_EDGE);
  20. glTexParameterx(GL_TEXTURE_2D,GL_TEXTURE_WRAP_T,GL_CLAMP_TO_EDGE);
  21. glTexParameterx(GL_TEXTURE_2D,GL_TEXTURE_MAG_FILTER,GL_NEAREST);

2)、ThreadLoop

Surfaceflinger的loop函数,主要是等待其他接口发送的event,进行显示数据的合成以及显示

  1. boolSurfaceFlinger::threadLoop()
  2. {
  3. waitForEvent();//等待其他接口的signalevent
  4. //postsurfaces(ifneeded)
  5. handlePageFlip();//处理翻页机制
  6. constDisplayHardware&hw(graphicPlane(0).displayHardware());
  7. if(LIKELY(hw.canDraw()))
  8. {
  9. //repainttheframebuffer(ifneeded)
  10. handleRepaint();//合并所有layer并填充到buffer中去
  11. postFramebuffer();//互换frontbuffer和backbuffer,调用EGL接口进行显示
  12. }
  13. }

3)、createSurface

提供给应用程序的主要接口,该接口可以创建一个surface,底层会根据参数创建layer以及分配内存,surface相关参数会反馈给上层

  1. sp<ISurface>SurfaceFlinger::createSurface(ClientIDclientId,intpid,
  2. ISurfaceFlingerClient::surface_data_t*params,
  3. DisplayIDd,uint32_tw,uint32_th,PixelFormatformat,
  4. uint32_tflags)
  5. int32_tid=c->generateId(pid);
  6. if(uint32_t(id)>=NUM_LAYERS_MAX)//NUM_LAYERS_MAX=31
  7. {
  8. LOGE("createSurface()failed,generateId=%d",id);
  9. return
  10. }
  11. layer=createNormalSurfaceLocked(c,d,id,w,h,format,flags);//创建layer,根据参数(宽高格式)分配内存(共2个buffer:front/backbuffer)
  12. if(layer)
  13. {
  14. setTransactionFlags(eTransactionNeeded);
  15. surfaceHandle=layer->getSurface();//创建surface
  16. if(surfaceHandle!=0)
  17. surfaceHandle->getSurfaceData(params);//创建的surface参数反馈给应用层
  18. }

4)、setClientState

处理上层的各个命令,并根据flag设置event通知Threadloop进行处理

  1. status_tSurfaceFlinger::setClientState(
  2. ClientIDcid,
  3. int32_tcount,
  4. constlayer_state_t*states)
  5. {
  6. Mutex::Autolock_l(mStateLock);
  7. uint32_tflags=0;
  8. cid<<=16;
  9. for(inti=0;i<count;i++)//检测所有存在layer的状态标志
  10. {
  11. constlayer_state_t&s=states[i];
  12. LayerBaseClient*layer=getLayerUser_l(s.surface|cid);
  13. if(layer)
  14. {
  15. constuint32_twhat=s.what;
  16. //检测应用层是否设置各个标志,如果有则通知底层完成对应操作,并通知ThreadLoop做对应的处理
  17. if(what&eDestroyed)//删除该层Layer
  18. {
  19. if(removeLayer_l(layer)==NO_ERROR)
  20. {
  21. flags|=eTransactionNeeded;
  22. continue;
  23. }
  24. }
  25. if(what&ePositionChanged)//显示位置变化
  26. {
  27. if(layer->setPosition(s.x,s.y))
  28. flags|=eTraversalNeeded;
  29. }
  30. if(what&eLayerChanged)//Layer改变
  31. {
  32. if(layer->setLayer(s.z))
  33. {
  34. mCurrentState.layersSortedByZ.reorder(
  35. layer,&Layer::compareCurrentStateZ);
  36. flags|=eTransactionNeeded|eTraversalNeeded;
  37. }
  38. }
  39. if(what&eSizeChanged)
  40. {
  41. if(layer->setSize(s.w,s.h))//设置宽高变化
  42. flags|=eTraversalNeeded;
  43. }
  44. if(what&eAlphaChanged){//设置Alpha效果
  45. if(layer->setAlpha(uint8_t(255.0f*s.alpha+0.5f)))
  46. flags|=eTraversalNeeded;
  47. }
  48. if(what&eMatrixChanged){//矩阵参数变化
  49. if(layer->setMatrix(s.matrix))
  50. flags|=eTraversalNeeded;
  51. }
  52. if(what&eTransparentRegionChanged){//显示区域变化
  53. if(layer->setTransparentRegionHint(s.transparentRegion))
  54. flags|=eTraversalNeeded;
  55. }
  56. if(what&eVisibilityChanged){//是否显示
  57. if(layer->setFlags(s.flags,s.mask))
  58. flags|=eTraversalNeeded;
  59. }
  60. }
  61. }
  62. if(flags)
  63. {
  64. setTransactionFlags(flags);//通过signal通知ThreadLoop
  65. }
  66. returnNO_ERROR;
  67. }

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等)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值