刚开始学习,记忆不是很好,容易忘,边学边记,阅读的速度会比较慢,看的会比较仔细。

这边主要参考以下博客,前辈们水平很高,写的很详细,详细的知识学习可查看以下链接。
详细请看:
  蜗窝科技http://www.wowotech.net/graphic_subsystem/graphic_subsystem_overview.html
  何小龙CSDNhttps://blog.csdn.net/hexiaolong2009/article/details/83720940
  Younix脏羊CSDNhttps://blog.csdn.net/dearsq/article/details/78312052
  imtx.me:https://imtx.me/blog/introduce-wayland-2/


概念

  DRM(Direct Rendering Manager)即直接渲染管理器,属于图形子系统(graphic subsystem)之一。故先来了解一下什么是图形子系统?
  图形子系统是Linux系统中较复杂子系统之一。对下,要管理形态、性能各异的显示相关器件。对上,需向应用程序提供易用、友好、强大的图形界面(GUI,Graphical User Interface)。
  又由于硬件设备众多,为方便应用开发,需一个稳定跨平台的API来定义渲染有关的行为和动作,而OpenGL(Open Graphics Library)就是这类API的一种。对上,屏蔽硬件细节,为应用程序提供相对稳定的、平台无关的3D图像处理API(当然,也可以是2D)。对下,指引硬件相关的驱动软件,实现3D图像处理相关的功能。
  作为一名初学者,其实我对渲染这个词一直不太清楚,所以搜索了一下(可看知乎-渲染),简单理解就是绘制,最终结果就是形成图片(将内存中的图像数据形成图片)
  硬件加速(Hardware acceleration):通过特定功能硬件模块处理CPU不擅长的事务,对应的硬件模块称做硬件加速模块。如:计算机中2D渲染一般由CPU完成(也可由专门硬件),但一般3D渲染由显卡(由GPU、显存、电路板,BIOS固件组成)负责。
  再了解一下窗口系统(Windowing system),是GUI的一种(当前计算机设备、智能设备广泛使用的一种),以WIMP (windows、icons、menus、pointer) 的形式,提供人机交互接口。Linux系统中有很多窗口系统的实现,如X Window System、Wayland、Android SurfaceFlinger等,虽形态各异,但思路大致相同。


X Windows System

  从上知 X Window System(常称X11)就是窗口系统的一种实现,只提供实现GUI环境的基本框架(_定义protocol、基本的图形单元(点、线、面等等)、鼠标键盘等输入设备交互等等_),而其他由第三方应用提供(即扩展),主要包括:
    窗口管理器(window manager):控制应用程序窗口(application windows)的布局和外观,使每个应用程序窗口尽量以统一、一致的方式呈现给用户,如最简单的窗口管理程序–twm(Tab Window Manager)
    GUI工具集(GUI widget toolkit):Windowing system之上的进一步的封装,封装出一些更为便利的GUI接口,方便应用程序使用,如Microwindows、GTK+、QT等等
    桌面环境(desktop environment):应用程序级别的封装,通过提供一系列界面一致、操作方式一致的应用程序,使系统以更为友好的方式向用户提供服务。如:GNOME、KDE等等。
  具体扩展实例:
     - 要多头显示支持,这个是由”Xinerama”扩展实现的;
     - 要有多媒体视频回放的支持,这个是由”X Video”扩展实现的;
     - OpenGL的3D支持,则是通过”GL”扩展来实现的;
     - Compiz那样的合成桌面特效是怎么弄的?没错,还需要一个新的扩展,它便是:“Composite”;
     - 甚至Keyboard的支持,都是通过”X Keyboard Extension”(也就是”XKB”)的!
  使用 client-server架构,感觉有点像网络里面的请求者(客户端)-响应者(服务器),它们之间通过一定的通信协议进行交互client:发送绘图请求,server:响应并处理请求(_管理所有输入设备,以及用于输出的显示设备_)。如:应用程序作为client,去请求server后,server会响应将在应用程序的窗口上绘制自己的GUI。(不清楚理解的对不对)
  来看下X Window系统的架构图:



     - X Client:图形应用程序,如Firefox、Pidgin等;
     - X Server:你看不见的控制中心;
     - Compositor:合成桌面系统,如Compiz;
     - Kernel/KMS/evdev:这便是Linux Kernel,后面会提到KMS技术了,其中还有一项evdev,是管理输入设备的。
  若想从具体的应用场景了解,可点击链接查看原文imtx.me里面有用浏览器进行详细的描述,而这个过程可描述为:X Client <-> X Server <-> Compositor这三者请求渲染的过程,不是很高效。


Linux系统中图形有关的软件层次


  经过以上概念的阐述可得到Linux系统中图形有关的软件层次(图形子系统),具体如下:


_以上内容来自蜗窝科技—Linux graphic subsystemimtx.me—揭开Wayland的面纱(一):Wayland应运而生详细讲解可点击链接_
  精简的基本框架,与时俱进只需通过扩展对新技术的支持方便维护,这样的设计非常好,但是C/S的网络构架却备受质疑。


Wayland

  A Simple Display Server(一个简单的”显示服务器”),以 Compositor/Client 的结构取而代之,还是直接看原文:imtx.me—揭开Wayland的面纱(二):Wayland应运而生


