DRM应用程序进阶 (Property)

前言

通过前面几篇《最简单的DRM应用程序》系列文章,我们学习了如何编写一个最基本的DRM应用程序。但是,这些程序所使用的接口,在如今的DRM架构中其实早已经被标记为 Legacy(过时的) 接口了,而目前DRM主要推荐使用的是 Atomic(原子的) 接口。Atomic接口我会在下篇文章中重点介绍,本篇主要介绍Atomic操作必须依赖的基本元素,Property(属性)

Property

所谓Property,其实就是把前几篇的legacy接口传入的参数单独抽出来,做成一个个独立的全局属性。通过设置这些属性参数,即可完成对显示参数的设置。

Property的结构简单概括主要由3部分组成:nameidvalue。其中id为该property在DRM框架中全局唯一的标识符。

采用property机制的好处是:

  1. 减少上层应用接口的维护工作量。当开发者有新的功能需要添加时,无需增加新的函数名和IOCTL,只需在底层驱动中新增一个property,然后在自己的应用程序中获取/操作该property的值即可。
  2. 增强了参数设置的灵活性。一次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 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 TYPEATOMIC TYPE。这两种type的特殊性在于,它们可以和上面任意一种property进行组合使用,用来修饰上面的property。

  • IMMUTABLE TYPE:表示该property为只读,应用程序无法修改它的值,如"IN_FORMATS"。
  • ATOMIC TYPE:表示该property只有在drm应用程序(drm client)支持ATOMIC操作时才可见。

概念图

还是习惯性的上一张图吧:

property.png

总结

DRM的Property,其实有点类似于kernel中的sysfs属性节点。DRM将kernel空间中的重要参数通过property机制导出给上层应用,使得上层应用可以通过修改property的值,来轻松实现参数的传递,而无需额外的IOCTL操作。

通过本篇的学习,我们了解了DRM Property的基本概念,这有助于我们学习后面的Atomic编程。在下一篇文章中,我们将一起来学习如何使用libdrm的Atomic接口进行编程,敬请期待!

参考资料

Linux GPU Driver Developer’s Guide: KMS Properties

文章汇总: DRM (Direct Rendering Manager) 学习简介

发布了68 篇原创文章 · 获赞 112 · 访问量 12万+

猜你喜欢

转载自blog.csdn.net/hexiaolong2009/article/details/87211230
今日推荐