Linux图形相关涉及到硬件、内核驱动、协议API、2D/3D渲染框架、GUI框架、桌面环境等,相当复杂,这里简单收集架构图作为记录。
1 硬件相关
显示相关的有:
- Displaying:显示器、投影等。包括Display engine、Timings controller、Display interface PHY。
- Rendering:3D rendering, 2D shape drawing, font rendering 等。
- Processing:Filtering, scaling, converting, compositing等。
Rendering/Processing相关硬件有:GPU、DSP、CPU(SIMD)。
媒体相关的有:
- Decoding/Encoding:压缩/解压缩图片,Picture codecs (JPEG, PNG, etc), Video codecs (H.264, VP8, etc)。
- Capturing/outputting:采集或者输出图像,例如 Cameras, DVB 等。
2 Linux Graphics stack
简单示意了应用/游戏、图形框架、图形加速引擎、内核驱动、硬件之间的关系:
相对于上图重点介绍了X和Wayland在实现上的差异:
参考《The Linux Graphics Stack | Clean Rinse (mecheye.net)》《Linux graphic stack · Nathan Gauër | Blog (studiopixl.com)》《深夜磨刀,Linux Graphics Stack 概述 | Linux 驱动 - 知乎 (zhihu.com)》《Linux Graphics Drivers: an Introduction (people.freedesktop.org)》。
3 内核空间
内核空间相关的图形框架包括:Framebuffer、DRM等。
3.1 Framebuffer Drivers
参考《Linux显示(一):Framebuffer子系统 - ArnoldLu - 博客园 (cnblogs.com)》。
3.2 DRM
参考《Linux图形显示系统之DRM》、《Linux显示(三):DRM子系统(以及LCDC/Panel/Backlight驱动) - ArnoldLu - 博客园 (cnblogs.com)》。
4 用户空间
4.1 libdrm
libdrm的作用就是将内核功能封装成 一系列的open/close/ioctl 等标准接口,应用程序调用这些接口来驱动设备实现画面显示,绝大部分可以分成两类行为:Graphics Execution Manager (GEM)、Kernel Mode-Setting (KMS),gem:显存管理,如显存的分配和释放,kms:显示模式管理,如分辨率等的设置。
参考《LIBDRM使用-CSDN博客》。
4.2 OpenGL
OpenGL是用于渲染2D、3D矢量图形的跨语言、跨平台API。其具有其他功能:建立3D模型、图形变换、颜色模式、光照和材质设置、纹理映射、图像增强功能和位图显示扩展功能、双缓存功能。
Vulkan的最大任务不是竞争DirectX,而是取代OpenGL,所以重点要看和后者的对比。在高分辨率、高画质、需要GPU发挥的时候,Vulkan、OpenGL的速度基本差不多,但是随着分辨率的降低,CPU越来越重要,Vulkan逐渐体现了出来。
OpenGL体系架构可以通过基于状态的pipeline表达,命令从左侧进入pipeline,输出到FrameBuffer。
4.2.1 OpenGL ES
OpenGL ES是OpenGL针对嵌入式系统版本。
4.3 Vulkan
Vulkan的设计理念与Direct3D 12和Metal基本类似,但Vulkan作为OpenGL的替代者,它设计之初就是为了跨平台实现的,可以同时在Windows、Linux和Android开发。甚至在Mac OS系统上,Khronos也提供了Vulkan的SDK,虽然这个SDK底层其实是使用MoltenVK实现的。
Vulkan和OpenGL主要区别如下:
其中Vulkan在部署时可以关闭Validation,效率更高:
参考《Vulkan简介-腾讯云开发者社区-腾讯云 (tencent.com)》。
4.4 Mesa
Mesa是OpenGL的一个实现,同时还包括很多硬件图形加速驱动。Mesa还实现了OpenGL ES、Vulkan、EGL、OpenCL、OpenMAX等协议。
Mesa内部分为Graphics API层和用户空间驱动层。Graphics API层实现各种协议的API接口;用户空间驱动层实现不同GPU驱动,对接DRM设备。
下面结合应用和libdrm说明里不同应用、图形API、Mesa类别、GPU驱动流程:
参考《Linux图形显示系统之Mesa》《Linux GPU系列-05-MESA架构 | 记录成长的痕迹 (joyxu.github.io)》。
4.4.1 Gallinum 3D
Gallium3D是一个给不同操作系统和不同图形API开发3D图形驱动的框架。
参考文档:《Linux图形显示系统之Gallium3D》《Gallium3D Architecture》。
4.5 cairo
cairo是一款开源2D矢量图形库,支持X-Windows、Win32、图像、pdf在内的各种输出设备。支持多种后端输出。
4.6 X
X即X Windows系统,是一种位图显示的视窗系统。
参考《The X New Developer’s Guide: X Window System Concepts》。
4.6.1 X11
X11是X Window System所使用的协议的版本11。
4.6.2 Xserver
4.6.2.1 DDX
Driver Dependent X是XServer中驱动无关部分。
4.6.2.2 DIX
Driver Independent X是XServer中驱动相关部分,
4.6.3 Xorg
Xorg是X11的服务器端参考实现。
4.6.4 Xclient
4.6.4.1 Xlib
Xlib是X11客户端参考设计,以及众多运行于X Window System上的工具。
4.6.4.2 XCB
是被视为Xlib的替代,实现了大多数X11协议。并且其API在Xlib之下,Xlib多建立于XCB之上。
4.6.5 XRrender
Xrender是X11特殊扩展,增加了anti-aliased drawing primitives (X11’s existing graphics were aliased), gradients, matrix transforms等支持。
4.7 pixman
pixman提供对像素操作API,供cairo和Xorg调用。
4.8 Wayland
Wayland只是一个协议(Protocol),就像X Window当前的协议——X11一样,它只定义了如何与内核通讯、如何与Client通讯,具体的策略,依然是交给开发者自己。
1. 内核收到了鼠标发出的信息,经过处理后转发到了Wayland Compositor,就像之前发往X Server一样。 2. Compositor收到消息后,立马能知道哪个窗口该收到这个消息,因为它就是总控制中心,它掌握窗口的层级关系、动画效果,因此它知道该坐标产生的鼠标点击信息应该发送给谁,就这样,Compositor将鼠标的点击信息发送给了Firefox。 3. Firefox收到了消息,这时如果是在X Window下的话,Firefox会向X Server请求绘制按钮被按下的效果。然而在Wayland里,Firefox可以自行进行绘制而不需要再请求Compositor的许可。这就是传说中的:直接渲染机制(Direct Render)。Wayland不管Client的绘制工作,整个过程变得十分简单而且高效。当Firefox自行完成了按钮状态的绘制后,它只需要通知Compositor,某块区域已经被更新了。 4. Compositor收到Firefox发来的信息后,再重新合成那块更新的区域,将最终桌面效果呈现给用户。这个过程主要是跟内核、显卡驱动打交道了。作为对比X流程如下:
参考《Wayland》《Wayland_百度百科》。
4.9 GNOME
GNOME是 Linux及各种主流Unix的GUI桌面系统。在 GNOME上面已经发展了许多自由应用软件,如文字处理软件Go、电子表格软件 Gnumeric、日历程序GNOMECAL、可与 Photoshop媲美的图形图像处理软件GIMP等。与KDE一样,GNOME项目为Linux 在桌面领域的发展及应用起到了至关重要的作用。
GNOME不像KDE那样有许多自己开发的工具,而是比较倾向于集成现有的X应用程序,可以允许用户选用任何种窗口管理程序(一般是 Windowmaker和 Enlightenment)。
4.10 KDE
KDE,即K桌面环境,全称K Desktop Environment。它是一种著名的运行于Linux、Unix以及BSD等类UNIX操作系统上的自由图形桌面环境,整个系统采用的都是TrollTech公司所开发的Qt程序库。 [17]KDE是Linux操作系统上流行的桌面环境之一。
4.11 QT
Qt [1]是一个1991年由Qt Company开发的跨平台C++图形用户界面应用程序开发框架。它既可以开发GUI程序,也可用于开发非GUI程序,比如控制台工具和服务器。Qt是面向对象的框架,使用特殊的代码生成扩展(称为元对象编译器(Meta Object Compiler, moc))以及一些宏,Qt很容易扩展,并且允许真正的组件编程。
Qt支持X和Wayland等。
标签:4.6,OpenGL,Graphics,Wayland,Linux,图形,Vulkan,Stack From: https://www.cnblogs.com/arnoldlu/p/18077391