对于 Display 框架,我需要了解 KMS api 吗?| Linux 驱动

缘由
什么是 KMS ?
要了解 KMS,首先要了解 DRM 。
DRM 是 Direct Rendering Manager 的缩写,最初只是用来支持 GPU 的,最初它负责:
 

  • Initialize GPU card, load its firmware, etc.
  • Share the GPU command queue between multiple Applications
  • Manage the memory (allocation, access)
 
那时候,Mode-Setting (包括更新画面、配置 display pipeline、screen resolution、color depth、refresh rate等) 是在 Userspace 中实现的,这样做的缺点是:
 
  • Rendering 和 Mode-Setting 会发生竞争;
  • 不统一,缺少抽象,不同的硬件平台各自为营;
 
后来就引入了 Kernel Mode-Setting (KMS),其实就是将 Mode-Setting 的活移回到内核,DRM driver 即负责访问 GPU 也负责访问 Display Engine,且将 KMS 作为 DRM API 的一部分,如下图:
对于 Display 框架,我需要了解 KMS api 吗?| Linux 驱动

文章插图
 
目前我们关注最左边的路径就好,不用太关注 GEM、PRIME 等概念 。
图形应用是如何进行显示的?
通常,一个普通的图形应用并不会直接通过 KMS 和内核进行交互,而是先和 display server (例如给予 X11 的 Xorg, 或者基于 Wayland 的 Weston,也称 display compositor) 进行交互:将显示的图像提交给 display server, 再由 display server 负责将多个 client 图形应用的图像合成成一张图像,并将这张图像通过 KMS 的接口提交给内核 。
简而言之,就是 2 个步骤:
step1: 合成
对于 Display 框架,我需要了解 KMS api 吗?| Linux 驱动

文章插图
 
step2: 提交给内核
对于 Display 框架,我需要了解 KMS api 吗?| Linux 驱动

文章插图
 
何时要用 KMS ?
对于普通的图形应用,一般是不会直接去使用 KMS 的 。
只有一些需要 low level control 的应用需要使用 KMS,例如:
 
  • Display servers;
  • Media players,例如 Kodi,它们有自己的 KMS backend,不需要额外的 display server;
  • 游戏相关的应用,例如 RetroArch,为了支持更多的平台,它们会做到不依赖 display server;
  • VR、XR,它们对性能要求很严格,所以会亲自访问 KMS 以达到最小的延迟;
 
【对于 Display 框架,我需要了解 KMS api 吗?| Linux 驱动】既然很少直接使用 KMS,为什么还要学习它 ?
 
  • DRM Driver 的驱动开发人员有必要了解 KMS api,这样才能理解 DRM Driver 的设计目的,从而编写出正确的驱动程序;
  • 理解原理,可以协助我们定位图形应用不稳定或者性能相关的问题,尤其是嵌入式 linux 领域,显示相关的功能复杂且容易出现异常;
  • 如果你想要为开源软件 Wayland 或者 Kodi 做贡献的话,则需要了解 KMS api;
  • 如果你的应用对性能和延迟性要求很高的话,也需要了解 KMS api 。 
     
如何编写 KMS Demo? 
要编写 KMS 程序,首先要了解 KMS 的模型 。
KMS 将硬件模块抽象成下面几个对象类型:
 
  • Planes:图层,例如在 rockchip 平台里对应 SOC 内部 VOP 模块的 win 图层;
  • CRTC:显示控制器,例如在 rockchip 平台里对应 SOC 内部的 VOP 模块;
  • Encoder:输出转换器,指 RGB、LVDS、DSI、eDP、HDMI、CVBS、VGA 等显示接口;
  • Connector:连接器,指 encoder 和 panel 之间交互的接口部分;
  • Bridge:桥接设备,一般用于注册 encoder 后面另外再接的转换芯片,如 DSI2HDMI 转换芯片;
  • Panel:泛指屏,各种 LCD、HDMI 等显示设备的抽象;
 
应用通过 KMS api 将这些对象连接成一条 display pipeline,最终将图像显示在屏幕上:
对于 Display 框架,我需要了解 KMS api 吗?| Linux 驱动

文章插图
 
KMS 有两套 api: legacy api (已过时) 和 atomic api:


推荐阅读