1.架构图
1.App或者GUI tool发起绘画请求,最终经过libdrm到kernel驱动GPU进行渲染操作;或者pixel-man经过CPU渲染,或者overlay这种;
2.GPU将渲染结果通过memory最终传给上层[与其他类型的图层也在一并交给compositor]。
3.渲染的一张张结果[多张不同图层]经过kms:displayconntroller合成一张图装换成合适的数据格式最终输出到屏幕上。
a.高通方面的源码路径如下
kernel/driver/gpu/drm/xxxx
kernel/driver/gpu/drm/msm/xxxx
kernel/driver/gpu/drm/msm/sde/xxxx
sde和以前的mdp是同一个模块
2.概念
a. libdrm
libdrm是包装大多数Drm IOCTL的库。包括vblank事件处理,内存管理,输出管理,帧缓冲管理等。是用户空间与内核交互的重要方式。api分两套,legacy和atomic
b. drm& c. kms& d. gem& framebuffer
Linux
DRM层包含用于支持复杂图形设备需求的代码,通常包含非常适合3D图形加速的可编程管道。内核中的图形驱动程序可以利用DRM函数来简化内存管理,中断处理和DMA等任务,并为应用程序提供统一的接口。
KMS 负责modeset,负责将图像合成,变成电信号,最终送到显示设备上。
这两个合起来负责渲染以及送显。也就是整个图像的生成以及显示到硬件上的整个过程。
GEM是负责管理framebuffer的模块。也是drm重点的一部分。
e. plane
Display Controller的数据源通道,每个crtc至少要有一个plane;切记这是硬件设备
f. crtc
1.DPMS (Display Power Manage System) 电源状态管理 (crtc_funcs->dpms)
2.将 Framebuffer 转换成标准的 LCDC Timing ,其实就是一帧图像刷新的过程(crtc_funs->mode_set)
3.帧切换,即在 VBlank 消影期间,切换 Framebuffer(crtc_funcs->page_flip)
4.Gamma 校正值调整(crtc_funcs->gamma_set)
g. encoder
1.DPMS (Display Power Manage System) 电源状态管理 (encoder_funcs->dpms)
2.将 VOP 输出的 lcdc Timing 打包转化为对应接口时序 HDMI TMDS / … (encoder_funcs->mode_set)
h. bridge
1.转换作用,将一种信号转换或者加解串成另一种信号
比如mipi -> hdmi
i.connector
1.获取上报热拔插Hotplug状态
2.读取并解析屏(Panel)的EDID信息
高通自身在msm里面有个sde文件夹,里面有自己重新封装的connector。文件为sde_connector.c以及sde_connector.h文件。
注:
顺序buffer -> plane -> crtc -> encoder -> (bridge) -> connector -> hw panel;
plane-crtc-encoder对应的实体,都是包含在mdp内部;
j.Makefile
1类drm-xxx,drm基础模块。
2类drm-xxx-helper-xxx,drm的helper模块。
3类xxx/文件夹,第三方厂商对drm,对自己硬件的实现与封装。