Linux的Graphics子系统旨在为Linux系统提供图形界面的支持。其系统架构如下图所示:
Ø LCD控制器驱动
LCD控制器从字面上理解也知道,它是用来控制LCD液晶屏的,CPU可通过操作LCD控制器来实现对LCD的控制。对于不同型号的LCD控制器,Linux需要提供其驱动程序,如exynos4412的LCD控制器驱动源码路径为:“drivers/video/exynos/s3cfb.c”。
Ø FB抽象接口驱动
FrameBuffer Driver(帧缓存驱动) 是出现在 2.2.xx 内核当中的一种驱动程序接口。它屏蔽掉了不同显示设备硬件的差异性,为用户提供统一的显示屏操作视角(/dev/fbx),应用程序可以通过打开读写此设备文件而将视频及图像数据输出到显示设备上。其内核源码路径为:“/drivers/video/fbmem.c”
Ø 应用层图形界面
图形界面为用户提供友好的操作接口,常见的linux图形界面有:Android、QT、Xwindow、MiniGUI、GTK等。
Ø OpenGL
Open Graphics Library定义了一个跨编程语言、跨平台的规格的专业的图形程序,它被用来绘制底层图形。什么是绘制底层图形,举个例子就清楚了,比如我们想画个圆只需要调用OpenGL接口()就可以了。OpenGL只是定义了诸如此类的接口,其具体内部实现可以是软件实现,也可以是硬件实现(通过DRM+GPU)。
OpenGL支持对2D和3D图形的绘制,绘制标准流程如下图所示:
Ø DRM(DirectRendering Manager)
DirectRendering Manager(直接渲染管理器)从名字上我们就可以看出它是干什么的。渲染是一件非常复杂的事情,如果通过软件实现,想必是非常耗CPU资源的,DRM的作用就是将渲染工作交给GPU来完成。内核源码路径为:“drivers/gpu/drm/”
提供直接图形渲染是DRM的主要功能,它还有一些其他功能,如GEM、EDID、CRTC等,DRM功能框图如下图所示:
Ø 显卡及其驱动
显卡一般由GPU、显存及一些显示器接口组成,其主要完成三维图像和特效的处理,核心技术有硬体T&L、立方环境材质贴图和顶点混合、纹理压缩和凹凸映射贴图、双重纹理四像素256位渲染引擎等。为了使用这些功能Linux需要为相应GPU提供驱动程序,如ARM@Mali系列的GPU源码路径为:“/drivers/gpu/arm/mali”。
Ø 显存、FB、LCD控制器、GPU四者之间的关系
FB驱动、LCD控制器驱动、GPU这三者都关联着显存,我们可以简单理解为FB和GPU是显存内容的提供者,而LCD控制器是显存内容的消费者。其关系图如下图所示: