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
##################################| 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


发布评论