2024年3月27日发(作者:)

|-->mLayout()

|-->eHierarchy()

|-->()

|-->mDraw()

|-->()

/----->|-->ild()

| |-->(Canvas,ViewGroup)

| |-->{ if( hasDisplayList) }

| . |((HardwareCanvas) canvas).drawDisplayList() [frameworks/base/core/java/android/view/]

sw | . |-->splayList() [frameworks/base/core/java/android/view/]

| . |-->android_view_GLES20Canvas_drawDisplayList() [frameworks/base/core/jni/android_view_]

| . |-->OpenGLRenderer::drawDisplayList()

| .

| |-->(Canvas) [frameworks/base/core/java/android/view/]

| |-->(canvas) 1. Draw the background

| |-->yer() 2. save the canvas' layers

| |-->chDraw(canvas) 4. Draw children [frameworks/base/core/java/android/view/]

<--------------------|-->ild()

|-->ct 5. draw the fading edges and restore layers

|-->ScrollBars 6. Draw decorations [frameworks/base/core/java/android/view/]

|-->(canvas) 3. Draw view's content

||

--------------------------------||----------------------------------------------------------------------------------------------------------

webview

|-->onDraw(Canvas canvas) []

|-->drawContent(Canvas canvas) []

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

|-->nativeDraw(canvas, mVisibleContentRect, mBackgroundColor) [webkit/android/nav/]

sw . |-->draw() [webkit/android/nav/]

. { m_baseLayer->draw() }

. |--> Layer::draw() [frameworks/native/services/surfaceflinger/]

. |--> Layer::onDraw() [frameworks/native/services/surfaceflinger/]

.

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

|-->functor = nativeCreateDrawGLFunction() [webkit/android/nav/]

|-->((HardwareCanvas) canvas).callDrawGLFunction(functor) [*/android/webkit/]

|-->callDrawGLFunction() []

hw |--> android_view_GLES20Canvas_callDrawGLFunction() [android_view_]

|-->OpenGLRenderer::callDrawGLFunction() [frameworks/base/libs/hwui/]

|--> (functor); ------->

###################################| add |#########################################################|#########

SortedVector mFunctors 异步 |

##################################| invoke| #######################################################|#########

|

|

-------------------------------------------------------------------------------------------------------------------------------|----------

hw 渲染流程 |

|

|-->tLayout() |

|-->date() |

|-->leTraversals [frameroks/base/core/java/android/view/] |

|

#########################| postCallback |############################################################# |

otHandler mHandler |

########################| Callback| ################################################################## |

<@@MessageHandler name=Travdersalrunnable > |

|-->() [frameworks/base/core/java/android/view/] |

|-->ersal() [frameworks/base/core/java/android/view/] |

|-->mTraversals() [frameworks/base/core/java/android/view/] |

|-->mMeasure() or eHierarchy(view host) 计算subtree |

|-->mLayout() |

|-->eHierarchy() |

|-->() |

hw |-->mDraw() |

|-->() [frameworks/base/core/java/android/view/] |

{ } |

|-->() [frameworks/base/core/java/android/view/] |

|-->splayList() [frameworks/base/core/java/android/view/] |

|-->handleFunctorStatus() [frameworks/base/core/java/android/view/] |

|-->layed() [frameworks/base/core/java/android/view/] |

|

<@@/MessageHandler> |

###################################| post |###################################################################### |

r mHandler = otHandler mHandler |

#################################| CallBack |###################################################################### |

|--> [frameworks/base/core/java/android/view/] |

{ Functors(mRedrawClip) } |

|-->Functors [frameworks/base/core/java/android/view/] |

|--> android_view_GLES20Canvas_invokeFunctors [framework/base/core/jni/android_view_] |

|-->OpenGLRenderer::invokeFunctors [frameworks/base/libs/hwui/] <---------------------------/

{ Functor* f = (i); result |= (*f)(DrawGlInfo::kModeProcess, &info) }

|-->GLDrawFunctor() <-- (*wvInstance.*funcPtr)() [webkit/android/nav/:GLDrawFunctor]

|-->drawGL() [webkit/android/nav/]

|-->m_glWebViewState = new GLWebViewState()

|-->(GLWebViewState)m_glWebViewState->drawGL() [webkit/android/nav/]

|-->tilesManager = TilesManager::instance() [webcore/platform/graphics/android/rendering/]

|-->tilesManager->updateTilesIfContextVerified() // 创建/更新 Tile纹理

. |-->TransferQueue::updateDirtyTiles()

. . |-->PureColorTiles()

. . #################################################| |#######

