chromium for android v34 2dcanvas硬體渲染實現分析

來源:互聯網
上載者:User

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().
以上過程,以前的文章中分析過,不細分析了。

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.