这篇接着上一篇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. Erlang cowboy 处理不规范的client

    Erlang cowboy 处理不规范的client Cowboy 1.0 參考 本章: Dealing with broken clients 存在很多HTTP协议的实现版本号. 很多广泛使用的cl ...

  2. c++ 使用全局变量的方法多个文件

    启动错误的做法 在global.h声明和定义变量 int sharedData = 9; 编译出错 Building target: CTest Invoking: GCC C++ Linker g+ ...

  3. operation is executing and cannot be enqueued

    http://d2100.com/questions/29022 作为依赖关系的另一个 NSOperation 添加时不调用 NSOperation dealloc 使用文书我看到很多我自定义的 NS ...

  4. bootstrap css选择不同的宽度

    刚开始使用bootstrap css开源项目.遇到一个问题,默认的input 宽度太大,需要找小一点的. 其实只需要在input tag中选用预定义的较小的宽度即可.比如: <input typ ...

  5. IOS开发之----四舍五入问题

    方法一: -(NSString *)notRounding:(float)price afterPoint:(int)position{ NSDecimalNumberHandler* roundin ...

  6. android doGet和doPost

    doGet和doPost的差别 get和post是http协议的两种方法,另外还有head, delete等  这两种方法有本质的差别,get仅仅有一个流,參数附加在url后.大小个数有严格限制且仅仅 ...

  7. 为什么php时间阅读RTF,p标签会出现红色

    为什么php读取富文本的时候,p标签会出现红线,怎么去掉,哪位大侠帮解决?跪求答案 就像以下一样,一遇到p标签就有红虚线 版权声明:本文博客原创文章,博客,未经同意,不得转载.

  8. Nginx特点

    Nginx特点:1,跨平台:Nginx 能够在大多数 Unix like OS编译执行,并且也有Windows的移植版本号.2,配置异常简单:很easy上手.配置风格跟程序开发一样,神一般的配置.3, ...

  9. poj3984(经典dfs)

    题目链接:http://poj.org/problem?id=3984 分析:直接深搜从起点到终点,如何取最短路线,其实只要优先向下或向右走即可. #include <cstdio> #i ...

  10. Beijing Perl Workshop - Augest 10th, 2013

    Beijing Perl Workshop - Augest 10th, 2013 Beijing Perl Workshop