前言
通过前面几篇《最简单的DRM应用程序》系列文章,我们学习了如何编写一个最基本的DRM应用程序。但是,这些程序所使用的接口,在如今的DRM架构中其实早已经被标记为 Legacy(过时的) 接口了,而目前DRM主要推荐使用的是 Atomic(原子的) 接口。Atomic接口我会在下篇文章中重点介绍,本篇主要介绍Atomic操作必须依赖的基本元素,Property(属性)。
Property
所谓Property,其实就是把前几篇的legacy接口传入的参数单独抽出来,做成一个个独立的全局属性。通过设置这些属性参数,即可完成对显示参数的设置。
Property的结构简单概括主要由3部分组成:name
、id
和 value
。其中id
为该property在DRM框架中全局唯一的标识符。
采用property机制的好处是:
- 减少上层应用接口的维护工作量。当开发者有新的功能需要添加时,无需增加新的函数名和IOCTL,只需在底层驱动中新增一个property,然后在自己的应用程序中获取/操作该property的值即可。
- 增强了参数设置的灵活性。一次IOCTL可以同时设置多个property,减少了user space与kernel space切换的次数,同时最大限度的满足了不同硬件对于参数设置的要求,提高了软件效率。
DRM中的property大多以功能进行划分,并且还定义了一组 Standard Properties,这些标准properties在任何平台上都会被创建。
下表列出了应用程序开发中,常用的property:
CRTC
name | desctription |
---|---|
ACTIVE | CRTC当前的使能状态,一般用于控制CRTC上下电 |
MODE_ID | CRTC当前所使用的display mode ID,通过该ID可以找到具体的display mode配置参数 |
OUT_FENCE_PTR | 输出fence指针,指向当前正在显示的buffer所对应的fence fd,该fence由DRM驱动创建,供上层应用程序使用,用来表示当前buffer CRTC是否还在占用 |
(optional)
name | desctription |
---|---|
DEGAMMA_LUT | de-gamma查找表参数 |
DEGAMMA_LUT_SIZE | de-gamma查找表参数长度 |
CTM | Color Transformation Matrix,颜色矩阵转换参数,3x3的矩阵 |
GAMMA_LUT | gamma查找表参数 |
GAMMA_LUT_SIZE | gamma查找表参数长度 |
PLANE
name | desctription |
---|---|
type | plane的类型,CURSOR、PRIMARY或者OVERLAY |
FB_ID | 与当前plane绑定的framebuffer object ID |
IN_FENCE_FD | 与当前plane相关联的input fence fd,由buffer的生产者创建,供DRM底层驱动使用,用来标识当前传下来的buffer是否可以开始访问 |
CRTC_ID | 当前plane所关联的CRTC object ID,与CONNECTOR中的CRTC_ID属性是同一个property |
SRC_X | 当前framebuffer crop区域的起始偏移x坐标 |
SRC_Y | 当前framebuffer crop区域的起始偏移y坐标 |
SRC_W | 当前framebuffer crop区域的宽度 |
SRC_H | 当前framebuffer crop区域的高度 |
CRTC_X | 屏幕显示区域的起始偏移x坐标 |
CRTC_Y | 屏幕显示区域的起始偏移y坐标 |
CRTC_W | 屏幕显示区域的宽度 |
CRTC_H | 屏幕显示区域的高度 |
(optional)
name | desctription |
---|---|
IN_FORMATS | 用于标识特殊的颜色存储格式,如AFBC、IFBC存储格式,该属性为只读 |
rotation | 当前图层的旋转角度 |
zposition | 当前图层在所有图层中的Z轴顺序 |
alpha | 当前图层的global alpha(非pixel alpha),用于多层合成 |
pixel blend mode | 当前图层的合成方式,如Pre-multiplied/Coverage等 |
CONNECTOR
name | desctription |
---|---|
EDID | Extended Display Identification Data,标识显示器的参数信息,是一种VESA标准数据格式 |
DPMS | Display Power Management Signaling,用于控制显示器的电源状态,如休眠唤醒。也是一种VESA标准 |
link-status | 用于标识当前connector的连接状态,如Good/Bad |
CRTC_ID | 当前connector所连接的CRTC object ID,与PLANE中CRTC_ID属性是同一个property |
(optional)
name | desctription |
---|---|
PATH | DisplayPort专用的属性,主要用于Multi-Stream Transport (MST) 功能,即多路显示应用场景 |
TILE | 用于标识当前connector是否应用于多屏拼接场景,如平时随处可见的多屏拼接显示的广告大屏幕 |
Property Type
Property的类型分为如下几种:
- enum
- bitmask
- range
- signed range
- object
- blob
以上类型中需要着重介绍的是object和blob类型,其它类型看名字就知道什么意思,所以就不做介绍了。
Object Property
Object类型的property,它的值用 drm_mode_object ID来表示。目前的DRM架构中仅用到2个Object Property,它们分别是 "FB_ID" 和 "CRTC_ID" ,它们的property值分别表示framebuffer object ID和crtc object ID。
Blob Property
Blob类型的property,它的值用blob object ID来表示。所谓blob,说白了就是一个自定义长度的内存块,用来存放自定义的结构体数据。典型的Blob Property,如 "MODE_ID" ,它的值为blob object ID,drm驱动可以根据该ID找到对应的drm_property_blob结构体,该结构体中存放着modeinfo的相关信息。
在DRM的property type中,还有2种特殊的type,它们分别是
IMMUTABLE TYPE
和ATOMIC TYPE
。这两种type的特殊性在于,它们可以和上面任意一种property进行组合使用,用来修饰上面的property。
- IMMUTABLE TYPE:表示该property为只读,应用程序无法修改它的值,如"IN_FORMATS"。
- ATOMIC TYPE:表示该property只有在drm应用程序(drm client)支持ATOMIC操作时才可见。
概念图
还是习惯性的上一张图吧:
总结
DRM的Property,其实有点类似于kernel中的sysfs属性节点。DRM驱动将kernel层的重要参数通过property机制导出给上层,使得上层应用可以采用统一的接口形式来修改property的值,从而实现参数的传递,而无需新增额外的IOCTL接口。
通过本篇的学习,我们了解了DRM Property的基本概念,这有助于我们学习后面的Atomic编程。在下一篇文章中,我们将一起来学习如何使用libdrm的Atomic接口进行编程,敬请期待!
参考资料
Linux GPU Driver Developer’s Guide: KMS Properties