linux图形栈
2021/9/22 7:10:01
本文主要是介绍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, 基本的图形·单元(点、线、面等等)、鼠标键盘等输入设备交互等等)直接看图
从图中可以看出,X主要是 X server和X clients组成,通过X protocol通信,x protocol是基于网络的,所以可以跨平台,
X设计之初就规定只提供GUI环境的基本框架,如定义 protocol、设备上绘制基本的图形单元(点 线 面等等)、和鼠标键盘等输入设备交互、等等。它并没有实现UI设计所需的button、menu、window title-bar styles等元素,而是由第三方的应用程序提供。即”提供机制,而非策略“。对用户接口不作要求,比如它提供了生成窗口(window)的方法,却对窗口呈现方式不作任何要求。
拿一个简单的应用场景举例。点击按钮引发按钮更新动作。
- 内核捕获鼠标点击事件并发送给 X server。
- X Server 会计算该把这一事件发送给哪个窗口(事实上,窗口位置是由 Compositor (合成器)控制的,X Server 并不能够正确的计算 Compositor 做过特效变化之后的按钮的正确位置)。
- 应用程序对此事件进行处理(将引发按钮更新动作)。但是,在此之前它得向X Server 发送绘制请求。
- X Server 接收到这条绘制请求,然后把它发给视频驱动来渲染。X 还计算了更新区域,并且这条“垃圾信息”发送给了 Compositor。
- 这时,Compositor 知道它必须要重新合成屏幕上的一块区域。当然,这还是要向X Server发送绘制请求的。
- 开始绘制。但是 X Server 还会去做一些不必要的本职工作(窗口重叠计算、窗口剪裁计算等)。
但是在上述情况下,一个应用不应该直接访问硬件,但对一些游戏等图形应用需要应用直接访问硬件就不行了,这时候就出现了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
这篇关于linux图形栈的文章就介绍到这儿,希望我们推荐的文章对大家有所帮助,也希望大家多多支持为之网!
- 2024-11-12如何创建可引导的 ESXi USB 安装介质 (macOS, Linux, Windows)
- 2024-11-08linux的 vi编辑器中搜索关键字有哪些常用的命令和技巧?-icode9专业技术文章分享
- 2024-11-08在 Linux 的 vi 或 vim 编辑器中什么命令可以直接跳到文件的结尾?-icode9专业技术文章分享
- 2024-10-22原生鸿蒙操作系统HarmonyOS NEXT(HarmonyOS 5)正式发布
- 2024-10-18操作系统入门教程:新手必看的基本操作指南
- 2024-10-18初学者必看:操作系统入门全攻略
- 2024-10-17操作系统入门教程:轻松掌握操作系统基础知识
- 2024-09-11Linux部署Scrapy学习:入门级指南
- 2024-09-11Linux部署Scrapy:入门级指南
- 2024-08-21【Linux】分区向左扩容的方法