这篇接着上一篇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硬件渲染实现分析的更多相关文章

  1. Chromium Graphics: Android L平台上WebView的变化及其对浏览器厂商的影响分析

    原创文章.转载请以链接形式注明原始出处为http://blog.csdn.net/hongbomin/article/details/40799167. 摘要:Google近期公布的Android L ...

  2. 理解WebKit和Chromium: 调试Android系统上的Chromium

    转载请注明原文地址:http://blog.csdn.net/milado_nju 1. Android上的调试技术 在Android系统上,开发人员能够使用两种不同的语言来开发应用程序,一种是Jav ...

  3. Chromium on Android: Android在系统Chromium为了实现主消息循环分析

    总结:刚开始接触一个Chromium on Android时间.很好奇Chromium主消息循环是如何整合Android应用. 为Android计划,一旦启动,主线程将具有Java消息层循环处理系统事 ...

  4. Android系统修改硬件设备访问权限

    Android系统修改硬件设备访问权限 在硬件抽象层模块文件(so)文件中,提供的函数调用open函数来打开设备文件,比如/dev/gpio,如果不修改设备文件/dev/gpio的访问权限,那么应用程 ...

  5. 把Android原生的View渲染到OpenGL Texture

    http://blog.csdn.net/u010949962/article/details/41865777 最近要把Android 原生的View渲染到OpenGL GLSurfaceView中 ...

  6. 转——Android应用开发性能优化完全分析

    [工匠若水 http://blog.csdn.net/yanbober 转载请注明出处.] 1 背景 其实有点不想写这篇文章的,但是又想写,有些矛盾.不想写的原因是随便上网一搜一堆关于性能的建议,感觉 ...

  7. Android 应用开发性能优化完全分析

    1 背景 其实有点不想写这篇文章的,但是又想写,有些矛盾.不想写的原因是随便上网一搜一堆关于性能的建议,感觉大家你一总结.我一总结的都说到了很多优化注意事项,但是看过这些文章后大多数存在一个问题就是只 ...

  8. 【转】Android应用开发性能优化完全分析

    http://blog.csdn.net/yanbober/article/details/48394201 1 背景 其实有点不想写这篇文章的,但是又想写,有些矛盾.不想写的原因是随便上网一搜一堆关 ...

  9. Android应用开发性能优化完全分析

    1 背景 其实有点不想写这篇文章的,但是又想写,有些矛盾.不想写的原因是随便上网一搜一堆关于性能的建议,感觉大家你一总结.我一总结的都说到了很多优化注意事项,但是看过这些文章后大多数存在一个问题就是只 ...

随机推荐

  1. OCA读书笔记(9) - 管理数据同步

    9.Managing Data Concurrency 描述锁机制以及oracle如何管理数据一致性监控和解决锁冲突 管理数据的并发--管理锁数据的不一致:脏读更改丢失幻影读 脏读:数据是指事务T2修 ...

  2. heapq

    heapq-Guest-ChinaUnix博客 假设你需要维护一个列表,这个列表不断有新的元素加入,你需要在任何时候很方便的得到列表中的最大(小)值,因此要求列表始终处于排序完毕状态,怎么办呢 最简单 ...

  3. [poj 2991]Crane[线段树表示向量之和,而非数量]

    题意: 起重机的机械臂, 由n段组成, 对某一些连接点进行旋转, 询问每次操作后的末端坐标. 思路: 由于旋转会影响到该点之后所有线段的角度, 因此容易想到用线段树记录角度, 成段更新. (但是不是每 ...

  4. OSG+VS2010+win7环境搭建

    Win7下 osg+vs2010环境搭建 一.相关准备 a) Osg源代码 当前最新版:OpenSceneGraph的3.0.0.zip 下载链接: http://www.openscenegraph ...

  5. android中更改spinner、AutoCompleteTextView切割线的颜色

    话说去除切割线的方法找了非常久也没找到,最终发现了更改切割线的方法 spinner和AutoCompleteTextView提示列表中间有一条黑色的切割线.想要改变它的颜色值,就要重写style. 1 ...

  6. MySQL 模拟Oracle邻接模型树形处理

    数据库对层次结构的处理模型有好多种,能够依据自己的需求来设计模型.当然最简单的也是最easy设计的模型就是所谓的邻接模型.在这方面,其它数据库比方Oracle 提供了现成的分析方法 connect b ...

  7. 写代码质量改善java计划151建议——导航开始

    2014-05-16 09:08 by Jeff Li 前言 系列文章:[传送门] 下个星期度过这几天的奋战,会抓紧java的进阶学习.听过一句话,大哥说过,你一个月前的代码去看下,慘不忍睹是吧.确实 ...

  8. java导入excel

    package com.duosen.gate.test; import java.io.File; import java.io.FileInputStream; import java.io.Fi ...

  9. UVa 884 - Factorial Factors

    题目:输出n!中素数因数的个数. 分析:数论.这里使用欧拉筛法计算素数,在计算过程中求解就可以. 传统筛法是利用每一个素数,筛掉自己的整数倍: 欧拉筛法是利用当前计算出的全部素数,乘以当前数字筛数: ...

  10. jconsole线程面板中的阻塞总数和等待总数(转)

    阻塞总数 Blocked count is the total number of times that the thread blocked to enter or reenter a monito ...