欢迎来到天天文库
浏览记录
ID:37916301
大小:73.50 KB
页数:9页
时间:2019-06-02
《Android display架构分析七-Surfaceflinger process流程分析》由会员上传分享,免费在线阅读,更多相关内容在教育资源-天天文库。
1、Androiddisplay架构分析七-Surfaceflingerprocess流程分析根据前面的介绍,surfaceflinger作为一个serverprocess,上层的应用程序(作为client)通过Binder方式与其进行通信。Surfaceflinger作为一个thread,这里把它分为3个部分,如下:1、Thread本身处理部分,包括初始化以及threadloop。2、Binder部分,负责接收上层应用的各个设置和命令,并反馈状态标志给上层。3、与底层的交互,负责调用底层接口(HAL)。结构图如下:注释:a、Binder接收到应用程序的命令(如创建surface、设置参数
2、等),传递给flinger。b、Flinger完成对应命令后将相关结果状态反馈给上层。c、在处理上层命令过程中,根据需要设置event(主要和显示有关),通知ThreadLoop进行处理。d、Flinger根据上层命令通知底层进行处理(主要是设置一些参数,Layer、position等)e、ThreadLoop中进行surface的合成并通知底层进行显示(Postbuffer)。f、DisplayHardware层根据flinger命令调用HAL进行HW的操作。下面来具体分析一些SurfaceFlinger中重要的处理函数以及surface、Layer的属性1)、readToRunSu
3、rfaceFlingerthread的初始化函数,主要任务是分配内存和设置底层接口(EGL&HAL)。123456789101112131415161718192021222324252627282930status_tSurfaceFlinger::readyToRun() { … … mServerHeap=newMemoryDealer(4096,MemoryDealer::READ_ONLY);//为IPC分配共享内存 … mSurfaceHeapManager=newSurfaceHeapManager(this,8<<20);//为flinger分配heap,大小为8M,存
4、放具体的显示数据 { //initializethemaindisplay GraphicPlane&plane(graphicPlane(dpy)); DisplayHardwareconsthw=newDisplayHardware(this,dpy); plane.setDisplayHardware(hw);//保存显示接口 } //获取显示相关参数 3132333435363738394041424344454647484950515253545556575859constGraphicPlane&plane(graphicPlane(dpy)); constDisplayH
5、ardware&hw=plane.displayHardware(); constuint32_tw=hw.getWidth(); constuint32_th=hw.getHeight(); constuint32_tf=hw.getFormat(); … … //InitializeOpenGLES glActiveTexture(GL_TEXTURE0); glBindTexture(GL_TEXTURE_2D,0); glTexParameterx(GL_TEXTURE_2D,GL_TEXTURE_WRAP_S,GL_CLAMP_TO_EDGE); glTexParameter
6、x(GL_TEXTURE_2D,GL_TEXTURE_WRAP_T,GL_CLAMP_TO_EDGE); glTexParameterx(GL_TEXTURE_2D,GL_TEXTURE_MAG_FILTER,GL_NEAREST); … … }2)、ThreadLoopSurfaceflinger的loop函数,主要是等待其他接口发送的event,进行显示数据的合成以及显示123456boolSurfaceFlinger::threadLoop() { waitForEvent();//等待其他接口的signalevent 789101112131415161718192021222
7、32425262728293031323334353637… … //postsurfaces(ifneeded) handlePageFlip();//处理翻页机制 constDisplayHardware&hw(graphicPlane(0).displayHardware()); if(LIKELY(hw.canDraw())) { //repainttheframebuffer(ifneeded) handleRepaint();//合
此文档下载收益归作者所有