DRI

  DRI(Direct Render Infrastructure)框架:主要包含两个方面:
    一、DRM(Direct Rendering Manager)(在kernel中实现,负责管理显卡和相应的图形存储器[graphics memory]):主要功能有二:
      ①统一管理、调度多个应用程序向显卡发送的命令请求,可以类比为管理CPU资源的进程管理(process management)模块。
      ②统一管理显示有关的memory(memory可以是GPU专用的,也可以是system ram划给GPU的,后一种方法在嵌入式系统比较常用),该功能由GEM(Graphics Execution Manager)模块实现
    二、KMS(Kernel Mode Setting):它要实现的功能较简单,即:显示模式(display mode)的设置,包括屏幕分辨率(resolution)、颜色深的(color depth)、屏幕刷新率(refresh rate)等等。


  应用程序想将自身UI界面呈现给用户,需两步骤
    ①将UI绘制出来并以一定格式保存在buffer中。(这过程就是常说的“Rendering”)。
    ②将buffer中的UI数据显示在显示设备上。(这过程一般称作“送显”)。
  而操作系统中,应用程序不应该直接访问硬件,通常是:Application<——>Service<——>Driver<——>Hardware。(原因有二:安全性和共享硬件资源,但走的路太多了就显得有些低效)但X server+3D出现后(前面已介绍过,管理所有输入设备,以及用于输出的显示设备),框架变成:



  但对于需要高性能的图形设备来说,应用程序直接访问硬件才能实现性能最优,故就给出了一个能直接访问硬件(DRI)的框架:



  上面好像讲的都是Rendering有关的内容,那送显呢?还是由display server统一处理比较好,因为显示设备是有限的,多个应用程序的多个界面都要争取这有限的资源,server会统一管理、叠加并显示到屏幕上。而这里叠加的过程,通常称作合成(Compositor)。
_以上内容来自蜗窝科技—Linux graphic subsystem2详细讲解可点击链接_


DRM

  Linux目前主流的图形显示框架,相比FB架构,DRM更能适应当前日益更新的显示硬件.从模块上划分可分为三部分(libdrm、KMS、GEM):
    一、libdrm:对底层接口进行封装,向上层提供通用的API接口,主要是对各种IOCTL接口进行封装。
    二、KMS(Kernel Mode Setting):负责更新画面和设置显示参数。
    涉及到的元素有:CRTCENCODERCONNECTORPLANEFBVBLANKproperty
      更新画面:显示buffer的切换,多图层的合成方式,以及每个图层的显示位置。
      设置显示参数:包括分辨率、刷新率、电源状态(休眠唤醒)等
    三、GEM(Graphic Execution Manager):负责显示buffer的分配和释放,也是GPU唯一用到DRM的地方
    涉及到的元素有:DUMBPRIMEfence



DRM Framebuffer

  它是一块内存区域,可以理解为一块画布,驱动和应用层都能访问它。绘制前需要将它格式化,设定绘制的色彩模式(例如RGB24,YUV 等)和画布的大小(分辨率)。


CRTC

  阴极摄像管上下文。这个看名字很很难懂,但简单的来说他就是显示输出的上下文,可以理解为扫描仪。CRTC对内连接 Framebuffer 地址,对外连接 Encoder,会扫描 Framebuffer 上的内容,叠加上 Planes 的内容,最后传给Encoder。


Planes

  平面。它和 Framebuffer 一样是内存地址。它的作用是干什么呢?打个比方,在电脑上,一边打字聊微信一边看电影,这里对立出来两个概念,打字是文字交互,是小范围更新的 Graphics 模式;看电影是全幅高速更新的 Video 模式,这两种模式将显卡的使用拉上了两个极端。
  这时Planes就发挥了很好的作用,它给 Video 刷新提供了高速通道,使 Video 单独为一个图层,可以叠加在 Graphic 上或之下,并具有缩放等功能。
  Planes 是可以有多个的,相当于图层叠加,因此扫描仪(CRTC)扫描的图像实际上往往是 Framebuffer 和 Planes 的组合(Blending)。


Encoder

  编码器。它的作用就是将内存的 pixel 像素编码(转换)为显示器所需要的信号。简单理解就是,如果需要将画面显示到不同的设备(Display Device)上,需要将画面转化为不同的电信号,例如 DVID、VGA、YPbPr、CVBS、Mipi、eDP 等。
  Encoder 和 CRTC 之间的交互就是我们所说的 ModeSetting,其中包含了前面提到的色彩模式、还有时序(Timing)等。


Connector

  连接器。它常常对应于物理连接器 (例如 VGA, DVI, FPD-Link, HDMI, DisplayPort, S-Video等) ,它不是指物理线,在 DRM中,Connector 是一个抽象的数据结构,代表连接的显示设备,从Connector中可以得到当前物理连接的输出设备相关的信息 ,例如,连接状态,EDID数据,DPMS状态、支持的视频模式等。
以上参考天上下橙雨CSDN—Linux DRM基本概念与使用示例(C语言)




_以上内容来自何小龙CSDN详细讲解可点击链接_


思维导图