zoukankan      html  css  js  c++  java
  • 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上的步骤例如以下:


    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().
    以上过程,曾经的文章中分析过,不细分析了。


  • 相关阅读:
    four day (linux基础学习1)
    three day(网络基础)
    two day(操作系统)
    Oldboy One day(计算机基础)
    mybatis调用存储过程
    调用jiathis分享接口
    汉字转换拼音工具类
    Ajax前后台交互 返回普通格式和JSON格式
    Bootstrap与EasyUI入门
    MD5,sha1加密工具类
  • 原文地址:https://www.cnblogs.com/mengfanrong/p/5134016.html
Copyright © 2011-2022 走看看