摘要:Chromium中GPU进程架构允许多个GPU客户端会同时访问GPU服务,而GPU客户端之间可能存在数据依赖关系,因此必须提供一种同步机制保证GPU操作的先后次序。本文讨论多进程架构下GPU客户端之间的同步问题,以及同步点(SyncPoint)机制的基本原理。
GPU进程架构等基本概念
我们知道,Chromium是一个多进程架构的软件系统。出于安全和稳定性方面的考虑,Chromium有个专门的进程(或者线程)和GPU设备进行交互,执行GL操作,也就是说,任何一条GL命令都必须经由这个进程处理后才提交给GPU驱动,这个进程就是GPU进程。Renderer进程或者Browser进程必须通过IPC才能与GPU进程交互,告诉GPU进程需要执行哪些GL命令。在这个过程中,Renderer进程或Browser进程是GPU客户端,而GPU进程本身就是GPU服务端。
GPU客户端和服务端之间GL命令传输是通过命令缓冲区(CommandBuffer)完成的。CommandBuffer是Chromium为解决多进程架构下高效在客户端和服务端传输GL命令而设计的,缓冲区使用共享内存存储GL命令,每条GL命令的命令名和参数都会被序列化为字符串存储在命令行缓冲区中。当客户端需要将命令缓冲区中的所有GL命令提交给GPU服务端时,客户端会向服务端发送一条GpuCommandBufferMsg_AsyncFlush消息,服务端收到这条消息后会根据指定的偏移从CommandBuffer中读取GL命令并将其反序列化后再提交给GPU驱动。
Chromium中,页面的渲染和合成过程都启用了GPU硬件加速,任何一个要求GPU硬件加速的进程都是GPU进程的客户端,例如Renderer进程是GPU客户