文档标记说明
################# 消息边界
+++++++++++++++++ 区域分隔
$$$$$$$$$$$$$$$$$ 线程边界
~~~~~~~~~~~~~~~~~ 进程边界
----------------- 代码块功能模块分隔
+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 创建GLES20Canvas Render
GLES20Canvas() [GLES20Canvas.java]
|--> android_view_GLES20Canvas_createLayerRenderer() [android_view_GLES20Canvas.cpp]
|--> OpenGLRenderer* renderer = new LayerRenderer(layer); +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ Fragment
|-->LocalActivityManager.startActivity() [frameworks/base/core/java/android/app/LocalActivityManager.java]
|-->LocalActivityManager.moveToState() [frameworks/base/core/java/android/app/LocalActivityManager.java]
|-->ActivityThread.startActivityNow() [frameworks/base/core/java/android/app/ActivityThread.java]
+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Launcher 启动 Activity 流程 |-->Activity.startActivity()
|-->mInstrumentation.execStartActivity()
|-->ActivityManagerProxy.startActivity()
~~~~~~~~~~~~~~~~~~~~~~| |~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
Process.ActivityManagerService
|-->ActivityManagerService.startActivityAsUser
|--> ...
|-->ActivityManagerService.startProcessLocked() [frameworks/base/services/java/com/android/server/am/ActivityManagerService.java]
~~~~~~~~~~~~~~~~~~~~~~| |~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
Process.Activity
|-->ActivityThread.main()
|-->ActivityThread.attach(false)
|-->ActivityManagerProxy.attachApplication() [frameworks/base/core/java/android/app/ActivityManagerNative.java]
~~~~~~~~~~~~~~~~~~~~~~| |~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
Process.ActivityManagerService
|-->ActivityManagerService.attachApplication()
|-->ActivityManagerService.attachApplicationLocked()
|-->mMainStack.topRunningActivityLocked() [frameworks/base/services/java/com/android/server/am/ActivityStack.java]
|-->mMainStack.realStartActivityLocked()
|-->ApplicationThreadProxy.scheduleLaunchActivity() [frameworks/base/core/java/android/app/ApplicationThreadNative.java]
~~~~~~~~~~~~~~~~~~~~~~| |~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
Process.Activity
|-->ApplicationThread.scheduleLaunchActivity()
|-->ApplicationThread.queueOrSendMessage() // Binder
#########################| sendMessage |###################################################################
H mH ActivityThread.mLooper
########################| handleMessage| ##################################################################
|-->ActivityThread.handleMessage
|-->ActivityThread.handleLaunchActivity()
. |-->ActivityThread.performLaunchActivity()
. |-->mInstrumentation.newActivity() [frameworks/base/core/java/android/app/Instrumentation.java]
. |-->LoadedApk.makeApplication() [frameworks/base/core/java/android/app/LoadedApk.java]
. |-->ActivityThread.createBaseContextForActivity()
. |-->activity.attach() [frameworks/base/core/java/android/app/Activity.java]
. |-->PolicyManager.makeNewWindow(this)[frameworks/base/core/j×/com/android/inter/policy/PolicyManager.java]
. |-->PhoneWindow.setWindowManager()
. |-->getSystemService(Context.WINDOW_SERVICE)
. |-->WindowManagerImpl.createLocalWindowManager(); 创建窗口mWindowManager
. |-->mInstrumentation.callActivityOnCreate()
. |-->activity.performCreate() [frameworks/base/core/java/android/app/Activity.java]
. |-->Activity.onCreate()
. |-->Activity.setContentView()
. |-->PhoneWindow.setContentView() [*/policy/impl/PhoneWindow.java]
. |-->PhoneWindow.installDecor()
. |-->mContentParent = PhoneWindow.generateLayout(mDecor)
. |-->activity.performStart() [frameworks/base/core/java/android/app/Activity.java]
. |-->mInstrumentation.callActivityOnRestoreInstanceState()
. |-->activity.performRestoreInstanceState() [frameworks/base/core/java/android/app/Activity.java]
. |-->mInstrumentation.callActivityOnPostCreate() [frameworks/base/core/java/android/app/Instrumentation.java]
. |-->activity.onPostCreate() [frameworks/base/core/java/android/app/Activity.java]
|-->ActivityThread.handleResumeActivity() 激活 Activity
|-->ActivityThread.performResumeActivity()
|-->Activity.performResume()
|-->Activity.performRestart()
. |-->Instrumentation.callActivityOnRestart()
. |-->Activity.onRestart()
|-->Activity.performStart()
. |-->Instrumentation.callActivityOnStart()
. |-->Activity.onStart()
|-->Instrumentation.callActivityOnResume()
. |-->Activity.onResume()
|-->Activity.onPostResume()
|-->WindowManagerImpl.addView() [frameworks/base/core/java/android/view/WindowManagerImpl.java]
|-->WindowManagerGlobal.addView() [frameworks/base/core/java/android/view/WindowManagerGlobal.java]
|-->root = new ViewRootImpl() 创建root 绑定窗口系统
|-->ViewRootImpl.setView(PhoneWindow.getDecorView())
|-->mAttachInfo.mRootView = DecorView;
/<----------------------|-->ViewRootImpl.requestLayout() 第一次布局调度
| |-->(DecorView)view.assignParent(ViewRootImpl)
|
|
|
|
|
|
|
+++++++++++++++++|+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
sw 渲染流程 |
\/
|-->ViewRootImpl.requestLayout()
|-->ViewRootImpl.invalidate()
|-->ViewRootImpl.scheduleTraversals [frameroks/base/core/java/android/view/ViewRootImpl.java] #########################| postCallback |#############################################################
ViewRootImple.ViewRootHandler mHandler
########################| Callback| ##################################################################
<@@MessageHandler name=Travdersalrunnable >
|-->ViewRootImpl.TraversalRunnable.run() [frameworks/base/core/java/android/view/ViewRootImpl.java]
|-->ViewRootImpl.doTraversal() [frameworks/base/core/java/android/view/ViewRootImpl.java]
|-->ViewRootImpl.performTraversals() [frameworks/base/core/java/android/view/ViewRootImpl.java]
|-->ViewRootImpl.performMeasure() or ViewRootImpl.measureHierarchy(view host) 计算subtree
|-->ViewRootImpl.performLayout()
|-->ViewRootImpl.measureHierarchy()
|-->DecorView.layout()
|-->ViewRootImpl.performDraw()
|-->ViewRootImpl.draw()
/----->|-->ViewGroup.drawChild()
| |-->View.draw(Canvas,ViewGroup)
| |-->{ if( hasDisplayList) }
| . |((HardwareCanvas) canvas).drawDisplayList() [frameworks/base/core/java/android/view/HardwareCanvas.java]
sw | . |-->GLES20Canvas.drawDisplayList() [frameworks/base/core/java/android/view/GLES20Canvas.java]
| . |-->android_view_GLES20Canvas_drawDisplayList() [frameworks/base/core/jni/android_view_GLES20Canvas.cpp]
| . |-->OpenGLRenderer::drawDisplayList()
| .
| |-->view.draw(Canvas) [frameworks/base/core/java/android/view/view.java]
| |-->background.draw(canvas) . Draw the background
| |-->canvas.saveLayer() . save the canvas' layers
| |-->ViewGroup.dispatchDraw(canvas) . Draw children [frameworks/base/core/java/android/view/ViewGroup.java]
\<--------------------|-->ViewGroup.drawChild()
|-->canvas.drawRect . draw the fading edges and restore layers
|-->View.onDrawScrollBars . Draw decorations [frameworks/base/core/java/android/view/ViewGroup.java]
|-->View.onDraw(canvas) . Draw view's content
||
--------------------------------||----------------------------------------------------------------------------------------------------------
webview \/
|-->onDraw(Canvas canvas) [WebViewClassic.java]
|-->drawContent(Canvas canvas) [WebViewClassic.java]
----------------------------------------------------------------------------------------------------------------
|-->nativeDraw(canvas, mVisibleContentRect, mBackgroundColor) [webkit/android/nav/WebView.cpp]
sw . |-->draw() [webkit/android/nav/WebView.cpp]
. { m_baseLayer->draw() }
. |--> Layer::draw() [frameworks/native/services/surfaceflinger/layer.cpp]
. |--> Layer::onDraw() [frameworks/native/services/surfaceflinger/layer.cpp]
.
----------------------------------------------------------------------------------------------------------------
|-->functor = nativeCreateDrawGLFunction() [webkit/android/nav/WebView.cpp]
|-->((HardwareCanvas) canvas).callDrawGLFunction(functor) [*/android/webkit/WebViewClassic.java]
|-->callDrawGLFunction() [GLES20Canvas.java]
hw |--> android_view_GLES20Canvas_callDrawGLFunction() [android_view_GLES20Canvas.cpp]
|-->OpenGLRenderer::callDrawGLFunction() [frameworks/base/libs/hwui/OpenGLRenderer.cpp]
|--> mFunctors.add(functor); ------->\
###################################| add |#########################################################|#########
SortedVector<Functor*> mFunctors 异步 |
##################################| invoke| #######################################################|######### | |
|
|
-------------------------------------------------------------------------------------------------------------------------------|----------
hw 渲染流程 |
|
|-->ViewRootImpl.requestLayout() |
|-->ViewRootImpl.invalidate() |
|-->ViewRootImpl.scheduleTraversals [frameroks/base/core/java/android/view/ViewRootImpl.java] |
|
#########################| postCallback |############################################################# |
ViewRootImple.ViewRootHandler mHandler |
########################| Callback| ################################################################## |
<@@MessageHandler name=Travdersalrunnable > |
|-->ViewRootImpl.TraversalRunnable.run() [frameworks/base/core/java/android/view/ViewRootImpl.java] |
|-->ViewRootImpl.doTraversal() [frameworks/base/core/java/android/view/ViewRootImpl.java] |
|-->ViewRootImpl.performTraversals() [frameworks/base/core/java/android/view/ViewRootImpl.java] |
|-->ViewRootImpl.performMeasure() or ViewRootImpl.measureHierarchy(view host) 计算subtree |
|-->ViewRootImpl.performLayout() |
|-->ViewRootImpl.measureHierarchy() |
|-->DecorView.layout() |
hw |-->ViewRootImpl.performDraw() |
|-->ViewRootImpl.draw() [frameworks/base/core/java/android/view/ViewRootImpl.java] |
{ attachInfo.mHardwareRenderer.draw } |
|-->hardwareRenderer.draw() [frameworks/base/core/java/android/view/hardwareRenderer.java] |
|-->hardwareRenderer.drawDisplayList() [frameworks/base/core/java/android/view/hardwareRenderer.java] |
|-->handleFunctorStatus() [frameworks/base/core/java/android/view/HardwareRenderer.java] |
|-->mHandler.postDelayed() [frameworks/base/core/java/android/view/HardwareRenderer.java] |
|
<@@/MessageHandler> |
###################################| post |###################################################################### |
View.Handler mHandler = ViewRootImple.ViewRootHandler mHandler |
#################################| CallBack |###################################################################### |
|-->HardwareRenderer.HardwareFunctorsRunnable.run [frameworks/base/core/java/android/view/HardwareRenderer.java] |
{ mCanvas.invokeFunctors(mRedrawClip) } |
|-->GLES20Canvas.invokeFunctors [frameworks/base/core/java/android/view/GLES20Canvas.java] |
|--> android_view_GLES20Canvas_invokeFunctors [framework/base/core/jni/android_view_GLES20Canvas.cpp] |
|-->OpenGLRenderer::invokeFunctors [frameworks/base/libs/hwui/OpenGLRenderer.cpp] <---------------------------/
{ Functor* f = functors.itemAt(i); result |= (*f)(DrawGlInfo::kModeProcess, &info) }
|-->GLDrawFunctor() <-- (*wvInstance.*funcPtr)() [webkit/android/nav/WebView.cpp:GLDrawFunctor]
|-->drawGL() [webkit/android/nav/WebView.cpp]
|-->m_glWebViewState = new GLWebViewState()
|-->(GLWebViewState)m_glWebViewState->drawGL() [webkit/android/nav/GLWebViewState.cpp]
|-->tilesManager = TilesManager::instance() [webcore/platform/graphics/android/rendering/TilesManager.cpp]
|-->tilesManager->updateTilesIfContextVerified() // 创建/更新 Tile纹理
. |-->TransferQueue::updateDirtyTiles()
. . |-->TransferQueue.updatePureColorTiles()
. . #################################################| TexturesGenerator.add |#######
. . TileManager->m_transferQueue
. . ######################| |###################################################
. . { for each Item in m_transferQueueSize }
---------------------.--------------------------------------------------------------------------------------------------------
GpuUpload . . |-->(GLConsumer)m_sharedSurfaceTexture->updateTexImage() [frameworks/native/libs/gui/GLConsumer.cpp]
. . . |-->GLConsumer.acquireBufferLocked(&item)
. . . |-->ConsumerBase::acquireBufferLocked(item) [frameworks/native/libs/gui/ConsumerBase.cpp]
. . . |-->mBufferQueue->acquireBuffer(item) [frameworks/native/libs/gui/BufferQueue.cpp]
. . .
. . . -------------| set mbuf(slotindex)|------------------------------------------------
. . . Slot mSlots[]
. . . ---------------| mCurrentTexture |--------------------------------------------------
. . .
. . . |-->GLConsumer.releaseAndUpdateLocked(item) . item.mgraphicBuffer->EGLImage Tile
. . .
. . . ---------------------------| set |--------------------------------------------------------
. . . mEglSlots[buf].mEglImage
. . . ----------------------| mCurrentTexture |--------------------------------------------------
. . .
. . . |-->GLConsumer.bindTextureImageLocked()
. . . |-->glEGLImageTargetTexture2DOES() . EGLImage -> texture m_sharedSurfaceTextureId
. . . |-->GLConsumer::doGLFenceWaitLocked() // Wait for the new buffer to be ready.
---------------------.-------------------------------------------------------------------------------------------------------
. . |-->destTexture->requireGLTexture()
---------------------.-------------------------------------------------------------------------------------------------------
CpuUpload . . |-->GLUtils::updateTextureWithBitmap(TileTexture.m_ownTextureId,m_transferQueue[index].bitmap)
---------------------.-------------------------------------------------------------------------------------------------------
GpuUpload . . |-->TransferQueue::blitTileFromQueue() m_sharedSurfaceTextureId->m_fboID->TileTexture.m_ownTextureId
---------------------.-------------------------------------------------------------------------------------------------------
. . |-->m_transferQueueItemCond.signal() -------------------------------------------------------------->\
|
|-->tilesManager->gatherTextures() |
|-->ImagesManager::instance()->prepareTextures[webcore/platform/graphics/*/rendering/ImagesManager.cpp] |
|-->GLWebViewState::setupDrawing() [webkit/android/nav/GLWebViewState.cpp] |
. |-->tilesManager->shader()->initGLResources()[webcore/plat/gfx/*/rendering/ShaderProgram.cpp] |
. |-->tilesManager->transferQueue()->initGLResources() init fbo,bufferQueue,GLConsumer sharedSurface |
painting . |-->shader->setupDrawing() |
. |
|-->SurfaceCollectionManager::drawGL() [webcore/plat*/gfx/rendering/SurfaceCollectionManager.cpp] |
------------------------------------------------------------------------------------------------------------------------------|-----
m_paintingCollection |-->m_paintingCollection->prepareGL() [webcore/plat*/gfx/rendering/SurfaceCollection.cpp] |
. { m_paintingCollection->isReady() } |
. |-->SurfaceCollectionManager.swap() |
. |-->m_drawingCollection = m_paintingCollection; paintingcollection->drawingcollection |
. |-->m_paintingCollection = m_queuedCollection; drawingcollection->m_paintingCollection |
. |-->m_queuedCollection = ; |
----or------------------------------------------------------------------------------------------------------------------------|-----
m_drawingCollection |-->m_paintingCollection->prepareGL() [webcore/plat*/gfx/rendering/SurfaceCollection.cpp] |
------------------------------------------------------------------------------------------------------------------------------|-----
{either a swap just occurred, or there is no more work to be done: do a full draw} |
|-->m_drawingCollection->swapTiles() |
{(didCollectionSwap && m_paintingCollection)} |
|-->m_paintingCollection->prepareGL() |
------------------------------------------------------------------------------------------------------------------------------|-----
|-->SurfaceCollection::prepareGL() |
. { for each surface in WTF::Vector<Surface*> m_surfaces } |
. |-->m_surfaces[i]->prepareGL() [webcore/plat*/gfx/rendering/Surface.cpp] |
. |-->m_surfaceBacking->prepareGL() |
---------------------------------------------------------------------------------------------------------|------
. |-->m_backTileGrid->prepareGL() |
. |-->SurfaceBacking.swapTileGrids() [webcore/plat*/gfx/rendering/SurfaceBacking.cpp] |
. |-->m_frontTileGrid->swapTiles() |
---------------------------------------------------------------------------------------------------------|------
. |-->m_frontTileGrid->prepareGL() |
---------------------------------------------------------------------------------------------------------|------
. |-->TileGrid::prepareGL() m_backTileGrid m_frontTileGrid m_lowResTileGrid |
. |-->TileGrid.computeTilesArea() [webcore/plat*/gfx/rendering/TileGrid.cpp] |
. { for each (x,y) in m_area } |
. |-->TileGrid.prepareTile(x,y) |
. |-->Tile* tile = getTile(x, y) |
. |-->tile->setContents() |
. |-->operation = new PaintTileOperation[*/PaintTileOperation.cpp] |
. |-->tilesManager->scheduleOperation(operation) |
. |-->m_textureGenerators[m_scheduleThread]->scheduleOperation() |
. |-->TexturesGenerator::scheduleOperation () |
. |-->mRequestedOperations.append(operation) |
. ##############################| |####################### |
. . WTF::Vector<QueuedOperation*> mRequestedOperations |
. . ################################################################# |
/<-------------------------------------- |-->mRequestedOperationsCond.signal() |
----------------------|--------.------------------------------------------------------------------------------------------------------|-------
| |-->m_drawingCollection->drawGL() [webcore/plat*/gfx/rendering/SurfaceCollection.cpp] |
| |-->(BaseLayerAndroid*)m_compositedRoot->drawTreeSurfacesGL() |
| /-----> |-->LayerAndroid::drawTreeSurfacesGL() |
| | |-->LayerAndroid.drawSurfaceAndChildrenGL [webcore/plat*/gfx/android/LayerAndroid.cpp] |
| | ( { this.surface()->getFirstLayer() == this } ) |
| /<--|---------------|-->surface()->drawGL() |
| | | |-->Layer::getChild() |
| | | |-->sublayers.append(SkTDArray<Layer*> m_children) |
| | | { for each layer in sublayers } |
| | \---loop--------|-->sublayers[i]->drawTreeSurfacesGL() |
| | |
| \------------------>|-->Surface::drawGL() [webcore/plat*/gfx/rendering/SurfaceCollection.cpp] |
| |-->m_surfaceBacking->drawGL |
| . { draw low res prefetch page if zooming or front texture missing content } |
| . |-->m_lowResTileGrid->drawGL() aggressiveRendering && isMissingContent() |
| . |-->m_frontTileGrid->drawGL() |
| . |-->m_area=TileGrid.computeTilesArea() |
| . |{ for each tile in TileGrid.m_tiles} |
| . |-->Tile* tile = m_tiles[i] |
| . |-->tile->isTileVisible(m_area) if(tile in m_area) |
Compositing | . |-->tile->drawGL() |
| . |-->m_frontTexture->drawGL() |
| . |-->TilesManager::instance()->shader()->drawQuad() |
| . |-->matrix = getTileProjectionMatrix(data) drawGl Position |
| . |-->ShaderProgram.drawQuadInternal() |
| .{ // draw member layers (draws image textures, glextras) } |
| .{ for each layer in Vector<LayerAndroid*> m_layers } |
| |-->m_layers[i]->drawGL() |
| |
| |
| |
---------------------|---------------------------------------------------------------------------------------------------------------|-------
| |
$$$$$$$$$$$$$$$$$$$$$$$$$|$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$|$$$$$$$$$
TexturesGenerator 线程+++|++++++++++ 线程边界 | $$$$$$$$$$$$$$$$$$$$$$$$$|$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$|$$$$$$$$$
|-->TexturesGenerator::th|readLoop() NUM_TEXTURES_GENERATORS |
|-->mRequestedOperati|onsCond.wait(mRequestedOperationsLock) |
. | +++++++++++++ |
.#################|###########################| wait |########################### |
. | mRequestedOperationsCond |
.###############| |signal |###################################################### |
. +++++++++++++ |
.############################################################## |
. WTF::Vector<QueuedOperation*> mRequestedOperations |
.#####################| |############################## |
|-->currentOperation = popNext(); |
|-->BaseRenderer::swapRendererIfNeeded(m_renderer) |
|-->currentOperation->run(m_renderer) [webcore/plat*/gfx/rendering/PaintTileOperation.cpp] |
|-->m_tile->paintBitmap(m_painter, renderer) [webcore/plat*/gfx/rendering/Tile.cpp] |
|-->TextureInfo* textureInfo = texture->getTextureInfo() [webcore/plat*/gfx/rendering/TileTexture.h] |
|-->(BaseRenderer)renderer->renderTiledContent(renderInfo) [webcore/plat*/gfx/rendering/BaseRenderer.cpp] |
|-->InstrumentedPlatformCanvas canvas() [webcore/plat*/gfx/rendering/InstrumentedPlatformCanvas.cpp] |
--------------------------------------------------------------------------------------------------------------------------------------- |
RasterRenderer |-->RasterRenderer::setupCanvas 子类override [webcore/plat*/gfx/rendering/RasterRenderer.cpp] |
. |-->SkDevice* device = new SkDevice(m_bitmap) |
. |-->canvas->setDevice(device) |
|-->renderInfo.tilePainter->paint(&canvas); TilePainter子类override |
|-->BaseRenderer.checkForPureColor(renderInfo, canvas) 子类override [webcore/plat*/gfx/rendering/BaseRenderer.cpp] |
. |-->RasterRenderer::deviceCheckForPureColor(renderInfo, &canvas) |
|-->RasterRenderer::renderingComplete(RasterRenderer.cpp) |
. |-->GLUtils::paintTextureWithBitmap() [webcore/plat*/gfx/rendering/GLUtils.cpp] |
------------------------------------------------------------------------------------------------------------------ |
. |-->GLUtils::skipTransferForPureColor(renderInfo, bitmap) |
. . |-->TilesManager::instance()->transferQueue()->addItemInPureColorQueue(renderInfo) |
. . |-->TransferQueue.addItemCommon(renderInfo, GpuUpload, (TileTransferData)&data) |
-------------.---------------------------------------------------------------------------------------------------- |
. |-->GLUtils::updateQueueWithBitmap() |
. |-->TilesManager::instance()->transferQueue()->updateQueueWithBitmap(renderInfo, bitmap) |
. |-->TransferQueue::updateQueueWithBitmap |
. . |-->TransferQueue.tryUpdateQueueWithBitmap(renderInfo, bitmap) /<--------------<--+
. . |-->readyForUpdate() | |
. . .########################| wait |##########################################|####### |
. . . m_transferQueueItemCond.wait(m_transferQueueItemLocks)sferQueueItemCond | |
. . .######################################################################| signal |### |
. . . ++++++++++ |
--------.--------------.-------.---------------------------------------------------------------------------------------- |
. . |-->GLUtils::updateSharedSurfaceTextureWithBitmap(m_ANW.get(), bitmap) |
. . . |-->ANativeWindow_Buffer buffer [frameworks/native/include/android/Native_window.h] |
. . . |-->ANativeWindow_lock(anw, &buffer, ) |
GpuUpload . . . |-->bitmap.lockPixels() |
. . . |-->buffer.bits <-- bitmap.getPixels() |
. . . |-->bitmap.unlockPixels() |
. . . |-->ANativeWindow_unlockAndPost() |
--------.--------------.-------.---------------------------------------------------------------------------------------- |
. . |-->TransferQueue.addItemInTransferQueue(renderInfo, currentUploadType, bitmap) |
. . . |-->m_transferQueueIndex = (m_transferQueueIndex + ) % m_transferQueueSize |
. . . |-->TileTransferData* data = &m_transferQueue[index] |
. . . |-->TransferQueue.addItemCommon(renderInfo, type, data) |
--------.--------------.-------.---------------------------------------------------------------------------------------- |
CpuUpload . . . |-->(*m_transferQueue[index].bitmap) = bitmap |
--------.--------------.------------------------------------------------------------------------------------------------ |
. |-->tile->backTextureTransferFail() mark to be retransferred |
------------------.----------------------------------------------------------------------------------------------------------------- | GaneshRenderer |-->GaneshRenderer::setupCanvas() [webcore/plat*/gfx/rendering/GaneshRenderer.cpp] |
. |-->GaneshContext* ganesh = GaneshContext::instance() |
. |-->TransferQueue* tileQueue = TilesManager::instance()->transferQueue() |
| |-->tileQueue->readyForUpdate() /<----------------------------<-------------/
. . +++++++++++++ |
.###.####| wait |########################################################|################
not available now . . Condition m_transferQueueItemCond |
.###.##################################################################| signal |#########
. . +++++++++++++
. |-->device = ganesh->getDeviceForTile(renderInfo) get device for SkCanvas and set EGLContext
. . |-->display = eglGetDisplay(EGL_DEFAULT_DISPLAY)
. . |-->eglInitialize(display, &majorVersion, &minorVersion)
. . |-->eglChooseConfig(display, configAttribs, &m_surfaceConfig, , &numConfigs)
. . |-->m_surfaceContext = eglCreateContext(display, m_surfaceConfig, NULL, contextAttribs)
. . |-->TransferQueue* tileQueue = TilesManager::instance()->transferQueue()
. . |-->ANativeWindow* anw = tileQueue->m_ANW.get();
. . |-->ANativeWindow_setBuffersGeometry()
. . |-->tileQueue->m_eglSurface = eglCreateWindowSurface(display, m_surfaceConfig, anw, NULL);
. . |-->eglMakeCurrent(display, tileQueue->m_eglSurface, tileQueue->m_eglSurface, m_surfaceContext)
. .
. . |-->GrContext* grContext = getGrContext()
. . |-->GrRenderTarget* renderTarget = grContext->createPlatformRenderTarget(renderTargetDesc)
. . |-->m_tileDeviceSurface = new SkGpuDevice(grContext, renderTarget)
. |-->canvas->setDevice(m_tileDeviceSurface)
|-->renderInfo.tilePainter->paint(&canvas);
|-->BaseRenderer.checkForPureColor(renderInfo, canvas)
. |-->GaneshRenderer::deviceCheckForPureColor(){}
| -->GaneshRenderer::renderingComplete(GaneshRenderer.cpp)
. |-->GaneshContext::instance()->flush()
. |-->TransferQueue* tileQueue = TilesManager::instance()->transferQueue()
. |-->eglSwapBuffers(eglGetCurrentDisplay(), tileQueue->m_eglSurface)
. |-->tileQueue->addItemInTransferQueue(&renderInfo, GpuUpload, dummyBitmap)
. |-->m_transferQueueIndex = (m_transferQueueIndex + ) % m_transferQueueSize
. |-->TileTransferData* data = &m_transferQueue[index]
. |-->TransferQueue.addItemCommon(renderInfo, type, data)
--------.--------------.-------.----------------------------------------------------------------------------------------
CpuUpload . |-->(*m_transferQueue[index].bitmap) = bitmap
--------.--------------.------------------------------------------------------------------------------------------------
------------------.------------------|---------------------------------------------------
. |
. |
\/
TransferQueue.addItemInTransferQueue(renderInfo, currentUploadType, bitmap)
#################################| |################################################################
TileManager->m_transferQueue --> QueueBuffer (GraphicBuffer)
#################################| |######################################################################
TilesManager::updateTilesIfContextVerified(TilesManager.cpp) +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
android 线程启动 new xxthread()->run ---> _threadLoop()---> readyToRun()
threadLoop +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
关键代码 TileManager TransferQueue.cpp GLComsumer.cpp (SurfaceTexture) Tile.h/.cpp

webview渲染流程的更多相关文章

  1. NGUI渲染流程

    1 渲染流程 NGUI的渲染流程其实就是把Widget组件生成Mesh所需要的缓存数据,然后生成对应的DrallCall组合对应数据,生成渲染需要的Mesh数据,提交渲染. Widget(数据) UI ...

  2. cocos2d-x渲染流程

    Cocos2Dx之渲染流程 发表于8个月前(2014-08-08 22:46)   阅读(3762) | 评论(2) 17人收藏此文章, 我要收藏 赞2 如何快速提高你的薪资?-实力拍“跳槽吧兄弟”梦 ...

  3. NGUI 渲染流程深入研究 (UIDrawCall UIGeometry UIPanel UIWidget)

    上图是一个简要的NGUI的图形工作流程,UIGeometry被UIWidget实例化之后,通过UIWidget的子类,也就是UISprit,UILabel等,在OnFill()函数里算出所需的Geom ...

  4. D3D渲染流程--转载

    http://www.cnblogs.com/ixnehc/articles/1282350.html 先从最基础的写起吧,关于Device的渲染流程. D3D9的Device就是D3D给我们提供的一 ...

  5. 【Stage3D学习笔记续】山寨Starling(三):Starling核心渲染流程

    这篇文章我们剔除Starling的Touch事件体系和动画体系,专门来看看Starling中的渲染流程实现,以及其搭建的显示列表结构. 由于Starling是模仿Flash的原生显示列表,所以我们可以 ...

  6. Ogre内部渲染流程分析系列

    come from:http://blog.csdn.net/weiqubo/article/details/6956005 要理解OGRE引擎,就要理解其中占很重要位置的 Renderable接口, ...

  7. mapbox.gl源码解析——基本架构与数据渲染流程

    加载地图 Mapbox GL JS是一个JavaScript库,使用WebGL渲染交互式矢量瓦片地图和栅格瓦片地图.WebGL渲染意味着高性能,MapboxGL能够渲染大量的地图要素,拥有流畅的交互以 ...

  8. react16 渲染流程

    前言 react升级到16之后,架构发生了比较大的变化,现在不看,以后怕是看不懂了,react源码看起来也很麻烦,也有很多不理解的地方. 大体看了一下渲染过程. react16架构的变化 react ...

  9. Cocos2dx开发之运行与渲染流程分析

    学习Cocos2dx,我们都知道程序是由 AppDelegate 的方法 applicationDidFinishLaunching 开始,在其中做些必要的初始化,并创建运行第一个 CCScene 即 ...

随机推荐

  1. CF 219D Choosing Capital for Treeland 树形DP 好题

    一个国家,有n座城市,编号为1~n,有n-1条有向边 如果不考虑边的有向性,这n个城市刚好构成一棵树 现在国王要在这n个城市中选择一个作为首都 要求:从首都可以到达这个国家的任何一个城市(边是有向的) ...

  2. about_并查集

    前天刚学了并查集,挺好用的,虽然我现在只会用它来解决是不是亲戚啊,是不是朋友啊,带权并查集还不是很理解. 并查集也叫做不相交集合,主要有3个操作,初始化,查找,合并. 并查集其中一个很大的应用就是kr ...

  3. [Python] UTF-8最好不要带BOM

    一.问题回顾: 问题: 在写一个脚本读入IP分区表文件到list并做比较的时候,发现该成立的语句总是不成立,经调试后发现开头是这样:\xef\xbb\xbf1.0.3.0,故比较不成功. 解决办法:经 ...

  4. adb 工具学习

    adb (android debug bridge)简单介绍: 1.adb 是 Android SDK中所带工具.使用adb,可以在PC上操作Android设备或者模拟器 2.主要功能有: 将本地ap ...

  5. Altium Designer /DXP无网络铺铜:

    有的设计者在PCB加工的时候会删除网络以便为了保护.但如果后续在无网络PCB上进行修改时就不叫麻烦,没有网络连铺铜都无法进行.一般手动添加网络只对要铺铜的地网络进行,其它的要修改者自己确保版图的正确性 ...

  6. 【jQuery】关于选择器中的 :first 、 :first-child 、 :first-of-type

    [:first] <!DOCTYPE html><html lang="zh-CN"><head>    <title>test&l ...

  7. Linux防火墙设置(转载)

    From:http://www.lupaworld.com/article-219400-1.html (1) 重启后永久性生效: 开启:chkconfig iptables on 关闭:chkcon ...

  8. Python中将打印输出导向日志文件

    a. 利用sys.stdout将print行导向到你定义的日志文件中,例如: import sys # make a copy of original stdout route stdout_back ...

  9. NSPredicate,谓词

    原文地址:http://blog.csdn.net/holydancer/article/details/7380799 在语言上,谓语,谓词是用来判断的,比如“我是程序猿”中的是,就是表判断的谓语, ...

  10. ruby 字符串学习笔记3

    ascii转字符或者字符串转ascii "a".ord # => 97 "!".ord # => 33 "\n".ord # = ...