您的位置:首页 > 移动开发 > Android开发

chromium for android v34 2dcanvas硬件渲染实现分析

2016-01-15 18:22 639 查看
这篇接着上一篇2dcanvas硬件绘制,分析保存绘制结果的texture被合成到on screen framebuffer上的过程。

1.webkit为canvas元素相应的render树节点RenderHTMLCanvas,

创建RenderLayer的步骤例如以下:



RenderLayerModelObject::createLayer()调用

RenderLayer::insertOnlyThisLayer()将创建完

的RenderLayer增加到renderlayer tree中。

2.Canvas2DLayerBridge包括WebExternalTextureLayerImpl实例,

WebExternalTextureLayerImpl的构造函数中创建的TextureLayer

被封装在WebExternalTextureLayerImpl中包括的WebLayerImpl实例中。

这里创建的WebLayerImpl关联到canvas节点相应的RenderLayer上的步骤例如以下:



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::DoConsumeTextureCHROMIUM().

以上过程,曾经的文章中分析过,不细分析了。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: