chromium for android v34 2dcanvas硬件渲染实现分析
这篇接着上一篇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上的步骤例如以下:
watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvamF5bGluemhvdQ==/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center" alt="">
GraphicsLayer::setupContentsLayer()中将WebExternalTextureLayerImpl包括的
WebLayerImpl实例作为子节点关联到GraphicsLayer
包括的WebContentLayer包括的WebLayerImpl实例上。
这样,Canvas2DLayerBridge包括WebExternalTextureLayerImpl实例中创建的TextureLayer
就被关联到了renderlayer tree间接包括的cc模块中的layer tree上。
以上两个过程涉及的类图:
watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvamF5bGluemhvdQ==/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center" alt="">
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 Graphics: Android L平台上WebView的变化及其对浏览器厂商的影响分析
原创文章.转载请以链接形式注明原始出处为http://blog.csdn.net/hongbomin/article/details/40799167. 摘要:Google近期公布的Android L ...
- 理解WebKit和Chromium: 调试Android系统上的Chromium
转载请注明原文地址:http://blog.csdn.net/milado_nju 1. Android上的调试技术 在Android系统上,开发人员能够使用两种不同的语言来开发应用程序,一种是Jav ...
- Chromium on Android: Android在系统Chromium为了实现主消息循环分析
总结:刚开始接触一个Chromium on Android时间.很好奇Chromium主消息循环是如何整合Android应用. 为Android计划,一旦启动,主线程将具有Java消息层循环处理系统事 ...
- Android系统修改硬件设备访问权限
Android系统修改硬件设备访问权限 在硬件抽象层模块文件(so)文件中,提供的函数调用open函数来打开设备文件,比如/dev/gpio,如果不修改设备文件/dev/gpio的访问权限,那么应用程 ...
- 把Android原生的View渲染到OpenGL Texture
http://blog.csdn.net/u010949962/article/details/41865777 最近要把Android 原生的View渲染到OpenGL GLSurfaceView中 ...
- 转——Android应用开发性能优化完全分析
[工匠若水 http://blog.csdn.net/yanbober 转载请注明出处.] 1 背景 其实有点不想写这篇文章的,但是又想写,有些矛盾.不想写的原因是随便上网一搜一堆关于性能的建议,感觉 ...
- Android 应用开发性能优化完全分析
1 背景 其实有点不想写这篇文章的,但是又想写,有些矛盾.不想写的原因是随便上网一搜一堆关于性能的建议,感觉大家你一总结.我一总结的都说到了很多优化注意事项,但是看过这些文章后大多数存在一个问题就是只 ...
- 【转】Android应用开发性能优化完全分析
http://blog.csdn.net/yanbober/article/details/48394201 1 背景 其实有点不想写这篇文章的,但是又想写,有些矛盾.不想写的原因是随便上网一搜一堆关 ...
- Android应用开发性能优化完全分析
1 背景 其实有点不想写这篇文章的,但是又想写,有些矛盾.不想写的原因是随便上网一搜一堆关于性能的建议,感觉大家你一总结.我一总结的都说到了很多优化注意事项,但是看过这些文章后大多数存在一个问题就是只 ...
随机推荐
- CMMI 是什么东西?
摘要: CMMI全称是Capability Maturity Model Integration,CMMI是个好东西来的,但行内人士对她的认识并不全面,甚至有种种的误解.尽管网上有很多CMM ...
- [Cacti] memcache安装执行、cacti监控memcache实战
简单介绍 Memcache是danga.com的一个项目,最早是为 LiveJournal 服务的.眼下全世界不少人使用这个缓存项目来构建自己大负载的站点,来分担数据库的压力. Memcache官方站 ...
- php获取server端mac和clientmac的地址
获取servermac <?php /** 获取网卡的MAC地址原码:眼下支持WIN/LINUX系统 获取机器网卡的物理(MAC)地址 **/ class GetmacAddr{ var $re ...
- System单元对所有与COM相关的声明就这么多,需要倒背如流
是首先是VM表,但是和COM相关的函数地址都废弃了,这几个VM函数具体放在哪里,还得在研究: { Virtual method table entries } vmtSelfPtr = -; vmtI ...
- drupal 7 模块开发,hook_form
因为不是系统学习,只能把每天自己学习到的东西零碎的记录下来. 一来方便自己记忆,二来可供大家查阅. 后续有精力再去做进一步的整理. 1 开发一个模块分为有下面几个文件 hook.admin.inc h ...
- UVa 474 - Heads / Tails Probability
题目:计算1/(2^n)的值的前4为有效数字以及位数. 分析:数论,大整数.直接用数组模拟就可以. 说明:打表计算.查询输出. #include <iostream> #include & ...
- 使用Visual Studio 创建新的Web Part项目
使用Visual Studio 创建新的Web Part项目 Web Part是你将为SharePoint创建的最常见的对象之中的一个.它是平台构建的核心基块. 1. 管理员身份打开Visual St ...
- 零基Android手机嵌入式开发培训课程
亲爱的朋友,我这里有一组当然想和大家分享,假设有兴趣在这个过程中,可以加我QQ2059055336和我联系. 课程章节分布: 第一部分 嵌入式C与数据结构篇 (20讲) 第二部分ARM裸机开发篇 (4 ...
- Windows - Windows的文件名的全路径(Fully Qualified File Name)的最大长度为260字节
例如,你可以做以下实验来验证这个限制值: 在随意文件夹下新建一个文件夹. 在该新建文件夹下创建一个随意文件.使其名字长度不能再输入为止. 把该文件的全路径名copy到Microsoft Word中进行 ...
- 设置SVN忽略文件和文件夹(文件夹)
在多数项目中你总会有文件和文件夹不须要进行版本号控制.这可能包含一些由编译器生成的文件,*.obj,*.lst,也许是一个用于存放可运行程序的输出文件夹.仅仅要你提交改动,TortoiseSVN 就会 ...