linux开发7-图形栈
DRI
DRI是一个安全且有效率的直接对显示硬件存取的方法。它包含对X server,一些client函数库、以及对内核的变更。Direct Rendering Infrastructure 可翻译为:直接着色基础结构(基层直接渲染)。
DRI中支持下面这三种格式图像:
- RGB:R/G/B分别存于不同的图层中;
- YUV:不同压缩格式下的YUV存储方式不一;
- C8:通过存储一块映射到RGB的映射表来实现图像信息存储;
DRM
DRM( Direct Rendering Manager)即直接渲染管理器。它是为了解决多个程序对 Video Card 资源的协同使用问题而产生的。它向用户空间提供了一组 API,用以访问操纵 GPU。
简单理解,DRM是Linux下的图形渲染架构,用来管理显示输出和分配buffer。应用程序可以直接操纵 DRM的 ioctl 或者是用 framebuffer 提供的接口进行显示相关操作。后来封装成了 libdrm 库,让用户可以更加方便的进行显示控制。
DRM子系统实现有内核态drm驱动和用户态libdrm库两级,drm驱动对外暴露open、close、ioctl等标准驱动接口,libdrm对drm驱动的进一步封装,向上暴露DRM Api
Linux DRM 子系统,主要提供了以下功能:
- 操作 Frame Buffer / Plane 接口
- Buffer 管理
- 模式设定(分辨率、色深、刷新率等)
Linux DRM 中的概念:Frame Buffer,Plane,CRTC,Encoder 以及 Connector
1. DRM Framebuffer
它是一块内存区域,可以理解为一块画布,驱动和应用层都能访问它。绘制前需要将它格式化,设定绘制的色彩模式(例如RGB24,YUV 等)和画布的大小(分辨率)。
2. CRTC
阴极摄像管上下文。这个看名字很很难懂,但简单的来说他就是显示输出的上下文,可以理解为扫描仪。CRTC对内连接 Framebuffer 地址,对外连接 Encoder,会扫描 Framebuffer 上的内容,叠加上 Planes 的内容,最后传给Encoder。
3. Planes
平面。它和 Framebuffer 一样是内存地址。它的作用是干什么呢?打个比方,在电脑上,一边打字聊微信一边看电影,这里对立出来两个概念,打字是文字交互,是小范围更新的 Graphics 模式;看电影是全幅高速更新的 Video 模式,这两种模式将显卡的使用拉上了两个极端。
这时Planes就发挥了很好的作用,它给 Video 刷新提供了高速通道,使 Video 单独为一个图层,可以叠加在 Graphic 上或之下,并具有缩放等功能。
Planes 是可以有多个的,相当于图层叠加,因此扫描仪(CRTC)扫描的图像实际上往往是 Framebuffer 和 Planes 的组合(Blending)。
4. Encoder
编码器。它的作用就是将内存的 pixel 像素编码(转换)为显示器所需要的信号。简单理解就是,如果需要将画面显示到不同的设备(Display Device)上,需要将画面转化为不同的电信号,例如 DVID、VGA、YPbPr、CVBS、Mipi、eDP 等。
Encoder 和 CRTC 之间的交互就是我们所说的 ModeSetting,其中包含了前面提到的色彩模式、还有时序(Timing)等。
5. Connector
连接器。它常常对应于物理连接器 (例如 VGA, DVI, FPD-Link, HDMI, DisplayPort, S-Video等) ,它不是指物理线,在 DRM中,Connector 是一个抽象的数据结构,代表连接的显示设备,从Connector中可以得到当前物理连接的输出设备相关的信息 ,例如,连接状态,EDID数据,DPMS状态、支持的视频模式等。
KMS
kernel Mode Setting 内核模式设置
wayland
Wayland是一个简单的“显示服务器”(Display Server),与X Window属于同一级的事物,而不是仅仅作为X Window下X Server的替代(注:X Window下分X Server和X Client)。也就是说,Wayland不仅仅是要完全取代X Window,而且它将颠覆Linux桌面上X Client/X Server的概念,以后将没有所谓的“X Client”了,而是“Wayland Client”。
X Window(X11)
X Window即X Window图形用户接口,是一种计算机软件系统和网络协议,提供了一个基础的图形用户界面(GUI)和丰富的输入设备能力联网计算机。其中软件编写使用广义的命令集,它创建了一个硬件抽象层,允许设备独立性和重用方案的任何计算机上实现。
X11是X window第11版。
- xServer:接收client(应用程序)的请求绘制窗口.并将来自鼠标、键盘等设备的输入传递绘xClient,它位之间采用X协议进行通信。
- xClient:应用程序,与xServer进行交互通信。
wayland与x11渲染结构:
GEM
Graphics Execution Manager 图形管理器
- 对图像内存(显存)的空间开辟、释放;
- 不同硬件对同一显存资源访问下的管理;
Mesa
mesa是OpenGL、OpenGL ES、Vulkan、OpenCL的一个开源实现(Open source implementations of OpenGL, OpenGL ES, Vulkan, OpenCL, and more),mesa是基于linux内核的OS上所使用的OpenGL的标准实现。
libGL
其就是Mesa编译出来的库.
- 向client app提供兼容OpenGL的API。
- 实现GLX API。
- 在系统中寻找合适的图形驱动。
- 向图形驱动分发OpenGL的调用。
GLX
mesa实现的接口
GLX是OpenGL Extension to the X Window System的缩写。它作为x的扩展,是x协议和X server的一部分,已经包含在X server的代码中了。GLX提供了x window system使用的OpenGL接口,允许通过x调用OpenGL库。OpenGL 在使用时,需要与一个实际的窗口系统关联起来。在不同平台上有不同的机制以关联窗口系统,在Windows上是WGL,在Linux上是GLX,在Apple OS上是AGL等。
AIGLX
简接加速GLX
EGL
也是mesa实现的接口生成libGLES库。
是openGL ES渲染API和原生窗口系统之间的接口,主要用在移动和嵌入式平台。
2023年1月 alvin整理。
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】凌霞软件回馈社区,博客园 & 1Panel & Halo 联合会员上线
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】博客园社区专享云产品让利特惠,阿里云新客6.5折上折
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 在鹅厂做java开发是什么体验
· 百万级群聊的设计实践
· WPF到Web的无缝过渡:英雄联盟客户端的OpenSilver迁移实战
· 永远不要相信用户的输入:从 SQL 注入攻防看输入验证的重要性
· 浏览器原生「磁吸」效果!Anchor Positioning 锚点定位神器解析