Linux显示系统框架DRI(Direct Rendering Infrastructure),它涉及一些不同层次的专有名词如下:
{BANNED}最佳底层,在GPU内部:
-
Framebuffer:一种底层的显示缓存,具体细分为如颜色缓存、深度缓存等多种,在这些缓存的共同作用下,{BANNED}最佳终形成在屏幕上显示的图像;
Linux内核层:
-
DRM(Direct Rendering Manager):主要负责负责数据流,即通过软件或硬件加速,生成{BANNED}最佳终目标图像,存储在Framebuffer中。
-
KMS(Kernel Mode Setting):主要负责控制流,根据显示器类型以及显示模式设置,将生成的Framebuffer数据信息送到显示端口上(VGA、HDMI等)。
-
Libdrm库:Kernel将这DRM/KMS抽象出来,封装成libdrm库供上层的Display Server使用。
中间件层:
-
OpenGL:简单理解为它是一个操作图形、图像的API规范;
-
OpenGL ES:是OpenGL的嵌入式版本,适用于在低功耗显示设备渲染高效的2D、3D 图形,当然需要GPU的驱动支持;
-
Vulkan:是另一种2D、3D操作图形、图像的API规范;
-
Mesa:是一种开源的OpenGL的库实现,OpenGL是接口规范,Mesa是具体实现;
{BANNED}最佳上层,应用程序及框架:
Display Server:一个普通的应用程序 client 通常不会直接与 KMS 进行交互,而是先和 display server(例如 X11 的 Xorg、Wayland等)进行交互, display server 负责将多个 client 的图像合成成一张图像,并将这张图像通过 Libdrm 的接口提交给内核。树莓派GPU的软硬件资源
这部分名词很很多,先粗略介绍一遍。
一些GPU可以用于加速的内容:
-
绘制 2D 图形(如GPU填充)
-
绘制 3D 场景(如多边形、纹理和变换)
-
视频压缩/解压缩(如H.264等)
-
视频编辑和过滤(如相机镜头校正、虚拟背景等)
-
合成(叠加和混合图层)
-
非视频的东西,比如神经网络
树莓派GPU相关硬件部分:
-
运行 Linux 和通用代码的 ARM CPU
-
Broadcom的VideoCore GPU,具体包括:
-
- VPU,GPU内部的一个通用处理器,用于运行GPU专用的操作系统固件
-
- 压缩/解压缩器
-
- 视频捕捉助手
-
- 3D渲染的QPU着色器单元
-
- 执行输出时间缩放和合成的硬件视频缩放器 (HVS, Hardware Video Scaler)
-
- 将HVS输出转换为视频信号的编码器
树莓派GPU相关软件部分:
-
VideoCore 固件是在 VPU 上运行的专有代码,总体管理 GPU,并包括对 OpenGL 和视频压缩/解压缩的一些支持
-
VideoCore API:
-
- EGL,用于OpenGL的标准 C API,Pi 有两种实现:① Broadcom libbrcmEGL ② Mesa libEGL
-
- DispmanX,用于控制帧缓冲区分层和合成
-
- MMAL,用于多媒体抽象层
-
- OpenMAX (OMX),用于一种用于音频/视频的标准
-
- OpenVG,用于 2D 图形的标准
Linux 内核及子系统:
-
直接渲染管理器 (DRM) 提供对视频硬件的访问
-
- “vc4”DRM 驱动程序为 VideoCore IV 和 VI执行2D处理,并为 VideoCore IV 执行 3D
-
- “v3d”DRM 驱动程序为 VideoCore VI (RPi 4专用) 进行 3D 处理
-
内核模式设置 (KMS) 是 DRM 的一部分,管理视频模式和输出时间合成
-
Video4Linux 2 (V4L2) 管理视频捕获以及硬件视频压缩/解压缩
-
DMA-buf 在子系统之间共享内存,例如。V4L2 和 DRM 之间
Linux 用户框架、应用层和工具
-
X windows 及其整个生态系统,包括:
-
- 直接渲染基础设施 (DRI),允许客户端共享硬件以进行直接渲染(使用 DRM、OpenGL 等)
-
- GL X 扩展 (GLX),允许客户端发送 GL 命令(间接渲染)或直接访问硬件(直接渲染)
-
Mesa,一种 OpenGL 实现
-
- “vc4”Mesa 驱动程序使用 vc4 DRM 驱动程序来支持 VideoCore IV (RPi <= 3) 上的 OpenGL 2.1
-
- “v3d”Mesa 驱动程序使用 v3d DRM 驱动程序(以及用于模式设置的 vc4)来支持 VideoCore VI (RPi 4) 上的 OpenGL 2.1 和 OpenGL ES 3.1
-
FFmpeg,一组用于音频/视频处理的工具和软件库
-
GStreamer,使用硬件和软件构建块的音频/视频管道系统
-
VLC(和 libvlc),一种流行的视频播放器
树莓派GPU的配置方式
在了解了树莓派GPU的软硬件资源之后,来看一下要让上述资源协同工作,有哪几种配置方式?及有什么优缺点。
Legacy non-GL
-
此模式支持但已弃用。
-
在此模式下,DRM 和 KMS 不可用。
-
V4L2内部使用MMAL提供硬件视频压缩/解压缩。
-
DispmanX、MMAL 和 OMX 均可用。
-
X服务器使用DispmanX切换模式,并直接渲染到帧缓冲区(framebuffer),没有硬件加速。
-
内核可以制作简单非加速的帧缓冲区(framebuffer)和渲染控制台文本之外。
GL with "Fake/Firmeware KMS" (FKMS)
-
这是一种折中的传统模式,在树莓派 OS Buster 上是默认配置模式。
-
在此模式下,DRM 和 KMS 可用,但使用 DispmanX 进行模式设置和帧缓冲区管理(framebuffer),因此是“假”。
-
V4L2 如上包装 MMAL。
-
OpenGL 可通过“vc4”和“v3d”Mesa 驱动程序使用,这些驱动程序通过 DRM 使用 VideoCore 资源,无需专有 VPU 固件。
-
DispmanX、MMAL 和 OMX 均可用。
-
X服务器呈现为 DRM 并使用 KMS 来切换模式。
GL with Full KMS
-
这是 在树莓派 OS Bullseye 的推荐设置和默认设置。
-
在此模式下,DRM 和 KMS 直接管理 GPU,无需依赖专有的 VideoCore VPU 固件。
-
V4L2仍然如上包装MMAL。
-
OpenGL 可通过上述“VC4”和“V3D”Mesa 驱动程序使用。
-
DispmanX 和 OMX 不可用,因为内核已接管 GPU。omxplayer 等程序无法运行。MMAL 仍然可用。VLC使用MMAL进行硬件解压。
-
X服务器呈现为 DRM 并使用 KMS 来切换模式。
总结与配置建议
总结:
-
Fake KMS:允许VPU固件控制 DRM/KMS 渲染管道,如果想使用常规的OpenGL(其版本仅限于 2.1),FKMS 是必需的。如桌面软件(X服务器)倾向于使用 OpenGL 进行合成和像素推送,但在性能或功耗方面并不理想。
-
Full KMS:使用 Linux 内核来控制 DRM/KMS 管道,与常规的OpenGL不兼容,但使用GLES,并且可以运行更多功能。树莓派的VideoCore VI GPU 驱动可以执行 OpenGL ES 3.2,但不能执行 OpenGL 3.0。
推荐:选择“Full KMS”
-
对于开发,目标是通用 API(OpenGL、X11、DRI/DRM/KMS、V4L2)或使用它们的库(gstreamer、ffmpeg)。在完整的 KMS 下运行,这是{BANNED}最佳面向未来的开源接口。
-
对于 3D,请使用 OpenGL 并首选 Mesa 的 vc4/v3d 驱动程序(而不是 Broadcom EGL 层)。
-
对于桌面视频播放,更喜欢 VLC而不是 omxplayer 或其他播放器。
选择方式:在/boot/config.txt中dtoverlay=vc4-kms-v3d