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中进程及其优先级 进程与线程: 进程:操作系统结构的基础,资源分配的最小单元,一个操作系统包括多个进程: 线程:线程存在于进程当中,是操作系统调试执行的最小单元,一个进程包括多个 ...
随机推荐
- net core 接受post值
public static string GetPostParams(HttpContext context) { string param = string.Empty; if (context.R ...
- protocol buffer第一篇:语法介绍
先理解一下protocol buffer是什么东西. protocol buffer是google发明的一种数据序列化方案,和json是同种类型的玩意,它非常适合在rpc场景下使用.同json一样,p ...
- 大文件的分片传,断点续传,md5校验
一.概述 所谓断点续传,其实只是指下载,也就是要从文件已经下载的地方开始继续下载.在以前版本的HTTP协议是不支持断点的,HTTP/1.1开始就支持了.一般断点下载时才用到Range和Content- ...
- [luogu]P3959 宝藏[NOIP][状态压缩DP]
[luogu]P3959 宝藏[TREASURE] 题目描述 参与考古挖掘的小明得到了一份藏宝图,藏宝图上标出了 n 个深埋在地下的宝藏屋, 也给出了这 n 个宝藏屋之间可供开发的 m 条道路和它们的 ...
- 网页设计之js
1.JavaScript概述 javaScript与ECMAScript的相爱相杀 1996年11月,JavaScript的创造者--Netscape公司,决定将JavaScript提交给国际标准化组 ...
- Python os模块方法
os模块提供了大量有用的方法来处理文件和目录.本章节中的代码实例是在 Ubuntu Linux系统上运行来演示. 大多数有用的方法都列在这里 - 编号 方法 描述/说明 1 os.access(pat ...
- 获取免费的https证书
可以通过网站获取免费的https证书 首先到https://freessl.org注册一个账号 然后就可以开始创建免费证书了 获取的证书里面通常只有pem后缀文件 nodejs使用的时候需要crt文件 ...
- C# AxWindowsMediaPlayer
AxWMPLib.AxWindowsMediaPlayer winPlayer = new AxWMPLib.AxWindowsMediaPlayer(); winPlayer.Dock = Dock ...
- 阶段3 1.Mybatis_12.Mybatis注解开发_5 mybatis注解建立实体类属性和数据库表中列的对应关系
创建新项目,一对多 复制刚才关闭的项目的文件 复制到们的新项目里面 复制包的依赖 删减相关代码.只保留这三个查询的方法 模糊查询改成传统的占位符的方式 之前是可以自定义实体类的属性字段,和数据库的字典 ...
- vue 请求完接口后执行方法
getLunbo: function() { var that = this; that.lunbo = []; // api.showProgress({ // title: '加载中' // }) ...