Linux Graphics

2,916 阅读7分钟

简介

Linux Graphics 主要是指 Linux 是如何在屏幕上显示内容的,可以分为两部分:

  • 一部分是显示服务器,比如X11或者Wayland,它们负责定义系统的窗口,允许第三方开发者使用它们提供的client库来开发Linux GUI程序,也就是负责程序的窗口部分;
  • 另一部分是这些GUI程序内容的渲染,也就是负责窗口中的内容部分。

关于X11或者Wayland部分也可以参考 1.Linux Window System框架介绍

Linux Graphics 发展历史

阶段一

下图是最简单的X11程序架构,X11客户端程序通过X协议和X server通信,从而在屏幕上显示X11程序,这种情况下X11程序的所有绘制都要通过Xserver来进行,Xserver通过调用厂家提供的2D驱动程序来使用GPU。这种情况下客户端无法使用OpenGL来绘制程序内容。

阶段二

为了能让客户端程序使用其它非X11提供的2D绘图方式,因此X11的GLX扩展产生了,它允许客户端使用自己的绘图库来进行程序内容的绘制,比如使用OpenGL来进行3D绘制。但是这种方式所有的OpenGL调用都要先发给Xserver进行中转,性能较低。这种绘制方式称为非直接渲染(Indirect Rendering)。

图中还显示了Framebuffer程序,它可以不依赖Xserver来开发GUI程序。这是因为在内核中针对显示抽象出了Framebuffer设备,通过直接对它进行基于像素的操作就可以直接将内容显示在屏幕上,很多字符界面的终端是用这种方式来显示界面的。目前Linux内核依然支持这种方式。

阶段三

这个时候Linux推出了DRI(Direct Rendering Infrastructure.)框架,它允许客户端不使用root权限,不经过DisplayServer,通过直接调用厂家提供的DRI驱动就可以使用GPU进行绘制。这种方式称为直接渲染(Direct Rendering)。

DRI (Direct Rendering Infrastructure)

DRI是一套框架,一个思想,它提供一种让客户端程序可以绕过DS直接使用GPU的方法,它的实现分散在各个库中,比如DS的client库,Mesa3D,GPU厂家的驱动程序,以及DRM内核子系统中。

阶段四

这里是使用Wayland取代X11之后的结构图,注意这里的EGL并不是Wayland客户端程序可选的,它是默认的,所有的Wayland客户端程序都会通过Wayland-client库间接的使用EGL。关于EGL可以参考这里2.OpenGL介绍的EGL部分。

Linux Graphics 实现

下图展示了Linux Graphics的更多细节。

从这个图里面我们得到以下信息:

  1. 红色字体的Mesa部分提供了很多的lib,其中主要的有实现各种GL协议的libGL,和实现EGL协议的libEGL。
  2. 全屏独占屏幕,不需要窗口管理器的3D游戏可以直接使用各种GL来进行画面显示,图中各种GL的实现是由Mesa提供的libGL库提供(详情见3.Mesa (Linux Graphics Driver)),当然游戏引擎也可以直接调用厂家提供的GL库而避免Mesa的转发,不过这样会导致游戏需要自行适配各个厂家的GL驱动;
  3. Wayland客户端程序通过libwayland-client库(也可以是其它实现了wayland协议的库,比如chromium中的exo模块实现了wayland协议)和Wayland Compositor进行通信,主要是窗口管理部分的功能,其它部分,比如内容渲染是通过直接使用EGL(和其它GL协议)来实现的。
  4. X11客户端程序通过libX或者libXCB库和Xserver进行通信。图中没有画出来GLX,其实X11客户端程序通过GLX也同样实现了让X11客户端可以使用EGL和其它GL协议来绘制X11客户端程序的内容。在Xserver中的2D绘图部分使用GPU厂商提供DDX驱动和libDRM库直接调用。
  5. Wayland和Xserver都要使用KMS(Kernel Model Setting,用来设置显卡的模式以及参数)。

如果你的电脑使用Xserver,那上图中的逻辑是没有问题的,如果你的电脑是用了Wayland,则情况会复杂一点,因为纯粹的Wayland Compositor是完全不支持X11程序的,而Wayland为了兼容X11程序,实现了XWayland,有了下面这个图:

视频硬件编解码

上面的介绍都是在讲GUI程序如何渲染,它们都只涉及到了GPU的渲染功能(关于GPU的功能介绍参考GPU介绍),都没有涉及到如果程序中要播放视频应该怎么办?视频也是需要显示出来的,也应该属于渲染部分,而且GPU的另一个重要功能就是提供视频硬件编解码加速,这部分的能力客户端程序要怎么使用呢?这就涉及到了专门用来视频硬件编解码的视频编解码API。在介绍这些API之前先了解一下视频编解码的方式。

当前共有三类视频编解码方式:CPU纯软编解码,GPU编解码,独立的IC硬解。

其中GPU编解码和独立IC编解码就是我们常说的视频硬件加速,但是它们也只是处理视频的编解码,并不管解码后视频如何渲染,通过GPU硬件加速渲染或者通过软件渲染都是可以的,所以这就是为什么有时候我使用了视频硬件加速了但是视频播放质量还是比较低,或者CPU占用还是比较高(因为使用了软件渲染,没有使用GPU硬件渲染)。所以理论上同时使用GPU编解码和GPU渲染才是最高效的视频播放方式。

独立的IC硬解依赖不同的IC硬件,不同厂家都有不同的硬件实现,一般他们会遵照某种 API 定义来提供给上层使用;

常见的视频编解码API有下面这些:

For example, Nouveau, which has been developed as part of Mesa, but also includes a Linux kernel component, which is being developed as part of the Linux kernel, supports the PureVideo-branded ASICs and provides access to them through VDPAU and partly through XvMC.[149]

The free radeon driver supports Unified Video Decoder and Video Coding Engine through VDPAU and OpenMAX.[150]

Please note, that V4L2 is a kernel-to-user-space interface for video bit streams delivered by webcams or TV tuners.

其中VAAPI是应用范围最广的,支持AMD和Intel的GPU。(Chromium中就是使用VAAPI)

显卡驱动程序

一套完整的显卡驱动程序包含以下几部分内容:

  1. Linux 内核中的 DRM 部分;
  2. Linux 内核中的 KMS 部分;
  3. 用户态的 libDRM 库,用来对接内核中的DRM;
  4. Mesa3D中的DeviceDriver部分,它可以是传统的DRI驱动,也可以是基于Gallium3D框架的驱动。
  5. 用于对接Xserver的DDX驱动,如果使用Wayland显示服务则不需要该驱动。

这里面只有1,2是通常意义下的驱动程序,他们可以编译进内核也可以编译为.ko文件,其它的3,4,4虽然并不是真正的驱动概念,但是在该领域经常会也称它们为驱动。

Graphics 图形库汇总

下面这些是从Wiki上摘出来的图形库汇总,有些是对其他图形库的二次包装,放在这里方便大家深入学习。

2D rendering APIs[edit]

3D rendering APIs

Cross platform, high level[edit]

Cross platform, low level[edit]

Vendor specific, high level[edit]

Vendor specific, low level[edit]

  1. ^ "imagination shows off vullkan gains".
  2. ^ "dreamcast development board".kamui manual,naomi board,DC

来自 <en.wikipedia.org/wiki/List_o…>