摘要:Chromium于GPU多个流程架构的同意GPUclient这将是这次访问的同时GPU维修,和GPUclient这之间可能存在数据依赖性。因此必须提供一个同步机制,以确保GPU订购业务。本文讨论了下一个多进程架构GPUclient之间的同步,而同步点(SyncPoint)。

GPU进程架构等基本概念

我们知道,Chromium是一个多进程架构的软件系统。出于安全和稳定性方面的考虑,Chromium有个专门的进程(或者线程)和GPU设备进行交互,运行GL操作,也就是说,不论什么一条GL命令都必须经由这个进程处理后才提交给GPU驱动,这个进程就是GPU进程。Renderer进程或者Browser进程必须通过IPC才干与GPU进程交互,告诉GPU进程须要运行哪些GL命令。在这个过程中,Renderer进程或Browser进程是GPUclient,而GPU进程本身就是GPU服务端

GPUclient和服务端之间GL命令传输是通过命令缓冲区(CommandBuffer)完毕的。

CommandBuffer是Chromium为解决多进程架构下高效在client和服务端传输GL命令而设计的,缓冲区使用共享内存存储GL命令,每条GL命令的命令名和參数都会被序列化为字符串存储在命令行缓冲区中。当client须要将命令缓冲区中的全部GL命令提交给GPU服务端时。client会向服务端发送一条GpuCommandBufferMsg_AsyncFlush消息。服务端收到这条消息后会依据指定的偏移从CommandBuffer中读取GL命令并将其反序列化后再提交给GPU驱动。

Chromium中。页面的渲染和合成过程都启用了GPU硬件加速,不论什么一个要求GPU硬件加速的进程都是GPU进程的client,比如Renderer进程是GPUclient,由于它须要请求GPU进程绘制和合成页面的内容,Browser进程也是GPUclient,由于它须要将页面的内容与地址栏等元素进行终于的合成,并显示在屏幕上。

下图给出了GPUclient、GPU服务端以及命令缓冲区的基本关系。

GPUclient之间能够通过mailbox机制进行texture共享的,简单的说。mailbox机制就是给每一个texture生成唯一标识。并由GPU进程统一管理名标识和texture之间的映射关系。同一时候这些GPUclient属于同一上下文共享组。因此全部texture资源也是能够共享的。

GPUclient之间的同步问题

从上述描写叙述不难看出,GPU进程须要处理来自多个GPUclient的请求,而且这些GPUclient可能存在纹理(Texture)数据依赖关系。

以下以Android平台上渲染WebGL页面http://get.webgl.org 为例,说明为什么不同GPUclient会存在数据依赖关系。

首先,Browser进程是一个GPUclient,它创建了一个Browser端的合成器(Compositor)请求GPU进程将页面的内容和地址栏等UI元素(假设有)进行终于的合成。并将其渲染到SurfaceView上。Renderer进程也是GPUclient,它也会创建一个Renderer端的合成器用于页面内容的合成。并且这个client中还包括了两个独立的3D上下文,一个用于页面中渲染层的合成,还有一个作为WebGL的渲染上下文。

其次,在Android平台上,默认启用了托付模式(DelegatedRenderer)的渲染器,因此,Renderer端合成器管理的全部GPU资源(包含WebGL)都会通过IPC转交给Browser端的合成器,再由Browser端合成器对全部的texture进行统一的合成,当终于的合成操作完毕之后。Browser端合成器则会通知Renderer端,此时Renderer端的合成器能够安全删除不再使用的GPU资源。

最后,再来看看WebGL的渲染过程。在硬件加速的页面渲染机制中,页面的内容是由多个渲染层(RenderLayer)叠加构成的。普通情况下,渲染层都会使用Texture作为存储后端,Chromium中WebGL是一个独立的渲染层,在渲染每一帧内容时。Renderer进程会请求GPU进程创建一个新的Texture来存放WebGL的渲染结果。并通过Framebuffer对象将WebGL渲染到这个Texture中。

待 WebGL命令完毕后,Renderer端的合成器会将这个Texture以资源形式发送给Browser端的合成器。当Browser端合成器完毕WebGL内容的合成之后。会通知Renderer端将这个Texture删除。

从上面的描写叙述中能够判断出整个过程存在哪些问题呢?

第一。Renderer端的合成器和Browser端合成器存在数据依赖关系,是生产者-消费者的关系,即Renderer端的WebGL上下文生成Texture内容,Browser端合成器使用该内容;

第二,WebGL上下文和Browser端合成器存在同步问题。因为全部的GL命令都是在同一线程中执行。包含Browser端合成器和WebGL,而3D上下文是GPU线程的调度基本单位,也就是仅仅有同一个3D上下文中GL命令才干依照顺序逐条执行的。

