linux图形栈

直接上图看关系 (这个图一定要熟记于心)
linux图形栈

从上图可以看出Linux图形栈主要分为3d和显示

部分名词解释

mesa是一个OpenGL的开源实现,前期是软件实现,后期加入硬件加速

libGL是openGL接口的实现,3D application(如这里的3D-game engine)可以直接调用libGL进行3D渲染。

libDRM和kernel DRM是DRI(Direct Render Infrastructure)的kernel实现,及其library。X-server或者Mesa 3D,可以通过DRI的接口,直接访问底层的图形设备(如GPU等)libdrm是drm下沟通驱动和用户层的库。

kms是一个用于控制显示设备属性的内核driver,如显示分辨率等。直接由X-server控制。

显示主要是就是X11和Wayland,其中,Wayland是近几年才发展起来的,首先介绍X11,它指提供GUI环境的基本框架(定义protocol, 基本的图形·单元(点、线、面等等)、鼠标键盘等输入设备交互等等)直接看图

linux图形栈

从图中可以看出,X主要是 X server和X clients组成,通过X protocol通信,x protocol是基于网络的,所以可以跨平台,

X设计之初就规定只提供GUI环境的基本框架,如定义 protocol、设备上绘制基本的图形单元(点 线 面等等)、和鼠标键盘等输入设备交互、等等。它并没有实现UI设计所需的button、menu、window title-bar styles等元素,而是由第三方的应用程序提供。即”提供机制,而非策略“。对用户接口不作要求,比如它提供了生成窗口(window)的方法,却对窗口呈现方式不作任何要求。

拿一个简单的应用场景举例。点击按钮引发按钮更新动作。

  1. 内核捕获鼠标点击事件并发送给 X server。
  2. X Server 会计算该把这一事件发送给哪个窗口(事实上,窗口位置是由 Compositor (合成器)控制的,X Server 并不能够正确的计算 Compositor 做过特效变化之后的按钮的正确位置)。
  3. 应用程序对此事件进行处理(将引发按钮更新动作)。但是,在此之前它得向X Server 发送绘制请求。
  4. X Server 接收到这条绘制请求,然后把它发给视频驱动来渲染。X 还计算了更新区域,并且这条“垃圾信息”发送给了 Compositor。
  5. 这时,Compositor 知道它必须要重新合成屏幕上的一块区域。当然,这还是要向X Server发送绘制请求的。
  6. 开始绘制。但是 X Server 还会去做一些不必要的本职工作(窗口重叠计算、窗口剪裁计算等)。

但是在上述情况下,一个应用不应该直接访问硬件,但对一些游戏等图形应用需要应用直接访问硬件就不行了,这时候就出现了DRI。

首先必须明确DRI是一个软件架构,包含一系列软件模块,诸如DRM(后面会详细提到)和KMS,是用来协调linux kernel,X windows系统,3D图形硬件以及OpenGL渲染引擎之间的工作。其目的是使应用程序和显示硬件之间传输更高效,从而更高效。其参考下图
linux图形栈

其显示流程如下:
1)Application(如3D game)根据用户动作,需要重绘界面,此时它会通过OpenGL|ES、EGL等接口,将一系列的绘图请求,提交给GPU。

a)OpenGL|ES、EGL的实现,可以有多种形式,这里以Mesa 3D为例,所有的3D rendering请求,都会经过该软件库,它会根据实际情况,通过硬件或者软件的方式,响应Application的rendering请求。

b)当系统存在基于DRI的硬件rendering机制时,Mesa 3D会通过libGL-meas-DRI,调用DRI提供的rendering功能。

c)libGL-meas-DRI会调用libdrm,libdrm会通过ioctl调用kernel态的DRI驱动,这里称作DRM(Direct Rendering Module)。

d)kernel的DRM模块,最终通过GPU完成rendering动作

2)GPU绘制完成后,将rendering的结果返回给Application。

rendering的结果是以image buffer的形式返回给应用程序。

3)Application将这些绘制完成的图像buffer(可能不知一个)送给Wayland compositor,Wayland compositor会控制硬件,将buffer显示到屏幕上。

参考文章
蜂窝科技
惺忪牛犊子
https://blog.csdn.net/eydwyz/article/details/105800101

上一篇:学术写作


下一篇:Chapter 2 - Sockets and Patterns【选译,哈哈】 Part 5 Handling Interrupt Signals