直接上图看关系 (这个图一定要熟记于心)
从上图可以看出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, 基本的图形·单元(点、线、面等等)、鼠标键盘等输入设备交互等等)直接看图
从图中可以看出,X主要是 X server和X clients组成,通过X protocol通信,x protocol是基于网络的,所以可以跨平台,
X设计之初就规定只提供GUI环境的基本框架,如定义 protocol、设备上绘制基本的图形单元(点 线 面等等)、和鼠标键盘等输入设备交互、等等。它并没有实现UI设计所需的button、menu、window title-bar styles等元素,而是由第三方的应用程序提供。即”提供机制,而非策略“。对用户接口不作要求,比如它提供了生成窗口(window)的方法,却对窗口呈现方式不作任何要求。
拿一个简单的应用场景举例。点击按钮引发按钮更新动作。
但是在上述情况下,一个应用不应该直接访问硬件,但对一些游戏等图形应用需要应用直接访问硬件就不行了,这时候就出现了DRI。
首先必须明确DRI是一个软件架构,包含一系列软件模块,诸如DRM(后面会详细提到)和KMS,是用来协调linux kernel,X windows系统,3D图形硬件以及OpenGL渲染引擎之间的工作。其目的是使应用程序和显示硬件之间传输更高效,从而更高效。其参考下图
其显示流程如下:
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