摘要:在页面渲染过程中,Chromium需要创建多个3D上下文的实例,这些上下文实例彼此之间不但需要共享资源,还需要在同一个线程中执行GL操作,这就要求Chromium能够有效地处理多上下文的切换。然而,并不是所有的GPU设备都能够很好的支持多个3D上下文,虚拟化3D上下文(Context Virtualization)就是为了解决这个问题而引入的,核心思想是通过对3D上下文的虚拟化,使得多个上下文可以共享同一个真实的3D上下文,同时虚拟上下文的切换并不一定导致真实上下文的切换,从而减少真实上下文的个数,避免不必要的切换。本文介绍OpenGL上下文等基本概念,以及Chromium需要创建多个3D上下文的原因。
OpenGL上下文和渲染表面
OpenGL上下文是对OpenGL运行时渲染状态的抽象。OpenGL运行时的每个实例都可以看做是一台“状态机”,GL命令实际上是在操纵这台状态机,更新其内部的渲染状态。
每个GL命令只会作用于“当前”(current)上下文,而绑定当前上下文的工作则需要通过窗口系统的OpenGL扩展接口完成的,OpenGLAPI本身没有提供这样的接口。不同的窗口系统为支持OpenGL都会定义一套扩展接口标准,例如X11Windows系统的GLX标准,其首要目的就是要定义渲染上下文(RenderingContext),以及如何创建OpenGL上下文和绑定当前上下文。为了存储OpenGL的渲染结果,这些标准还定义了特定于窗口系统的渲染表面(DrawingSurface)。一般至少有两种类型的渲染表面可供使用:
- 屏上(onscreen)渲染表面,具有前后双缓冲区,前缓冲区用于显示,