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中进程及其优先级 进程与线程: 进程:操作系统结构的基础,资源分配的最小单元,一个操作系统包括多个进程: 线程:线程存在于进程当中,是操作系统调试执行的最小单元,一个进程包括多个 ...
随机推荐
- html a标签 语法
html a标签 语法 作用:<a> 标签定义超链接,用于从一张页面链接到另一张页面. 直线电机滑台 说明:<a> 元素最重要的属性是 href 属性,它指示链接的目标.在所有 ...
- ubuntu 安装 tar.gz 文件
ubuntu 安装 tar.gz 文件 本文链接:https://blog.csdn.net/caloriesung/article/details/81536144 tar zxvf FileNam ...
- Android学习笔记之Menu的ShowAsAction属性的设置
(1)在res--menu目录下的main.xml文件 ? 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 2 ...
- Spring Boot教程(二十一)开发Web应用(2)
在完成配置之后,举一个简单的例子,在快速入门工程的基础上,举一个简单的示例来通过Thymeleaf渲染一个页面. @Controller public class HelloController { ...
- 实时监控文件变化以及处理xml(仅用作笔记用,防止以后要用)
private static void WatcherStrat(string path, string filter) { try { FileSystemWatcher watcher = new ...
- QPS、TPS、PV、UV、GMV、IP、RPS
摘自:https://www.citrons.cn/jishu/226.html 关于 QPS.TPS.PV.UV.GMV.IP.RPS 这些词语,看起来好像挺专业.但实际上,我认为是这是每个程序员必 ...
- Mac securecrt 破解版安装
破解一 1.先链接:https://pan.baidu.com/s/1-1nu4eRf7BmuLg5MtlCRvw 密码:30pq 默认下载到了当前用户的”下载”目录中 在”Finder”中 ...
- C++ STL 关于双向链表list的splice函数
转载自https://blog.csdn.net/qjh5606/article/details/85881680 list::splice实现list拼接的功能.将源list的内容部分或全部元素删除 ...
- word中打字会覆盖下一个字
insert键 误按了insert键,此时Word默认为改写模式,输入文本会覆盖后面的内容.
- java基础笔记1--关于线程死锁
关于线程死锁 什么是死锁: 在编写多线程的时候,必须要注意资源的使用问题,如果两个或多个线程分别拥有不同的资源, 而同时又需要对方释放资源才能继续运行时,就会发生死锁. 简单来说:死锁就是当一个或多个 ...