- 介绍kms_swrast,一个新的、有硬件支持的、软件图形驱动,建立在Mesa gallium驱动框架之上,它使用内核kms drm节点进行内存分配。
Stack overview
让我们先来看看图形堆栈的高层次概述
在深入研究这个问题之前,让我们先了解一些术语。
DRM–直接渲染管理器–是Linux内核的图形子系统,它包含所有的图形驱动,并与硬件进行所有的接口。DRM子系统实现了KMS(内核模式设置)API。
模式设置本质上是配置输出设置,如正在使用的显示器的分辨率。使用内核来做意味着用户空间不需要直接访问设置这些东西.
DRM子系统与硬件直接挂钩,Mesa通过它实现的API被应用程序使用,像OpenGL、OpenGL ES、Vulkan等API。所有的Mesa都是建立在DRM和libdrm之上的。libdrm是一个用户空间库,它封装了DRM子系统,以简化与驱动的对话,并避免用户直接操作DRM的ioctl可能会发生的常见错误。
在Mesa内部,我们发现了Gallium驱动框架。大多数Mesa驱动都是用它来构建的,Intel i965驱动是个例外。kms_swrast是使用Gallium构建的,目的是尽可能多地重复使用Gallium和KMS提供的基础构建框架。kms_swrast本身是由一个后端支持的,比如softpipe或者更快的llvmpipe,它实际上实现了3D基元和功能,以达到OpenGL和OpenGL ES的标准。Softpipe是这两种实现方式中比较古老和不太复杂的一种,而llvmpipe则比较新,它依赖于LLVM作为外部依赖。llvmpipe支持JIT编译,所以它的速度比softpipe快了很多。
Why is this a good idea?
使用现成的Gallium框架可以让你免费获得很多东西(可以减少很多冗余的工作),并且驱动程序可以保持相对轻量级。
除了Gallium先阶段提供的功能外,你还可以免费获得未来的新功能,而不需要自己编写它们。由于Gallium是由许多驱动共享的,因此它将比任何一个驱动都能得到更好的测试,并减少很多bug。
kms_swrast是使用DRM和实际的内核驱动构建的,但实际上没有使用渲染硬件。
这可能看起来有点奇怪。那么,为什么内核驱动会被用于软件渲染器呢?
答案是两方面的,这是Gallium架构所期望的,为了不必对它进行侵入性的修改,只是为它提供对一些驱动的最简单访问。由于实际的硬件大多没有使用,所以你使用什么硬件其实并不重要。
DRM驱动实际上只用来做一件事,就是分配一片内存,用来渲染像素,然后发送到显示器上。
我的补充:
适用场景可以理解为:只存在dc而没有gpu的硬件结构上,可以通过kms_swrast来使用dc驱动实现buffer的分配方案;🐸