chromium for android GPU进程结构分析
版权声明:本文为博主原创文章。未经博主同意不得转载。
https://blog.csdn.net/jaylinzhou/article/details/27517471
GPU进程的client(Browser进程,Render进程)都会创建一个
WebGraphicsContext3DCommandBufferImpl的实例,用于封装与GPU进程的通信。
所以我们从WebGraphicsContext3DCommandBufferImpl開始引出GPU进程的结构。
一.WebGraphicsContext3DCommandBufferImpl的创建。
WebGraphicsContext3D暴露的接口基本与OpenGL ES 2.0 API相应。
WebGraphicsContext3DCommandBufferImpl是WebGraphicsContext3D的实现类。
Browser进程创建WebGraphicsContext3DCommandBufferImpl的实例发生在
CompositorImpl::CreateOutputSurface()。
CompositorImpl::CreateOutputSurface()在创建
WebGraphicsContext3DCommandBufferImpl实例时传入了surface_id。
surface_id标识Browser应用中使用的android标准控件SurfaceView相应的
本地窗体的一块buffer。
Render进程创建WebGraphicsContext3DCommandBufferImpl的实例发生在
RenderWidget::CreateOutputSurface()
RenderWidget::CreateGraphicsContext3D()。
RenderWidget::CreateGraphicsContext3D()在创建
WebGraphicsContext3DCommandBufferImpl实例时传入了surface_id。
surface_id是RenderWidgetHostImpl::RenderWidgetHostImpl()
通过调用GpuSurfaceTracker::Get()->AddSurfaceForRenderer()得到的。
通过以下路径传递给RenderWidget::surface_id_。
watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvamF5bGluemhvdQ==/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center" alt="" />
二.WebGraphicsContext3DCommandBufferImpl中包括的与GPU进程通信相关的成员变量:
scoped_refptr<GpuChannelHost> host_;
CommandBufferProxyImpl* command_buffer_;
gpu::gles2::GLES2CmdHelper* gles2_helper_;
gpu::TransferBuffer* transfer_buffer_;
gpu::gles2::GLES2Interface* gl_;
以下一一介绍这些成员变量的作用。
scoped_refptr<GpuChannelHost> host_的创建及其作用。
Browser进程和Render进程在创建WebGraphicsContext3DCommandBufferImpl实例时都传
入了GpuChannelHostFactory实例。
Browser进程传入的是BrowserGpuChannelHostFactory。
Render进程传入的是RenderThreadImpl。
BrowserGpuChannelHostFactory与RenderThreadImpl继承自GpuChannelHostFactory。
WebGraphicsContext3DCommandBufferImpl::Initialize(){
host_ = factory_->EstablishGpuChannelSync(cause);
}
WebGraphicsContext3DCommandBufferImpl::Initialize()调用传递进来的
GpuChannelHostFactory实例生成GpuChannelHost实例。
GpuChannelHost封装client和GPU进程之间的IPC通道。
GPU进程中会产生一个相应的GpuChannel实例。
Browser进程与GPU进程之间IPC Channel的建立过程。
watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvamF5bGluemhvdQ==/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center" alt="" />
BrowserGpuChannelHostFactory::EstablishGpuChannelSync()先后调用例如以下3个函数:
1.BrowserGpuChannelHostFactory::EstablishGpuChannelOnIO()
2.gpu_channel_ = new GpuChannelHost(this, request.gpu_host_id, gpu_client_id_);
3.gpu_channel_->Connect(request.channel_handle);
1.BrowserGpuChannelHostFactory::EstablishGpuChannelOnIO()会触发GPU进程创建GpuChannel。
watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvamF5bGluemhvdQ==/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center" alt="" />
2.BrowserGpuChannelHostFactory::EstablishGpuChannelSync()在GPU进程创建完GpuChannel后,
创建与GpuChannel相相应的Browser进程中的GpuChannelHost实例。
3.调用GpuChannelHost::Connect()连接Browser进程GpuChannelHost与GPU进程GpuChannel。
Render进程与GPU进程之间IPC Channel的建立过程。
RenderWidget::CreateGraphicsContext3D()
WebGraphicsContext3DCommandBufferImpl::Initialize()
RenderThreadImpl::EstablishGpuChannelSync()
RenderThreadImpl::EstablishGpuChannelSync()先后调用了例如以下3个函数:
1.RenderThreadImpl::Send(new GpuHostMsg_EstablishGpuChannel());
2.gpu_channel_ = new GpuChannelHost(this, request.gpu_host_id, gpu_client_id_);
3.gpu_channel_->Connect(request.channel_handle);
1.RenderThreadImpl::Send(new GpuHostMsg_EstablishGpuChannel())会触发GPU进程中GpuChannel的创建。
GpuMessageFilter::OnMessageReceived()
GpuMessageFilter::OnEstablishGpuChannel()
GpuProcessHost::EstablishGpuChannel()
接下来的流程就是Browser进程发送消息触发GPU进程中GpuChannel的创建。
所以Render进程相应的GpuChannel是通过Browser进程触发GPU进程创建的。
2.RenderThreadImpl::EstablishGpuChannelSync()在通过Browser进程创建完GpuChannel实例后,创建
与GpuChannel相相应的Render进程中的GpuChannelHost实例。
3.调用GpuChannelHost::Connect()连接Render进程的GpuChannelHost实例与GPU进程中的GpuChannel实例。
Browser进程CommandBufferProxyImpl* command_buffer_的创建及其作用
CommandBufferProxyImpl是GPU进程client代理,负责将消息同步给GPU进程中相应的GpuCommandBufferStub。
GpuCommandBufferStub与GPU进程中的CommandBufferProxyImpl一一相应。
Browser进程先触发GPU进程创建GpuCommandBufferStub的实例后,再创建CommandBufferProxyImpl。
GpuCommandBufferStub的实例的创建步骤例如以下。
watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvamF5bGluemhvdQ==/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center" alt="" />
GpuChannelHost::CreateViewCommandBuffer()在触发GPU进程创建GpuCommandBufferStub的实例后,
创建了与GpuCommandBufferStub相相应的CommandBufferProxyImpl。
Render进程CommandBufferProxyImpl* command_buffer_的创建流程例如以下。
gpu::gles2::GLES2CmdHelper* gles2_helper_;
gpu::gles2::GLES2CmdHelper帮助写入GL command buffer的辅助类。
gpu::TransferBuffer* transfer_buffer_;
gpu::TransferBuffer管理transfer buffer的类。
gpu::gles2::GLES2Interface* gl_;
gl_实际指向GLES2Implementation的实例。
GLES2Implementation在command buffers之上模拟GLES2。
GPU进程的client使用GLES2Implementation。
GLES2Implementation封装了shared memory的处理和command buffer的管理。
gles2_helper_和 transfer_buffer_都设置给gl_,在类GLES2Implementation中使用。
GPU进程client与GPU进程通信的流程是:
WebGraphicsContext3DCommandBufferImpl调用GLES2Implementation的相应接口,
GLES2Implementation调用GLES2CmdHelper将要发送给GPU进程的命令写入CommandBuffer
包括的SharedMemory中。这块SharedMemory也被映射到GPU进程中。
GPU进程中GLES2DecoderImpl负责处理GLES2Implementation发送的命令。
CommandBuffer包括的SharedMemory被映射到GPU进程中由CommandBufferService管理。
所以GLES2DecoderImpl通过操作CommandBufferService来取得命令相关的数据。
CommandBufferProxyImpl通过IPC发送消息给GPU进程,同步GPU进程中的操作。
GPU进程client通过CommandBufferProxyImpl发送的IPC消息是以GpuCommandBufferMsg_为前缀的。
GPU进程中接受这类消息的是GpuCommandBufferStub。
GpuCommandBufferStub调用CommandBufferService完毕实际的消息处理。
Gpu进程client和Gpu进程结构例如以下图:
三.GPU进程的创建
gpu_process_host.cc中定义了GpuMainThread类。
GpuMainThread::init()函数中创建GPU进程,或者在设置了in-process-gpu或single-process时。
创建GPU线程。
GPU进程是Browser进程的子进程。仅仅会在Browser进程中创建一次。
chromium for android GPU进程结构分析的更多相关文章
- Chromium的GPU进程启动流程
转载请注明出处:http://www.cnblogs.com/fangkm/p/3960327.html 硬件渲染依赖计算机的GPU,GPU种类繁多,兼容这么多种类的硬件,稳定性是个大问题,虽然Chr ...
- 【Chromium】GPU进程启动流程
本篇文档以gpu进程的创建和启动为例,讲述chormium如何启动一个browser进程的子进程 PS:本文使用的chromium代码版本为71 前言 GPU进程的启动时机是由browser进程负责的 ...
- 理解WebKit和Chromium: 调试Android系统上的Chromium
转载请注明原文地址:http://blog.csdn.net/milado_nju 1. Android上的调试技术 在Android系统上,开发人员能够使用两种不同的语言来开发应用程序,一种是Jav ...
- Chromium Graphics: Android L平台上WebView的变化及其对浏览器厂商的影响分析
原创文章.转载请以链接形式注明原始出处为http://blog.csdn.net/hongbomin/article/details/40799167. 摘要:Google近期公布的Android L ...
- chromium for android v34 2dcanvas硬件渲染实现分析
这篇接着上一篇2dcanvas硬件绘制,分析保存绘制结果的texture被合成到on screen framebuffer上的过程. 1.webkit为canvas元素相应的render树节点Rend ...
- Android内存进程管理机制
参考文章: http://www.apkbus.com/android-104940-1-1.htmlhttp://blog.sina.com.cn/s/blog_3e3fcadd0100yjo2.h ...
- Android项目目录结构分析
Android项目目录结构分析 1.HelloWorld项目的目录结构1.1.src文件夹1.2.gen文件夹1.3.Android 2.1文件夹1.4.assets 1.5.res文件夹1.6.An ...
- Android的进程和线程(转)
进程和线程 当一个应用程序第一次启动的时候,Android会启动一个Linux进程和一个主线程(即UI线程:主要负责处理用户的按键事件.触屏事件及屏幕绘图事件等).默认情况下,所有该程序的组件都将在该 ...
- 第11讲- Android中进程及其优先级
第11讲Android中进程及其优先级 进程与线程: 进程:操作系统结构的基础,资源分配的最小单元,一个操作系统包括多个进程: 线程:线程存在于进程当中,是操作系统调试执行的最小单元,一个进程包括多个 ...
随机推荐
- asp.net+批量下载附件
asp.net 下载文件几种方式 protected void Button1_Click(object sender, EventArgs e) { /* 微软为Response对象提供了一个新的方 ...
- The GuidRepresentation for the reader is CSharpLegacy, which requires the binary sub type to be Uuid
使用客户端链接MongoDb报错 The GuidRepresentation for the reader is CSharpLegacy, which requires the binary su ...
- QT 信号槽 异步事件驱动 单线程 多并发
利用好Qt 模块的异步信号槽,单线程同样可是实现很强悍的的并发能力.应付正常的功能是足够的. 需要注意的是:该模式本质上为 单线程 事件驱动异步模式,所以需要做的事优化你的业务代码构架以应付性能与并发 ...
- (60) 结构体指针、结构体变量嵌套、结构体指针嵌套、函数指针、数组指针、指针数组、typedef 综合运用
#include<stdio.h> #include<iostream> #include<malloc.h> /* author : 吴永聪 program: 结 ...
- windows powershell的常用命令
cmd开启3389 如何用CMD开启3389与查看3389端口 开启 REG ADD HKLM\SYSTEM\CurrentControlSet\Control\Terminal /f 查端口 net ...
- 《Effective Java》读书笔记 - 5.泛型
Chapter 5 Generics Item 23: Don't use raw types in new code 虽然你可以把一个List<String>传给一个List类型(raw ...
- sso单点登录原理详解
sso单点登录原理详解 01 单系统登录机制 1.http无状态协议 web应用采用browser/server架构,http作为通信协议.http是无状态协议,浏览器的每一次请求,服务 ...
- (转)使用NMAP工具扫描端口
原文:http://www.linuxde.net/2013/02/12354.html nmap 是一个用于网络探索或安全评测的工具.它支持 ping 扫描(判定哪些主机在运行),多端口扫描技术(判 ...
- C#中winform下利用ArcEngine调用ArcGIS Server发布的服务 AE 10
开发环境:vs2010 + AE 10 测试 public Form1() { ESRI.ArcGIS.RuntimeManager.Bind(ESRI.ArcGIS.ProductCode.Engi ...
- 使用cesium中的scene.open中遇到的几个问题
有些服务是发在场景(scene)下的,超图提供了一个很方便的方法:scene.open,这个方法会将场景中所有的图层(无论是OSGB还是影像和地形)加载进来.同时这个方法会自带一个自动地位功能,具体实 ...