Linux图形栈概述
图形渲染相关概念
直接渲染架构DRI
DRI(Direct Rendering Infrastructure):是现代Linux上的图形栈架构,允许用户态程序直接向图形硬件发出命令,主要用途是为OpenGL的Mesa提供硬件加速。
零拷贝
零拷贝(Zero-Copy)是指CPU不需要将文件拷贝多次就能实现文件的转移、发送等。
双缓冲
使用双缓冲技术来解决新旧图像刷新在屏幕导致的卡顿、撕裂问题:
- 前缓冲区(front buffer):就是显存,就是on-screen buffer
- 后缓冲区(back buffer):就是内存中的某个地方,就是off-screen buffer
双缓冲就是先将所有绘图操作结果存储在后缓冲区,然后将后缓冲区一次性复制到前缓冲区,图形硬件就显示前缓冲区的内容。这样就能最大限度地减少画面撕裂。
还出现了多重缓冲
翻页(pageflip)
准备两个前缓冲区,并且这两个前缓冲区都能用于显示图形。当其中一个前缓冲区在显示时,另一个就在绘制,等到绘制完成,就交换两个前缓冲区的角色,图形硬件显示另一个前缓冲区的内容。
直接渲染管理器DRM
帧缓冲区fbdev:是Linux内核的一个子系统,可以理解为显存上的一段内存,用于存储显卡处理过或即将处理的渲染数据,然后送至显示器刷新,从而显示图形。现逐渐被DRM子系统取代。
DRM(Direct Rendering Manager):是Linux 内核的一个子系统,提供了比fbdev更高级的功能,是现代显卡的GPU接口。DRM 公开了一个API,libdrm,用户空间程序可以使用该 API 将命令和数据发送到 GPU 并执行配置显示器模式设置等操作。
DRM会独占GPU的访问权限,使用GPU的程序都得向DRM发送请求,DRM充当仲裁管理从而避免冲突问题,从而控制多个程序使用显示设备;还会管理进程间共享内存等等。
与 Framebuffer 不同的是,DRM 不直接将像素数据写入帧缓冲,而是将渲染指令发送给图形硬件,由硬件完成像素渲染和输出。
详细参考这篇博客:DRM(Direct Rendering Manager)学习简介-CSDN博客
图形执行管理器GEM
GEM(Graphics Execution Manager)是用于图形内存管理的API,实现用户态程序可以创建、处理、销毁存在与GPU显存中的内存对象(GEM object),或者叫做句柄,以及与CPU中内存内容的同步。这样做的原因是减少在用户态和内核态之间频繁的切换。显然GEM是特定与驱动程序的。
内核模式设置KMS
- 模式设置:显卡要设置一种模式(分辨率、色深、刷新率等的组合)才能正常工作,这个设置的过程叫模式设置Mode-setting。在开始使用framebuffer之前,以及当应用程序或用户需要更改模式时,都要执行模式设置操作。
- 用户模式设置vs内核模式设置:传统上模式设置是在用户空间下完成,但KMS允许这一过程在内核空间中完成,提供了更快更稳定的切换。
- KMS:现在Linux中的模式设置代码在内核中作为一个子系统,向外提供API。
KMS设备模型
KMS 将输出设备作为显示控制器的显示输出管道上常见的一系列硬件进行抽象并管理。
KMS抽象出来的硬件:
- DRM Framebuffer:帧缓冲区,绘制前需要格式化
- 阴极射线管控制器(CRTC, Cathode Ray Tube Controller):CRT是阴极射线管,C代表控制器。CRTC会读取帧缓冲区(frame buffer)中的数据然后让阴极射线管显示,叠加planes上的信息,传给编码器。可用的CRTC的数量决定了硬件可以同时处理多少个独立的输出设备。
- 平面(plane):一个 plane 代表一个图层(image layer),最终合成的 image 由多个 plane 组成。拥有 frame buffer 的 plane 称为主平面(primary plane),每个CRTC必须关联一个 plane,CRTC根据plane来确定视频模式(分辨率、色深、像素格式等)。
- 编码器(Encoder):编码器将内存中的 pixel 像素编码转换为显示器所需要的信号,以适配不同的协议,比如VGA、Mipi等。Encoder 与 CRTC 之间的交互就是 Mode-setting
- 连接器(connector):就是显示屏硬件与电脑的连接口,比如VGA口、HDMI口
EGL与OpenGL
- OpenGLES 与 EGL 基础概念 - 知乎 (zhihu.com)
- Wayland窗管和DPM.pptx
- opengl.pptx
- 猴子也能看懂的渲染管线(Render Pipeline) - 知乎 (zhihu.com)
两者关系:OpenGL操作GPU,而GPU显然是硬件,因此是平台相关的;但是OpenGL还需要与本地机器上的Window System交互,因此还需要一个中间层EGL来实现跨平台。
OpenGL
一个跨语言跨平台的GPU功能的API规范,规定了绘制2D和3D图形的API。其实现叫做“驱动”,由硬件厂商提供。
OpenGL用于桌面系统,OpenGL ES或GLES用于嵌入式系统,OpenVG用于2D矢量图形渲染器。
EGL
嵌入式系统图形库(Embedded-System Graphics Library),是提供给OpenGL等渲染API与X等底层Window System之间的接口,由操作系统实现。应用程序员并不直接编写 EGL,而是应该使用 API 之一,例如 OpenGL。
OpenGL术语
模型:模型是用数据结构定义的对于三维物体的描述,至于二维物体需要从三维坐标转换为二维坐标。包含几何、视点、纹理以及照明信息。
渲染:计算机程序将2D或3D模型生成图像的过程,即窗口生成图形内容的过程
合成:多个窗口合成为一帧图像的过程(一般是将各个应用的窗口按照z-order排布,然后“压”成一张图片)。因为屏幕只能显示一帧图像
送显:像素数据被送至显卡驱动显示在屏幕上(屏幕显示图片就是按照像素RGB发出对应的光)
着色器(Shader):用于在GPU上执行的小程序,使用GLSL语言编写。用于通过着色器来实现可编程流水线,来控制GPU渲染管线。
渲染管线(Render Pipeline)
OpenGL中,任何事物都在3D空间中,而屏幕和窗口却是2D像素数组,这导致OpenGL的大部分工作都是关于把3D坐标转变为适应屏幕的2D像素。3D坐标转为2D坐标的处理过程是由OpenGL的图形渲染管线管理的。
渲染管线是将数据从3D场景转换成2D图像,最终在屏幕上显示出来的过程。它分为三个阶段:应用阶段、几何阶段和光栅阶段。
GBM 与 Mesa
GBM
通用缓冲区管理(Generic Buffer Management)与EGL类似,但是强大一些,提供与 Mesa 绑定的一种图形渲染分配缓冲区的机制。
Mesa
Mesa也称为Mesa3D和Mesa 3D 图形库,是OpenGL、Vulkan和其他图形API规范的开源实现。Mesa 将这些开源规范转换为特定于供应商的图形硬件驱动程序,因此不同平台要用对应的Mesa。
后端(backend)
在图形系统(如X11和Wayland)中,后端(backend)通常指的是底层系统或硬件层面的实现。这是与应用程序接口(API)和图形库等用户空间概念相对应的概念。
因此,实际上所谓的后端这个概念不仅仅局限于图形渲染的底层系统这种,其他功能和领域中的实现底层系统的结构都可以称之为后端。
桌面系统架构
以deepin生态为例
具体每个组件的内容参考:桌面架构.pptx
显示管理器DM
显示管理器(DM, Display Manager):是登录界面输入提示密码的界面。用于管理不同的显示服务器和用户会话。
显示服务器DS
显示服务器(DS, Display Server):提供图形环境的框架,初始化显示资源,并提供绘图的API。这样用户就可以使用输入设备和应用程序进行交互,让应用程序通过窗口协议来和DS通信。
桌面环境DE
桌面环境(DE, Desktop Environment)是结合DM、DS、应用程序结合形成的一套软件。提供通用图形用户界面元素,如图标、工具栏、壁纸,桌面小部件。 大多数桌面环境包括提供一套整合的应用程序和实用工具。 最重要的是,桌面环境提供他们自己的窗口管理器(window manager)
标签:OpenGL,渲染,API,概述,Linux,缓冲区,GPU,图形 From: https://www.cnblogs.com/3to4/p/17989144