一方面,不同GPUclient可能执行在不同的进程或者线程中,还有一方面。同一GPUclient的不同3D上下文可能执行在不同的线程中,比如Renderer进程的合成器执行在一个单独的线程中,而WebGL执行在Renderer进程的主线程中。显然。不同3D上下文中GL命令执行次序是不分先后的,这里就引申出一个问题,对于WebGL页面渲染而言,必须保证下面这两个要求:

  • 当WebGL上下文的GL命令运行完成后,Browser端合成器才干使用。
  • 当Browser端合成器使用完WebGL的Texture后,WebGL上下文才干安全删除;

否则Browser合成器使用的texture将会是不完整的。这就是GPUclient之间的同步问题。接下来将重点讨论Chromium是怎样解决问题的。

同步点机制的基本原理

Chromium通过GL扩展接口设计了一套同步机制解决不同GPUclient之间的同步问题,它必须满足两个条件:

第一,上下文A能够等待上下文B运行完一组GL命令后再运行上下文A中兴许的GL命令。

第二,上下文A中的这样的等待必须是非堵塞的,也就是说GPUclient代码的运行不能被堵塞。

依据gpu/gles2/extensions/GL_CHROMIUM_sync_point.txt文件所述,同步点机制定义了两个特定于Chromium的GL扩展接口:

        uint InsertSyncPointCHROMIUM()
void WaitSyncPointCHROMIUM(uint sync_point)

InsertSyncPointCHROMIUM在当前上下文中创建一个同步点并将其插入到命令流中,这个同步点起到一个防护墙的作用,当这个同步点之前的命令都已经提交到server。或者上下文被销毁时。会向该同步点发个信号。返回同步点的标识符。收到信号后。这个同步点会被删除点。在同一个server上同步点标识符在全部上下文中是唯一的,包含同一共享组的上下文。

WaitSyncPointCHROMIUM导致当前上下文暂停提交GL命令,直到指定同步点收到信号,被实现为服务端的等待。參数sync_point为InsertSyncPointCHROMIUM返回的同步点标识符。

假设sync_point參数无效。这个命令相当于no-op操作而且不会报错。

以上文档化的描写叙述读起来有些晦涩难懂。以下通过一个简化的样例更直观地说明SyncPoint在Chromium中的执行原理:

如果有两个上下文A和B。它们可能在不同的GPUclient中,但属于同一个共享组(ShareGroup),GPUclient代码中通过调用InsertSyncPointCHROMIUM在上下文A的命令流中插入一个同步点sp。而在上下文B中,调用WaitSyncPointCHROMIUM等待同步点sp,终于在GPU服务端运行GL命令的顺序为,仅仅有当上下文A中同步点sp之前的GL命令A1,A2和A3运行完成后,才会运行上下文B中的GL命令B3。

更进一步地说,上下文B中调用WaitSyncPointCHROMIUM(sp),实际上是指示GPU服务端停止向GPU设备提交上下文B兴许的GL命令,取而代之的是:

  • 假设此时上下文A的同步点sp之前的GL命令都已经运行完成,即同步点sp收到信号,已经从被删除了,那么能够忽略WaitSyncPointCHROMIUM了,继续运行上下文B中兴许的GL命令。
  • 假设此时上下文A的同步点sp之前的GL命令尚未运行,那么取而代之的是将等待上下文A中sp点之前的GL命令运行完成。这个等待发生在GPU服务端的,不会堵塞GPUclient兴许代码的运行(如Renderer进行的运行)。

综上所述,同步点机制同意client设定不同上下文之间GL命令运行的次序。上下文B等待上下文A的同步点实际上是保证A中同步点之前的命令在B中兴许命令之前运行。

未完待续...下节将从Chromium阅读源代码同步点是如何实现的机制

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