. . TileManager->m_transferQueue

. . ######################| |###################################################

. . { for each Item in m_transferQueueSize }

---------------------.--------------------------------------------------------------------------------------------------------

GpuUpload . . |-->(GLConsumer)m_sharedSurfaceTexture->updateTexImage() [frameworks/native/libs/gui/]

. . . |-->eBufferLocked(&item)

. . . |-->ConsumerBase::acquireBufferLocked(item) [frameworks/native/libs/gui/]

. . . |-->mBufferQueue->acquireBuffer(item) [frameworks/native/libs/gui/]

. . .

. . . -------------| set mbuf(slotindex)|------------------------------------------------

. . . Slot mSlots[]

. . . ---------------| mCurrentTexture |--------------------------------------------------

. . .

. . . |-->eAndUpdateLocked(item) 1. icBuffer->EGLImage Tile

. . .

. . . ---------------------------| set |--------------------------------------------------------

. . . mEglSlots[buf].mEglImage

. . . ----------------------| mCurrentTexture |--------------------------------------------------

. . .

. . . |-->xtureImageLocked()

. . . |-->glEGLImageTargetTexture2DOES() 2. 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_() -------------------------------------------------------------->

|

|-->tilesManager->gatherTextures() |

|-->ImagesManager::instance()->prepareTextures[webcore/platform/graphics/*/rendering/] |

--------.--------------.-------.---------------------------------------------------------------------------------------- |

. . |-->GLUtils::updateSharedSurfaceTextureWithBitmap(m_(), bitmap) |

. . . |-->ANativeWindow_Buffer buffer [frameworks/native/include/android/Native_window.h] |

. . . |-->ANativeWindow_lock(anw, &buffer, 0) |

GpuUpload . . . |-->xels() |

. . . |--> <-- els() |

. . . |-->Pixels() |

. . . |-->ANativeWindow_unlockAndPost() |

--------.--------------.-------.---------------------------------------------------------------------------------------- |

. . |-->mInTransferQueue(renderInfo, currentUploadType, bitmap) |

. . . |-->m_transferQueueIndex = (m_transferQueueIndex + 1) % m_transferQueueSize |

. . . |-->TileTransferData* data = &m_transferQueue[index] |

. . . |-->mCommon(renderInfo, type, data) |

--------.--------------.-------.---------------------------------------------------------------------------------------- |

CpuUpload . . . |-->(*m_transferQueue[index].bitmap) = bitmap |

--------.--------------.------------------------------------------------------------------------------------------------ |

. |-->tile->backTextureTransferFail() mark to be retransferred |

------------------.----------------------------------------------------------------------------------------------------------------- | GaneshRenderer |-->GaneshRenderer::setupCanvas() [webcore/plat*/gfx/rendering/] |

. |-->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, 1, &numConfigs)

. . |-->m_surfaceContext = eglCreateContext(display, m_surfaceConfig, NULL, contextAttribs)

. . |-->TransferQueue* tileQueue = TilesManager::instance()->transferQueue()

. . |-->ANativeWindow* anw = tileQueue->m_();

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

|-->inter->paint(&canvas);

|-->orPureColor(renderInfo, canvas)

. |-->GaneshRenderer::deviceCheckForPureColor(){}

| -->GaneshRenderer::renderingComplete()

. |-->GaneshContext::instance()->flush()

. |-->TransferQueue* tileQueue = TilesManager::instance()->transferQueue()

. |-->eglSwapBuffers(eglGetCurrentDisplay(), tileQueue->m_eglSurface)

. |-->tileQueue->addItemInTransferQueue(&renderInfo, GpuUpload, dummyBitmap)

. |-->m_transferQueueIndex = (m_transferQueueIndex + 1) % m_transferQueueSize

. |-->TileTransferData* data = &m_transferQueue[index]

. |-->mCommon(renderInfo, type, data)

--------.--------------.-------.----------------------------------------------------------------------------------------

CpuUpload . |-->(*m_transferQueue[index].bitmap) = bitmap

--------.--------------.------------------------------------------------------------------------------------------------

------------------.------------------|---------------------------------------------------

. |

. |

mInTransferQueue(renderInfo, currentUploadType, bitmap)

#################################| |################################################################

TileManager->m_transferQueue --> QueueBuffer (GraphicBuffer)

#################################| |######################################################################

TilesManager::updateTilesIfContextVerified()

+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++

android 线程启动 new xxthread()->run ---> _threadLoop()---> readyToRun()

threadLoop

+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++

关键代码

TileManager

(SurfaceTexture)

Tile.h/.cpp