HwUI绘制
硬件加速绘制流程
每次硬件加速绘制都会调用Surface.unlockCanvasAndPost
Surface.unlockCanvasAndPost()
-> HwuiContext::unlockAndPost()
->HardwareRenderer::syncAndDraw()
->RenderProxy.cpp ::syncAndDrawFrame()
-> DrawFrameTask::drawFrame()
-> DrawFrameTask::run() 渲染线程开始执行绘制操作
-> DrawFrameTask::syncFrameState 与主线程同步数据,这个阶段在用AutoMutex加锁,主线程等待
->CanvasContext::prepareTree
-> CanvasContext::draw 通过调用OpenGLPipeline方法开始绘制
->SkSurface::flushAndSubmit()
->SkiaOpenGLPipeline::swapBuffers (CanvasContext::draw()中调用)交换buffer 到SurfaceFlinger
->eglSwapBuffersWithDamageKHR()该方法执行完成后,将回调ANativeWindow::queueBuffer进一步回调到Surface::hook_queueBuffer() 到现在应用进程绘制完成
SurfaceFlinger 合成
- handleMessageInvalidate
-> handlePageFlip获取Predictor queue 进来的Buffer,更新可见脏区 mVisibleRegionsDirty
-> acquireBuffer拿到Buffer后,将Buffer保存在mSlots[item->mSlot].mGraphicBuffer中。同时更新mFrameNumber和mFence - onMessageRefresh
- prepareFrame
和Hwbinder 通信选择合成策略,需要显示的数据已经送到HWC,且每一层Layer的合成方式已经确定,Buffer也只是将Buffer的handle传给底层的HWC,并没有传Buffer里面的内容,这里创建底层HWCLayer - finishFrame
finishFrame 主要处理需要GPU合成的layer,将Client端的Layer渲染到FBTarget(GPU 作为client dequeueBuffer进行渲染,然后通过queueBuffer到BufferQueue,再acquireBuffer ,将各layer 合成后的数据保存在FBTarget,通过setClientTarget给HWC设置Client端的合成结果,传给底层进行显示) - postFramebuffer
告诉HWC开始做最后的合成了,包括client和device合成 - postComposition
到此一次合成处理完成,REFRESH处理完成。下一个Vsync到来时,新的一次合成
- prepareFrame