chromium for android v34 2dcanvas硬體渲染實現分析
這篇接著上一篇2dcanvas硬體繪製,分析儲存繪製結果的texture被合成到on screen framebuffer上的過程。
1.webkit為canvas元素對應的render樹節點RenderHTMLCanvas,
建立RenderLayer的過程如下:
RenderLayerModelObject::createLayer()調用
RenderLayer::insertOnlyThisLayer()將建立完
的RenderLayer加入到renderlayer tree中。<喎?http://www.bkjia.com/kf/ware/vc/" target="_blank" class="keylink">vcD4KPHA+PGJyPgoyLkNhbnZhczJETGF5ZXJCcmlkZ2Ww/LqsV2ViRXh0ZXJuYWxUZXh0dXJlTGF5ZXJJbXBsyrXA/aOsPGJyPgpXZWJFeHRlcm5hbFRleHR1cmVMYXllckltcGy1xLm51Oy6r8r91tC0tL2otcRUZXh0dXJlTGF5ZXI8YnI+CrG7t+LXsNTaV2ViRXh0ZXJuYWxUZXh0dXJlTGF5ZXJJbXBs1tCw/LqstcRXZWJMYXllckltcGzKtcD91tChozxicj4K1eLA77S0vai1xFdlYkxheWVySW1wbLnYwaq1vWNhbnZhc73ateO21NOmtcRSZW5kZXJMYXllcsnPtcS5/bPMyOfPwqO6PGJyPgo8L3A+CjxwPjxpbWcgc3JjPQ=="http://www.2cto.com/uploadfile/Collfiles/20141011/201410110833405.jpg" alt="\">
GraphicsLayer::setupContentsLayer()中將WebExternalTextureLayerImpl包含的
WebLayerImpl執行個體作為子節點關聯到GraphicsLayer
包含的WebContentLayer包含的WebLayerImpl執行個體上。
這樣,Canvas2DLayerBridge包含WebExternalTextureLayerImpl執行個體中建立的TextureLayer
就被關聯到了renderlayer tree間接包含的cc模組中的layer tree上。
以上兩個過程涉及的類圖:
chromium for android硬體渲染流程全解析(render進程)可知,這顆layer tree最終會被傳給cc::LayerTreeHost持有。
在頁面更新時,會遍曆這顆layer tree依次調用各個節點的Update()。
3.canvas元素對應renderlayer間接包含的texturelayer得到儲存繪製結果資訊的mailbox的過程。
SkBitmapDevice::onAccessBitmap()返回的bitmap是在
SkGpuDevice的建構函式中建立的,這個bitmap由以下語句建立:
SkBitmapDevice(make_bitmap(context, renderTarget));
所以,這個bitmap的內容就是儲存硬體繪製結果的目標texture的內容。
SkSurface_Gpu::onNewImageSnapshot()以bitmap為參數建立了SkImage.
Canvas2DLayerBridge::prepareMailbox()將這個SkImage封裝進mailboxinfo.
將mailboxinfo送出去之前,Canvas2DLayerBridge::prepareMailbox()調用了
WebGraphicsContext3D::produceTextureCHROMIUM()。最終調用到
GLES2DecoderImpl::DoProduceTextureCHROMIUM().
WebExternalTextureLayerImpl::PrepareTextureMailbox()
將blink::WebExternalTextureMailbox封裝成cc::TextureMailbox返回給
TextureLayer。
4.Browser進程消耗儲存繪製結果的目標texture的過程
TextureLayer::Update()只做一件事就是得到包含繪製結果的texture,對於
canvas元素對應的texture,得到的是封裝了繪製結果的mailbox.
TextureLayer::PushPropertiesTo()中將這個mailbox傳給了TextureLayerImpl.
TextureLayerImpl::WillDraw()中調用
ResourceProvider::CreateResourceFromTextureMailbox().將mailbox由儲存在了
ResourceProvider建立的Resource中。
Browser進程中執行的合成過程會調用到,
GLRenderer::DrawRenderPassQuad()
ScopedReadLockGL::ScopedReadLockGL()調用
ResourceProvider::LockForRead()
ResourceProvider::LockForRead()中會調用
ConsumeTextureCHROMIUM()最終調用到
GLES2DecoderImpl::DoProduceTextureCHROMIUM().
以上過程,以前的文章中分析過,不細分析了。