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" >

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" >

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().

以上过程,曾经的文章中分析过,不细分析了。

时间: 2024-10-23 15:36:19

chromium for android v34 2dcanvas硬件渲染实现分析的相关文章

chromium for android v34 2dCanvas硬件绘制及硬件渲染实现分析

HTMLCanvasElement对应h5的canvas元素. 解析网页遇到canvas元素会创建HTMLCanvasElement实例. Canvas可以支持2d和3d图形的绘制. HTMLCanvasElement提供了getContext()接口,返回图形绘制的上下文对象, 对于2d图形返回的是CanvasRenderingContext2D. CanvasRenderingContext2D提供了网页可调用的所有绘制动作. CanvasRenderingContext2D的所有绘制命令都

Android中GPU硬件加速控制及其在2D图形绘制上的局限

图形的渲染可分为两种:软件渲染和硬件渲染.软件渲染是靠CPU计算各种坐标并绘制,主要是占用内存:硬件渲染是靠GPU,主要占用显存,一般的3D图形程序(OpenGL.DirectX)都是GPU加速的. 在Android3.0之前,2D绘图API只支持软件渲染模式,从Android3.0开始,2D绘图API开始支持GPU硬件渲染,即View中的Canvas的绘图操作会使用GPU,所以从Android 3.0(API Level 11)开始,View中就多了一些和硬件相关的方法.如果App的Andro

android4.4 webview chromium与chromium for android硬件渲染的异同

相同点: android4.4 webview chromium的渲染流程与chromium for android硬件渲染流程全解析(render进程)中总结的五个子流程完全一致. android4.4 webview chromium的渲染流程也是这五个子流程组成的. 不同点: 1.android4.4中网页渲染的驱动还是android的UI系统控制的.即WebView.onDraw()是渲染的入口.chromium for android没有用到WebView控件,绘制的驱动完全由底层ch

chromium for android 硬件渲染流程总结

render进程中 一.webkit模块 webkit引擎会为网页内容同时创建Dom tree, Render tree和RenderLayer tree. 这三棵树之间的关系参见chrome硬件渲染 每一个Render Object都关联着一个RenderLayer.Render Object与RenderLayer是多对一的关系. RenderLayer代表了网页某一层的内容.正是由于RenderLayer的存在,网页上的元素才可以按照 正确的顺序合成,从而恰当的显示有交叠的内容,和半透明元

android4.4 webview chromium实现硬件渲染的chromium内核结构

这里只关注与原生chromium不同的几个类. 一.DrawGLFunctor android4.4 webview chromium的硬件渲染是android ui系统和chromium内核协作 完成的.android ui系统负责触发网页渲染(调用WebView.onDraw()),以及提供 网页内容的最终目的地(HardwareCanvas);chromium内核提供具体的渲染行为. 这里就引出了DrawGLFunctor结构. DrawGLFunctor.java/draw_gl_fun

Chromium Graphics: 再谈Chromium WebView硬件渲染模式的演进

摘要:从Android KitKat系统第一个采用Chromium内核的WebView开始,Android WebView一直在持续演进中,自Chromium M38开始,WebView在硬件渲染模式方面发生了较大的变化,最明显的变化莫过于WebGL的支持以及ubercompositor的使用,同时为了吻合Android L的渲染模型变化,DrawGL函数是在Android系统的渲染线程中执行的. Android 4.4系统WebView的硬件渲染 对于Chromium WebView来说,首先

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

摘要:Android L平台在图形渲染方面有一项重要的改进,它引入了一个专门的线程用于执行渲染工作,UI线程负责生成的显示列表(DisplayList),渲染线程负责重放(playback)这个显示列表绘制最终的内容,因此Chromium WebView在图形栈的实现方面也作了相应的调整,以支持Android L系统上新的渲染线程模型.本文将深度分析Chromium WebView的渲染流水线是如何无缝整合到Android L系统的渲染模型中,以及对目前市场主流浏览器厂商将会产生什么样影响等问题

Chromium on Android: 认识Chromium WebView

Android KitKat一项重要的更新就是WebView采用Chromium/Blink渲染引擎,本文简要的叙述了新版WebView的主要特性.需要进一步改进的地方以及WebView的代码结构等. WebView前世今生 WebView是Android平台上一个非常重要的系统组件,用于将一个显示Web页面的窗口部件view嵌入到应用程序,并提供了一组API接口允许开发者定制页面加载和绘制的行为,比如响应页面加载状态的变化和弹出JavaScript对话框的请求等等.自Android 1.0发布

chromium for android GPU进程结构分析

GPU进程的客户端(Browser进程,Render进程)都会创建一个 WebGraphicsContext3DCommandBufferImpl的实例,用于封装与GPU进程的通信. 所以我们从WebGraphicsContext3DCommandBufferImpl开始引出GPU进程的结构. 一.WebGraphicsContext3DCommandBufferImpl的创建. WebGraphicsContext3D暴露的接口基本与OpenGL ES 2.0 API对应. WebGraphi