版权声明:本文为博主原创文章。未经博主同意不得转载。

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进程结构分析的更多相关文章

  1. Chromium的GPU进程启动流程

    转载请注明出处:http://www.cnblogs.com/fangkm/p/3960327.html 硬件渲染依赖计算机的GPU,GPU种类繁多,兼容这么多种类的硬件,稳定性是个大问题,虽然Chr ...

  2. 【Chromium】GPU进程启动流程

    本篇文档以gpu进程的创建和启动为例,讲述chormium如何启动一个browser进程的子进程 PS:本文使用的chromium代码版本为71 前言 GPU进程的启动时机是由browser进程负责的 ...

  3. 理解WebKit和Chromium: 调试Android系统上的Chromium

    转载请注明原文地址:http://blog.csdn.net/milado_nju 1. Android上的调试技术 在Android系统上,开发人员能够使用两种不同的语言来开发应用程序,一种是Jav ...

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

    原创文章.转载请以链接形式注明原始出处为http://blog.csdn.net/hongbomin/article/details/40799167. 摘要:Google近期公布的Android L ...

  5. chromium for android v34 2dcanvas硬件渲染实现分析

    这篇接着上一篇2dcanvas硬件绘制,分析保存绘制结果的texture被合成到on screen framebuffer上的过程. 1.webkit为canvas元素相应的render树节点Rend ...

  6. Android内存进程管理机制

    参考文章: http://www.apkbus.com/android-104940-1-1.htmlhttp://blog.sina.com.cn/s/blog_3e3fcadd0100yjo2.h ...

  7. Android项目目录结构分析

    Android项目目录结构分析 1.HelloWorld项目的目录结构1.1.src文件夹1.2.gen文件夹1.3.Android 2.1文件夹1.4.assets 1.5.res文件夹1.6.An ...

  8. Android的进程和线程(转)

    进程和线程 当一个应用程序第一次启动的时候,Android会启动一个Linux进程和一个主线程(即UI线程:主要负责处理用户的按键事件.触屏事件及屏幕绘图事件等).默认情况下,所有该程序的组件都将在该 ...

  9. 第11讲- Android中进程及其优先级

    第11讲Android中进程及其优先级 进程与线程: 进程:操作系统结构的基础,资源分配的最小单元,一个操作系统包括多个进程: 线程:线程存在于进程当中,是操作系统调试执行的最小单元,一个进程包括多个 ...

随机推荐

  1. docker小知识

    1,docker 使用普通用户 添加用户组: sudo groupadd docker 加入docker 组 sudo gpasswd -a ${USER} docker 或 usermod -aG ...

  2. [模板][快速排序&归并排序]

    不得不说,手写的快排真的好菜.(即使开了随机数...) 快速排序 #include<iostream> #include<cstdio> #include<cstring ...

  3. docker安装xxl-job

    一 安装mysql root@localhost tmp]# docker run -itd --name xxl-mysql -p 3306:3306 -e MYSQL_ROOT_PASSWORD= ...

  4. [机器学习]Fine Tune

    Fine Tune顾名思义,就是微调.在机器学习中,一般用在迁移学习中,通过控制一些layer调节一些layer来达到迁移学习的目的.这样可以利用已有的参数,稍微变化一些,以适应新的学习任务.所以说, ...

  5. You have 1 unapplied migration(s). Your project may not work properly until you apply the migrations for app(s): shopadmin. Run 'python manage.py migrate' to apply them.

    数据库迁移时报错, You have 1 unapplied migration(s). Your project may not work properly until you apply the ...

  6. ZooKeeper设置开机启动

    1 在init.d目录下新建脚本文件 进入到/etc/rc.d/init.d目录下,命令是: cd    /etc/rc.d/init.d 新建一个名为zookeeper的文件,命令是: touch ...

  7. Spring Boot教程(三)消费Restful的web服务

    构架工程 创建一个springboot工程,去消费RESTFUL的服务.这个服务是 http:///gturnquist-quoters.cfapps.io/api/random ,它会随机返回Jso ...

  8. vim编辑器快捷键

    光标控制命令 命令 光标移动 h或^h 向左移一个字符 j或^j或^n 向下移一行 k或^p 向上移一行 l或空格 向右移一个字符 G 移到文件的最后一行 nG 移到文件的第n行 w 移到下一个字的开 ...

  9. 在ThinkPHP框架(5.0.24)下引入Ueditor并实现向七牛云对象存储上传图片同时将图片信息保存到MySQL数据库,同时实现lazyload懒加载

    这是我花了很多天的时间才得以真正实现的一组需求. 文章后面有完整Demo的GitHub链接. 一. 需求描述 1. 应用是基于ThinkPHP5开发的: 2. 服务器环境是LNMP,PHP版本是7.2 ...

  10. Python-Django WebAPi基本使用方法

    目的 利用django搭建一个WebApi,实现数据库表的增删查改. 数据传输基于Http协议,数据格式:JSON ORM方式进行数据库表的CRUD(增删查改) 开发步骤 使用pycharm专业版搭建 ...