chromium for android v34 2dcanvas硬件渲染实现分析
2014-10-10 17:40
891 查看
这篇接着上一篇2dcanvas硬件绘制,分析保存绘制结果的texture被合成到on screen framebuffer上的过程。
1.webkit为canvas元素对应的render树节点RenderHTMLCanvas,
创建RenderLayer的过程如下:
![](http://img.blog.csdn.net/20141010173236040?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvamF5bGluemhvdQ==/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center)
RenderLayerModelObject::createLayer()调用
RenderLayer::insertOnlyThisLayer()将创建完
的RenderLayer加入到renderlayer tree中。
2.Canvas2DLayerBridge包含WebExternalTextureLayerImpl实例,
WebExternalTextureLayerImpl的构造函数中创建的TextureLayer
被封装在WebExternalTextureLayerImpl中包含的WebLayerImpl实例中。
这里创建的WebLayerImpl关联到canvas节点对应的RenderLayer上的过程如下:
![](http://img.blog.csdn.net/20141010173324166?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvamF5bGluemhvdQ==/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center)
GraphicsLayer::setupContentsLayer()中将WebExternalTextureLayerImpl包含的
WebLayerImpl实例作为子节点关联到GraphicsLayer
包含的WebContentLayer包含的WebLayerImpl实例上。
这样,Canvas2DLayerBridge包含WebExternalTextureLayerImpl实例中创建的TextureLayer
就被关联到了renderlayer tree间接包含的cc模块中的layer tree上。
以上两个过程涉及的类图:
![](http://img.blog.csdn.net/20141010173411169?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvamF5bGluemhvdQ==/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center)
chromium for android硬件渲染流程全解析(render进程)可知,这颗layer tree最终会被传给cc::LayerTreeHost持有。
在页面更新时,会遍历这颗layer tree依次调用各个节点的Update()。
3.canvas元素对应renderlayer间接包含的texturelayer得到保存绘制结果信息的mailbox的过程。
![](http://img.blog.csdn.net/20141010173838881?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvamF5bGluemhvdQ==/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center)
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().
以上过程,以前的文章中分析过,不细分析了。
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().
以上过程,以前的文章中分析过,不细分析了。
相关文章推荐
- chromium for android v34 2dcanvas硬件渲染实现分析
- chromium for android v34 2dCanvas硬件绘制实现分析
- android4.4 webview chromium与chromium for android硬件渲染的异同
- chromium for android 硬件渲染流程总结
- Chromium on Android: Android在系统Chromium为了实现主消息循环分析
- Chromium硬件加速渲染的OpenGL上下文调度过程分析
- 理解WebKit和Chromium: Canvas2D及其实现
- chromium for android render进程创建过程分析
- Android WebView硬件加速渲染网页UI的过程分析
- Chromium硬件加速渲染的OpenGL上下文创建过程分析
- Android系统2D/3D硬件加速分析报告
- android4.0.1 webkit 硬件渲染过程分析
- Android系统2D/3D硬件加速分析报告
- Android硬件渲染之LockCanvas()
- Android WebView硬件加速渲染网页UI的过程分析
- Chromium硬件加速渲染的UI合成过程分析
- Chromium on Android: 分析Chromium WebView的软件渲染方式
- Chromium硬件加速渲染的OpenGL命令执行过程分析
- chromium for android render进程结构分析
- Chromium on Android: Android系统上Chromium主消息循环的实现分析