DRM(Direct Rendering Manager)
DRM 由两个部分组成:一是 Kernel 的子系统,这个子系统对硬件 GPU 操作进行了一层框架封装。二是提供了一个 libdrm 库,里面封装了一系列 API,用来进行图像显示。
说到这里,其实这么理解最简单,你把你要画的东西交给DRM,DRM会把要画的东西交给GPU,然后显示。
那么DRM存在的必要性是什么呢?
DRM是Linux驱动(显卡驱动?)和显卡挨得比较近,再上层才是OpenGL,DRM是显卡驱动的一种架构。
OpenGL
OpenGL(英语:Open Graphics Library,译名:开放图形库或者“开放式图形库”)是用于渲染2D、3D矢量图形的跨语言、跨平台的应用程序编程接口(API)。这个接口由近350个不同的函数调用组成,用来从简单的图形比特绘制复杂的三维景象。而另一种程序接口系统是仅用于Microsoft Windows上的Direct3D。OpenGL常用于CAD、虚拟实境、科学可视化程序和电子游戏开发。
OpenGL的高效实现(利用了图形加速硬件)存在于Windows,部分UNIX平台和Mac OS。这些实现一般由显示设备(显卡)厂商提供,而且非常依赖于该厂商提供的硬件(因为显卡厂商会提供一些GPU提供的API,直接使用这样的API绘图被称为硬件加速)。
开放源代码库Mesa是一个纯基于软件的图形API(即不咋支持硬件加速,毕竟不收钱),它的代码兼容于OpenGL。但是,由于许可证的原因,它只声称是一个“非常相似”的API(或者说是开源版本的OpenGL)。
那么OpenGL可以干什么呢?简单地举个例子,你想画一条线,这个线有一些特征,什么颜色,都能由OpenGL提供的API设置,然后绘制出来,这些API可以完全通过软件实现,但是OpenGL为大部分或者全部都使用硬件加速设计的(都由GPU提供的API来绘制的话更快)。
上面提到的软件实现是指由OpenGL内部实现在内存中绘制,然后将内存交给GPU绘制。
和其同级的还有微软的DirectX,Vulkan
另外还有专为嵌入式实现的OpenGL ES版本
EGL
EGL是由Khronos Group提供的一组平台无关的API,它的主要功能如下:
- 和本地窗口系统(native windowing system)通讯;
- 查询可用的配置;
- 创建OpenGL ES可用的“绘图表面”(drawing surface);
- 同步不同类别的API之间的渲染,比如在OpenGL ES和OpenVG之间同步,或者在OpenGL和本地窗口的绘图命令之间;
- 管理“渲染资源”,比如纹理映射(rendering map)。
可以看出EGL和OpenGL是有关联的,EGL能给OpenGL的使用提供一些帮助。EGL是位于OpenGL和本地平台窗口系统(例如X11或者wayland)之间的一层接口。用于帮助OpenGL绘制的图形显示在窗口系统中。
GBM(Generic Buffer Management)
了解到GBM还是在Chromium的开源项目中,它和EGL功能类似,但是比EGL功能多一些。
gbm(通用缓冲区管理),它提供了一种为Mesa绑定的图形渲染分配缓冲区的机制。GBM旨在被当做一个本地平台为了工作在DRM上的EGL或者openwfd。它创建的句柄可用于初始化EGL和创建渲染目标缓冲区。
Mesa GBM是图形驱动程序特定缓冲区管理API(例如各种libdrm_ *库)的抽象,通过调用Mesa GPU驱动程序在内部实现。
例如,Wayland合成器 Weston使用OpenGL ES 2进行渲染,它通过调用EGL进行初始化。由于服务器在“裸KMS驱动程序 ”上运行,因此它使用EGL DRM平台,它可以真正称为GBM平台,因为它依赖于Mesa GBM接口。
在XDC2014,Nvidia员工Andy Ritger提议增强EGL以取代GBM。
这么理解会比较好,EGL对于OpenGL就相当于Mesa GBM对于Mesa。