Chromium Graphics: GPUclient的原理和实现分析之间的同步机制-Part I的更多相关文章

  1. Chromium Graphics: GPUclient的原理和实现分析之间的同步机制-Part II

    摘要:Part I探析GPUclient之间的同步问题,以及Chromium的GL扩展同步点机制的基本原理.本文将源码的角度剖析同步点(SyncPoint)机制的实现方式. 同步点机制的实现主要涉及到 ...

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

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

  3. MYSQL索引结构原理、性能分析与优化

    [转]MYSQL索引结构原理.性能分析与优化 第一部分:基础知识 索引 官方介绍索引是帮助MySQL高效获取数据的数据结构.笔者理解索引相当于一本书的目录,通过目录就知道要的资料在哪里, 不用一页一页 ...

  4. 【MySQL】排序原理与案例分析

    前言 排序是数据库中的一个基本功能,MySQL也不例外.用户通过Order by语句即能达到将指定的结果集排序的目的,其实不仅仅是Order by语句,Group by语句,Distinct语句都会隐 ...

  5. PHP函数的实现原理及性能分析

    前言 在任何语言中,函数都是最基本的组成单元.对于php的函数,它具有哪些特点?函数调用是怎么实现的?php函数的性能如何,有什么使用建议?本文将从原理出发进行分析结合实际的性能测试尝试对这些问题进行 ...

  6. js手风琴图片切换实现原理及函数分析

    关键词: js手风琴 js百叶窗 js百页窗 实现原理解读 使用两层for循环实现, 第一层有三个功能,分别给第个li: 添加索引 预设位置 添加事件 第二层有两个功能,整理图片位置: 鼠标的li,以 ...

  7. 利用多写Redis实现分布式锁原理与实现分析(转)

    利用多写Redis实现分布式锁原理与实现分析   一.关于分布式锁 关于分布式锁,可能绝大部分人都会或多或少涉及到. 我举二个例子:场景一:从前端界面发起一笔支付请求,如果前端没有做防重处理,那么可能 ...

  8. Camera图像处理原理及实例分析-重要图像概念

    Camera图像处理原理及实例分析 作者:刘旭晖  colorant@163.com  转载请注明出处 BLOG:http://blog.csdn.net/colorant/ 主页:http://rg ...

  9. [置顶] NGINX原理分析之SLAB分配机制

    一.基础概述 如果使用伙伴系统分配和释放算法,不仅会造成大量的内存碎片,同时处理效率也比较低.SLAB是一种内存管理机制,其核心思想是预分配.SLAB是将空间按照SIZE对内存进行分类管理的,当申请一 ...

随机推荐

  1. MVC与三层架构

    我们平时总是将三层架构与MVC混为一谈,殊不知它俩并不是一个概念.下面我来为大家揭晓我所知道的一些真相. 首先,它俩根本不是一个概念. 三层架构是一个分层式的软件体系架构设计,它可适用于任何一个项目. ...

  2. iterator pattern

    6 迭代器模式总结 迭代器模式是一种使用频率非常高的设计模式,通过引入迭代器可以将数据的遍历功能从聚合对象中分离出来,聚合对象只负责存储数据,而遍历数据由迭代器来完成.由于很多编程语言的类库都已经实现 ...

  3. Blend4精选案例图解教程(五):可视数据管理

    原文:Blend4精选案例图解教程(五):可视数据管理 应用程序中我们会经常需要操作数据,在程序设计之初示例数据一般都是手工添加,Blend4提供了非常方便的数据管理能力,包括丰富的数据类型和内置示例 ...

  4. WEB安全实战(一)SQL盲注

    前言 好长时间没有写过东西了,不是不想写,仅仅只是是一直静不下心来写点东西.当然,拖了这么长的时间,也总该写点什么的.近期刚刚上手安全方面的东西,作为一个菜鸟,也本着学习的目的,就谈谈近期接触到的安全 ...

  5. log4net使用特定的解释

    说明:该程序演示如何使用log4net记录日志信息. log4net它是-known开源组件的日志记录功能.使用log4net可以很容易地将信息记录到文件.控制台.Windows事件日志和数据库(含有 ...

  6. React Native是一套使用 React 构建 Native app 的编程框架

    React Native是一套使用 React 构建 Native app 的编程框架 React Native at first sight what is React Native? 跟据官方的描 ...

  7. sql基础之DDL(Data Definition Languages)

    好久没写SQL语句了,复习一下. DDL数据定义语言,DDL定义了不同的数据段.数据库.表.列.索引等数据库对象的定义.经常使用的DDL语句包含create.drop.alter等等. 登录数据:my ...

  8. BZOJ 2431 HAOI2009 在列的数目的顺序相反 递归

    标题效果:乞讨1~n有都布置在物种的数目相反的顺序k计划数 订购f[i][j]对于前者i原子的反向排列的数j计划数 因此,我们将第一i插入的数1~i-1该装置 能生产0~i-1反向对 再就是 f[i] ...

  9. NEON简单介绍

    个128位四字寄存器Q0-Q15,32个64位双字寄存器D0-D31,两个寄存器是重叠的,在使用的时候须要特别注意,不小心就会被覆盖掉. NEON的数据类型:无符号整数.有符号整数.未指定类型的整数. ...

  10. MyEclipse—怎样在MyEclipse中创建servlet3.0

    servlet3.0随着Java EE6规范一起公布,那么怎样在MyEclipse中创建3.0版的servlet呢? 1.启动MyEclipse.获得下图: 2.点击上图"File" ...