CRTC 索引
CRTC 既有对象 ID,也有索引,它们不是同一回事。在需要为 CRTC 提供密集打包的标识符的情况下(例如 CRTC 的位掩码),会使用索引。struct drm_mode_get_plane
的成员 possible_crtcs 就是一个例子。
DRM_IOCTL_MODE_GETRESOURCES
使用 CRTC ID 数组填充一个结构,CRTC 索引是它在此数组中的位置。
-
DRM_CAP_DUMB_BUFFER
DRM_CAP_DUMB_BUFFER
-
DRM_CAP_VBLANK_HIGH_CRTC
DRM_CAP_VBLANK_HIGH_CRTC
描述
如果设置为 1,则内核支持在 drm_wait_vblank_request.type
的高位中指定一个 CRTC 索引。
从内核版本 2.6.39 开始,此功能始终设置为 1。
-
DRM_CAP_DUMB_PREFERRED_DEPTH
DRM_CAP_DUMB_PREFERRED_DEPTH
描述
哑缓冲区的首选位深度。
位深度是用于指示单个像素颜色的位数,不包括任何填充。这与每个像素的位数不同。例如,XRGB8888 的位深度为 24,但每个像素有 32 位。
请注意,此首选项仅适用于哑缓冲区,与其他类型的缓冲区无关。
-
DRM_CAP_DUMB_PREFER_SHADOW
DRM_CAP_DUMB_PREFER_SHADOW
描述
如果设置为 1,驱动程序首选用户空间渲染到影子缓冲区,而不是直接渲染到哑缓冲区。为了获得最佳速度,用户空间应该将流式有序内存复制到哑缓冲区,并且永远不要从中读取。
请注意,此首选项仅适用于哑缓冲区,与其他类型的缓冲区无关。
-
DRM_CAP_PRIME
DRM_CAP_PRIME
-
DRM_PRIME_CAP_IMPORT
DRM_PRIME_CAP_IMPORT
-
DRM_PRIME_CAP_EXPORT
DRM_PRIME_CAP_EXPORT
-
DRM_CAP_TIMESTAMP_MONOTONIC
DRM_CAP_TIMESTAMP_MONOTONIC
描述
如果设置为 0,内核将在 struct drm_event_vblank 中使用 CLOCK_REALTIME
报告时间戳。如果设置为 1,内核将使用 CLOCK_MONOTONIC
报告时间戳。请参阅 clock_gettime(2)
以获取这些时钟的定义。
从内核版本 2.6.39 开始,此功能的默认值为 1。从内核版本 4.15 开始,此功能始终设置为 1。
-
DRM_CAP_ASYNC_PAGE_FLIP
DRM_CAP_ASYNC_PAGE_FLIP
-
DRM_CAP_CURSOR_WIDTH
DRM_CAP_CURSOR_WIDTH
描述
CURSOR_WIDTH
和 CURSOR_HEIGHT
功能返回硬件光标的有效宽度 x 高度组合。其目的是,与硬件无关的用户空间可以查询要使用的光标平面大小。
请注意,跨驱动程序合同仅仅是返回有效的大小;驱动程序可以随意附加其他含义,例如 i915 返回最大平面大小。
-
DRM_CAP_CURSOR_HEIGHT
DRM_CAP_CURSOR_HEIGHT
-
DRM_CAP_ADDFB2_MODIFIERS
DRM_CAP_ADDFB2_MODIFIERS
描述
如果设置为 1,驱动程序支持在 DRM_IOCTL_MODE_ADDFB2
ioctl 中提供修饰符。
-
DRM_CAP_PAGE_FLIP_TARGET
DRM_CAP_PAGE_FLIP_TARGET
描述
如果设置为 1,驱动程序支持 DRM_MODE_PAGE_FLIP_TARGET_ABSOLUTE
和 DRM_MODE_PAGE_FLIP_TARGET_RELATIVE
标志,用于 drm_mode_crtc_page_flip_target.flags
,用于 DRM_IOCTL_MODE_PAGE_FLIP
ioctl。
-
DRM_CAP_CRTC_IN_VBLANK_EVENT
DRM_CAP_CRTC_IN_VBLANK_EVENT
-
DRM_CAP_SYNCOBJ
DRM_CAP_SYNCOBJ
-
DRM_CAP_SYNCOBJ_TIMELINE
DRM_CAP_SYNCOBJ_TIMELINE
描述
如果设置为 1,则驱动程序支持同步对象上的时间线操作。请参阅 DRM 同步对象。
-
DRM_CAP_ATOMIC_ASYNC_PAGE_FLIP
DRM_CAP_ATOMIC_ASYNC_PAGE_FLIP
-
DRM_CLIENT_CAP_STEREO_3D
DRM_CLIENT_CAP_STEREO_3D
描述
如果设置为 1,DRM 核心将通过在 struct drm_mode_modeinfo
的标志中通告支持的 3D 布局来公开监视器的立体 3D 功能。请参阅 DRM_MODE_FLAG_3D_*
。
从内核版本 3.13 开始,所有驱动程序始终支持此功能。
-
DRM_CLIENT_CAP_UNIVERSAL_PLANES
DRM_CLIENT_CAP_UNIVERSAL_PLANES
描述
如果设置为 1,DRM 核心将向用户空间公开所有平面(叠加、主平面和光标)。
此功能已在内核版本 3.15 中引入。从内核版本 3.17 开始,所有驱动程序始终支持此功能。
-
DRM_CLIENT_CAP_ATOMIC
DRM_CLIENT_CAP_ATOMIC
-
DRM_CLIENT_CAP_ASPECT_RATIO
DRM_CLIENT_CAP_ASPECT_RATIO
描述
如果设置为 1,DRM 核心将在模式中提供纵横比信息。请参阅 DRM_MODE_FLAG_PIC_AR_*
。
从内核版本 4.18 开始,所有驱动程序始终支持此功能。
-
DRM_CLIENT_CAP_WRITEBACK_CONNECTORS
DRM_CLIENT_CAP_WRITEBACK_CONNECTORS
描述
如果设置为 1,DRM 核心将公开特殊的连接器,用于在提交时将场景设置写回内存。客户端必须首先启用 DRM_CLIENT_CAP_ATOMIC
。
从内核版本 4.19 开始,支持原子操作的驱动程序始终支持此功能。
-
DRM_CLIENT_CAP_CURSOR_PLANE_HOTSPOT
DRM_CLIENT_CAP_CURSOR_PLANE_HOTSPOT
描述
用于准虚拟化硬件(例如 vmwgfx、qxl、virtio 和 virtualbox)的驱动程序对光标平面有额外的限制(因此使得这些驱动程序上的光标平面不是真正的通用),例如,它们需要光标平面的行为类似于鼠标光标,并且具有正确设置的热点属性。如果未设置此客户端功能,则 DRM 核心将隐藏这些虚拟化驱动程序上的光标平面,因为不设置它意味着客户端无法处理这些额外的限制。设置光标热点并将光标平面视为鼠标光标的客户端应设置此属性。客户端必须首先启用 DRM_CLIENT_CAP_ATOMIC
。
在不特殊处理光标平面的驱动程序(即非虚拟化驱动程序)上设置此属性将返回 EOPNOTSUPP,用户空间可以使用该返回值来衡量他们运行的硬件/驱动程序的要求。
从内核版本 6.6 开始,支持原子操作的虚拟化驱动程序始终支持此功能。
-
struct drm_syncobj_eventfd
定义:
struct drm_syncobj_eventfd {
__u32 handle;
__u32 flags;
__u64 point;
__s32 fd;
__u32 pad;
};
成员
handle
syncobj 句柄。
flags
设置为 0 以等待点被信号通知,或设置为 DRM_SYNCOBJ_WAIT_FLAGS_WAIT_AVAILABLE
以等待栅栏可用于该点。
point
syncobj 时间线点(对于二进制 syncobj,设置为零)。
fd
要将事件发送到的现有 eventfd。
pad
必须为零。
描述
注册一个 eventfd,以便通过 syncobj 发出信号。eventfd 计数器将递增 1。
-
DRM_IOCTL_GEM_CLOSE
DRM_IOCTL_GEM_CLOSE
描述
内核不使用引用计数来管理 GEM 句柄。用户空间负责管理它们的生命周期。例如,如果用户空间在同一个 DRM 文件描述符上两次导入同一个内存对象,则两次导入都会返回相同的 GEM 句柄,并且用户空间需要确保 DRM_IOCTL_GEM_CLOSE
仅执行一次。当分配内存对象,然后将其导出并在同一个 DRM 文件描述符上再次导入时,也会发生相同的情况。DRM_IOCTL_MODE_GETFB2
IOCTL 是一个例外,即使在执行 IOCTL 之前,已存在的 GEM 句柄已引用相同的内存对象,它始终会返回全新的 GEM 句柄。
-
DRM_IOCTL_PRIME_HANDLE_TO_FD
DRM_IOCTL_PRIME_HANDLE_TO_FD
描述
用户空间使用要导出的 GEM 句柄设置 drm_prime_handle.handle
和 drm_prime_handle.flags
,并在 drm_prime_handle.fd
中获取 DMA-BUF 文件描述符。
导出可能会因任何特定于驱动程序的原因而失败,例如,因为此特定 GEM 句柄不支持导出(但可能支持其他句柄)。
通过 DRM_PRIME_CAP_EXPORT
通告对导出 DMA-BUF 的支持。
-
DRM_IOCTL_PRIME_FD_TO_HANDLE
DRM_IOCTL_PRIME_FD_TO_HANDLE
描述
用户空间使用要导入的 DMA-BUF 文件描述符设置 drm_prime_handle.fd
,并在 drm_prime_handle.handle
中获取 GEM 句柄。drm_prime_handle.flags
未使用。
如果现有 GEM 句柄引用了支持 DMA-BUF 的内存对象,则会返回该 GEM 句柄。因此,需要处理任意 DMA-BUF 的用户空间必须具有用户空间查找数据结构,以手动引用计数重复的 GEM 句柄。有关更多信息,请参见 DRM_IOCTL_GEM_CLOSE
。
导入可能会因任何特定于驱动程序的原因而失败,例如,因为仅支持在此 DRM 设备上分配的 DMA-BUF 进行导入。
通过 DRM_PRIME_CAP_IMPORT
通告对导入 DMA-BUF 的支持。
-
DRM_IOCTL_MODE_RMFB
DRM_IOCTL_MODE_RMFB
描述
这将删除先前通过 ADDFB/ADDFB2 添加的帧缓冲。IOCTL 参数是帧缓冲对象 ID。
警告:删除当前在启用的平面上使用的帧缓冲将禁用该平面。与该平面链接的 CRTC 也可能会被禁用(取决于驱动程序的功能)。
-
DRM_IOCTL_MODE_CREATE_DUMB
DRM_IOCTL_MODE_CREATE_DUMB
-
DRM_IOCTL_MODE_GETFB2
DRM_IOCTL_MODE_GETFB2
-
DRM_IOCTL_MODE_CLOSEFB
DRM_IOCTL_MODE_CLOSEFB
描述
这将关闭先前通过 ADDFB/ADDFB2 添加的帧缓冲。IOCTL 参数是帧缓冲对象 ID。
此 IOCTL 与 DRM_IOCTL_MODE_RMFB
类似,但它不会禁用平面和 CRTC。只要帧缓冲被平面使用,它就会保持活动状态。当平面不再使用该帧缓冲(因为该帧缓冲被另一个帧缓冲替换,或者该平面被禁用)时,该帧缓冲将被清理。
这对于实现两个进程之间的无闪烁过渡非常有用。
根据威胁模型,用户空间可能需要确保帧缓冲不暴露任何敏感的用户信息:附加到平面的已关闭帧缓冲可能会被下一个 DRM 主设备读取。
-
DRM_IOCTL_SET_CLIENT_NAME
DRM_IOCTL_SET_CLIENT_NAME
描述
拥有名称可以更轻松地进行跟踪和调试。名称的长度(不包括空终止符)必须 <= DRM_CLIENT_NAME_MAX_LEN。如果名称包含空格或不可打印字符,则调用将失败。
-
struct drm_event
DRM 事件的头
定义:
struct drm_event {
__u32 type;
__u32 length;
};
成员
type
事件类型。
length
有效负载字节总数(包括头)。
描述
此结构是在 DRM FD 上写回用户空间的事件的头。在 DRM FD 上读取将始终只返回完整的事件:例如,如果读取缓冲区为 100 字节大小,并且有两个 64 字节的事件挂起,则只会返回一个事件。
事件类型 0 - 0x7fffffff 是通用的 DRM 事件,0x80000000 及以上是特定于芯片组的。通用的 DRM 事件包括 DRM_EVENT_VBLANK
、DRM_EVENT_FLIP_COMPLETE
和 DRM_EVENT_CRTC_SEQUENCE
。
-
DRM_EVENT_VBLANK
DRM_EVENT_VBLANK
描述
此事件是响应 DRM_IOCTL_WAIT_VBLANK
并设置 _DRM_VBLANK_EVENT
标志而发送的。
事件有效负载是一个结构体 drm_event_vblank。
-
DRM_EVENT_FLIP_COMPLETE
DRM_EVENT_FLIP_COMPLETE
-
DRM_EVENT_CRTC_SEQUENCE
DRM_EVENT_CRTC_SEQUENCE
描述
此事件是响应 DRM_IOCTL_CRTC_QUEUE_SEQUENCE
而发送的。
事件有效负载是一个结构体 drm_event_crtc_sequence。
-
struct drm_mode_modeinfo
显示模式信息。
定义:
struct drm_mode_modeinfo {
__u32 clock;
__u16 hdisplay;
__u16 hsync_start;
__u16 hsync_end;
__u16 htotal;
__u16 hskew;
__u16 vdisplay;
__u16 vsync_start;
__u16 vsync_end;
__u16 vtotal;
__u16 vscan;
__u32 vrefresh;
__u32 flags;
__u32 type;
char name[DRM_DISPLAY_MODE_LEN];
};
成员
clock
像素时钟,单位为 kHz
hdisplay
水平显示大小
hsync_start
水平同步开始
hsync_end
水平同步结束
htotal
水平总大小
hskew
水平偏移
vdisplay
垂直显示大小
vsync_start
垂直同步开始
vsync_end
垂直同步结束
vtotal
垂直总大小
vscan
垂直扫描
vrefresh
近似垂直刷新率,单位为 Hz
flags
杂项标志的位掩码,请参见 DRM_MODE_FLAG_* 定义
type
类型标志的位掩码,请参见 DRM_MODE_TYPE_* 定义
name
描述模式分辨率的字符串
描述
这是用户空间 API 显示模式信息结构。有关内核版本,请参见 struct drm_display_mode
。
-
struct drm_mode_get_plane
获取平面元数据。
定义:
struct drm_mode_get_plane {
__u32 plane_id;
__u32 crtc_id;
__u32 fb_id;
__u32 possible_crtcs;
__u32 gamma_size;
__u32 count_format_types;
__u64 format_type_ptr;
};
成员
plane_id
应检索其信息的平面的对象 ID。由调用者设置。
crtc_id
当前 CRTC 的对象 ID。
fb_id
当前 fb 的对象 ID。
possible_crtcs
与平面兼容的 CRTC 的位掩码。创建 CRTC 时,会为其分配一个索引,该索引对应于其在位掩码中的位置。位 N 对应于 CRTC 索引 N。
gamma_size
从未使用过。
count_format_types
格式的数量。
format_type_ptr
指向平面支持的格式 __u32
数组的指针。这些格式不需要修饰符。
描述
用户空间可以执行 GETPLANE ioctl 以检索有关平面的信息。
要检索支持的格式数量,请将 count_format_types 设置为零并调用 ioctl。count_format_types 将使用该值进行更新。
要检索这些格式,请分配一个内存数组,该内存足以存储 count_format_types 格式。将 format_type_ptr 指向此数组,然后再次调用 ioctl(其中 count_format_types 仍设置为第一次 ioctl 调用中返回的值)。
-
struct drm_mode_get_connector
获取连接器元数据。
定义:
struct drm_mode_get_connector {
__u64 encoders_ptr;
__u64 modes_ptr;
__u64 props_ptr;
__u64 prop_values_ptr;
__u32 count_modes;
__u32 count_props;
__u32 count_encoders;
__u32 encoder_id;
__u32 connector_id;
__u32 connector_type;
__u32 connector_type_id;
__u32 connection;
__u32 mm_width;
__u32 mm_height;
__u32 subpixel;
__u32 pad;
};
成员
encoders_ptr
指向 __u32
对象 ID 数组的指针。
modes_ptr
指向 struct drm_mode_modeinfo
数组的指针。
props_ptr
指向 __u32
属性 ID 数组的指针。
prop_values_ptr
指向 __u64
属性值数组的指针。
count_modes
模式数量。
count_props
属性数量。
count_encoders
编码器数量。
encoder_id
当前编码器的对象 ID。
connector_id
连接器的对象 ID。
connector_type
连接器的类型。
请参见 DRM_MODE_CONNECTOR_* 定义。
connector_type_id
特定于类型的连接器编号。
这不是一个对象 ID。这是一个按类型划分的连接器编号。每个 (type, type_id) 组合在 DRM 设备的所有连接器中都是唯一的。
(type, type_id) 组合不是一个稳定的标识符:type_id 可能会根据驱动程序探测顺序而变化。
connection
连接器的状态。
请参见 enum drm_connector_status
。
mm_width
连接的接收器的宽度,单位为毫米。
mm_height
连接的接收器的高度,单位为毫米。
subpixel
连接的接收器的子像素顺序。
请参见枚举 subpixel_order。
pad
填充,必须为零。
描述
用户空间可以执行 GETCONNECTOR ioctl 以检索有关连接器的信息。用户空间应至少执行两次此 ioctl 以检索编码器、模式和属性:第一次检索元素数量,第二次检索元素本身。
要检索元素数量,请将 count_props 和 count_encoders 设置为零,将 count_modes 设置为 1,并将 modes_ptr 设置为临时的 struct drm_mode_modeinfo
元素。
要检索元素,请为 encoders_ptr、modes_ptr、props_ptr 和 prop_values_ptr 分配数组,然后将 count_modes、count_props 和 count_encoders 设置为其容量。
仅执行两次 ioctl 可能存在竞争:在两次 ioctl 之间,元素的数量可能因热插拔事件而发生了变化。用户空间应重试最后一个 ioctl,直到元素的数量稳定为止。内核不会填充任何不具有预期长度的数组。
强制探测连接器
如果 count_modes 字段设置为零且 DRM 客户端是当前的 DRM 主设备,则内核将在连接器上执行强制探测,以刷新连接器状态、模式和 EDID。强制探测可能很慢,可能会导致闪烁,并且 ioctl 将会阻塞。
用户空间需要强制探测连接器,以确保其元数据在启动时和接收到热插拔事件后是最新的。当用户明确请求时,用户空间可以执行强制探测。在其他情况下,用户空间不应执行强制探测。
-
struct drm_mode_property_enum
枚举/位域条目的描述。
定义:
struct drm_mode_property_enum {
__u64 value;
char name[DRM_PROP_NAME_LEN];
};
成员
value
此枚举条目的数值。
name
此枚举条目的符号名称。
描述
有关详细信息,请参阅struct drm_property_enum
。
-
struct drm_mode_get_property
获取属性元数据。
定义:
struct drm_mode_get_property {
__u64 values_ptr;
__u64 enum_blob_ptr;
__u32 prop_id;
__u32 flags;
char name[DRM_PROP_NAME_LEN];
__u32 count_values;
__u32 count_enum_blobs;
};
成员
values_ptr
指向 __u64
数组的指针。
enum_blob_ptr
指向 struct drm_mode_property_enum
数组的指针。
prop_id
应检索的属性的对象 ID。由调用者设置。
flags
DRM_MODE_PROP_*
位域。有关标志的定义,请参阅 drm_property.flags
。
name
符号属性名称。用户空间应使用此字段来识别属性。
count_values
values_ptr 中的元素数量。
count_enum_blobs
enum_blob_ptr 中的元素数量。
描述
用户空间可以执行 GETPROPERTY ioctl 来检索有关属性的信息。同一个属性可能会附加到多个对象,请参阅“模式设置基本对象抽象”。
values_ptr 字段的含义取决于属性类型。有关更多详细信息,请参阅 drm_property.flags
。
当属性的类型为 DRM_MODE_PROP_ENUM
或 DRM_MODE_PROP_BITMASK
时,enum_blob_ptr 和 count_enum_blobs 字段才有意义。为了向后兼容,当属性的类型为 DRM_MODE_PROP_BLOB
时,内核始终会将 count_enum_blobs 设置为零。如果属性的类型不同,用户空间必须忽略这两个字段。
用户空间应至少执行两次此 ioctl 来检索值和枚举:第一次检索元素数量,第二次检索元素本身。
要检索元素数量,请将 count_values 和 count_enum_blobs 设置为零,然后调用 ioctl。count_values 将更新为元素数量。如果属性的类型为 DRM_MODE_PROP_ENUM
或 DRM_MODE_PROP_BITMASK
,count_enum_blobs 也会被更新。
要检索元素本身,请为 values_ptr 分配一个数组,并将 count_values 设置为其容量。如果属性的类型为 DRM_MODE_PROP_ENUM
或 DRM_MODE_PROP_BITMASK
,请为 enum_blob_ptr 分配一个数组,并将 count_enum_blobs 设置为其容量。再次调用 ioctl 将填充数组。
-
struct drm_mode_fb_cmd2
帧缓冲元数据。
定义:
struct drm_mode_fb_cmd2 {
__u32 fb_id;
__u32 width;
__u32 height;
__u32 pixel_format;
__u32 flags;
__u32 handles[4];
__u32 pitches[4];
__u32 offsets[4];
__u64 modifier[4];
};
成员
fb_id
帧缓冲的对象 ID。
width
帧缓冲的宽度。
height
帧缓冲的高度。
pixel_format
FourCC 格式代码,请参阅 drm_fourcc.h
中的 DRM_FORMAT_*
常量。
flags
帧缓冲标志(请参阅 DRM_MODE_FB_INTERLACED
和 DRM_MODE_FB_MODIFIERS
)。
handles
GEM 缓冲区句柄,每个平面一个。如果未使用该平面,则设置为 0。同一句柄可用于多个平面。
pitches
以字节为单位的间距(也称为步幅),每个平面一个。
offsets
以字节为单位的缓冲区偏移量,每个平面一个。
modifier
格式修饰符,每个平面一个。请参阅 drm_fourcc.h
中的 DRM_FORMAT_MOD_*
常量。所有平面必须使用相同的修饰符。除非 flags 中设置了 DRM_MODE_FB_MODIFIERS
,否则将被忽略。
描述
此结构体保存帧缓冲元数据。有两种使用方式:
对于平面格式,此结构体允许最多 4 个缓冲区对象,每个平面都有偏移量和间距。间距和偏移量顺序由 drm_fourcc.h
定义的格式 FourCC 决定,例如 NV12 描述为:
YUV 4:2:0 图像,其中包含一个 8 位 Y 样本的平面,后跟一个包含 8 位 2x2 子采样色差样本的交错 U/V 平面。
因此,它将由 offsets[0]
处的 Y 平面和 offsets[1]
处的 UV 平面组成。
为了适应平铺、压缩等格式,可以指定修饰符。有关更多信息,请参阅“格式修饰符”部分。请注意,即使看起来每个平面都有一个修饰符,但实际上并非如此。每个平面的修饰符必须相同。因此,多平面格式的不同数据布局的所有组合都必须作为单独的修饰符进行枚举。
当未使用时,handles、pitches、offsets 和 modifier 中的所有条目都必须为零。警告,对于 offsets 和 modifier,不能使用零来判断条目是否被使用,因为它是有效值(零偏移量很常见,零修饰符是 DRM_FORMAT_MOD_LINEAR
)。
-
struct drm_plane_size_hint
平面大小提示
定义:
struct drm_plane_size_hint {
__u16 width;
__u16 height;
};
成员
width
平面以像素为单位的宽度
height
平面以像素为单位的高度
描述
平面 SIZE_HINTS 属性 blob 包含一个 struct drm_plane_size_hint
数组。
-
struct hdr_metadata_infoframe
HDR 元数据信息帧数据。
定义:
struct hdr_metadata_infoframe {
__u8 eotf;
__u8 metadata_type;
struct {
__u16 x, y;
} display_primaries[3];
struct {
__u16 x, y;
} white_point;
__u16 max_display_mastering_luminance;
__u16 min_display_mastering_luminance;
__u16 max_cll;
__u16 max_fall;
};
成员
eotf
流中使用的电光传输函数 (EOTF)。
metadata_type
Static_Metadata_Descriptor_ID。
display_primaries
数据的色度基色。这些被编码为 16 位无符号值,单位为 0.00002,其中 0x0000 表示零,0xC350 表示 1.0000。display_primaries.x:色度基色的 X 坐标。display_primaries.y:色度基色的 Y 坐标。
white_point
色彩空间数据的白点。这些被编码为 16 位无符号值,单位为 0.00002,其中 0x0000 表示零,0xC350 表示 1.0000。white_point.x:色度基色的白点 X 坐标。white_point.y:色度基色的白点 Y 坐标。
max_display_mastering_luminance
最大母带显示亮度。此值被编码为 16 位无符号值,单位为 1 cd/m2,其中 0x0001 表示 1 cd/m2,0xFFFF 表示 65535 cd/m2。
min_display_mastering_luminance
最小母带显示亮度。此值被编码为 16 位无符号值,单位为 0.0001 cd/m2,其中 0x0001 表示 0.0001 cd/m2,0xFFFF 表示 6.5535 cd/m2。
max_cll
最大内容光照强度级别。此值被编码为 16 位无符号值,单位为 1 cd/m2,其中 0x0001 表示 1 cd/m2,0xFFFF 表示 65535 cd/m2。
max_fall
最大帧平均光照强度级别。此值被编码为 16 位无符号值,单位为 1 cd/m2,其中 0x0001 表示 1 cd/m2,0xFFFF 表示 65535 cd/m2。
描述
符合 CTA 861.G 规范的 HDR 元数据信息帧。预计与规范完全匹配。
用户空间应根据此结构体中描述的格式传递元数据信息。
-
struct hdr_output_metadata
HDR 输出元数据
定义:
struct hdr_output_metadata {
__u32 metadata_type;
union {
struct hdr_metadata_infoframe hdmi_metadata_type1;
};
};
成员
metadata_type
Static_Metadata_Descriptor_ID。
{unnamed_union}
anonymous
hdmi_metadata_type1
HDR 元数据信息帧。
描述
要从用户空间传递的元数据信息
-
DRM_MODE_PAGE_FLIP_EVENT
DRM_MODE_PAGE_FLIP_EVENT
-
DRM_MODE_PAGE_FLIP_ASYNC
DRM_MODE_PAGE_FLIP_ASYNC
描述
请求尽快执行页面翻转,即不因等待垂直同步而延迟。这可能会导致屏幕上出现撕裂。
与原子 uAPI 一起使用时,如果硬件不支持对此更新执行异步页面翻转,则驱动程序将返回错误。用户空间应处理此情况,例如,通过回退到常规页面翻转。
请注意,某些硬件可能需要执行最后一次同步页面翻转,然后才能切换到异步页面翻转。作为例外,即使第一次页面翻转不是异步的,驱动程序也会返回成功。
-
DRM_MODE_PAGE_FLIP_FLAGS
DRM_MODE_PAGE_FLIP_FLAGS
描述
适用于 drm_mode_crtc_page_flip_target.flags
的标志位掩码。
-
struct drm_mode_create_dumb
创建一个用于扫描输出的 KMS 哑缓冲区。
定义:
struct drm_mode_create_dumb {
__u32 height;
__u32 width;
__u32 bpp;
__u32 flags;
__u32 handle;
__u32 pitch;
__u64 size;
};
成员
height
以像素为单位的缓冲区高度
width
以像素为单位的缓冲区宽度
bpp
每个像素的位数
flags
必须为零
handle
缓冲区对象句柄
pitch
两条连续线之间的字节数
size
整个缓冲区的大小(以字节为单位)
描述
用户空间填充 height、width、bpp 和 flags。如果 IOCTL 成功,则内核填充 handle、pitch 和 size。
-
DRM_MODE_ATOMIC_TEST_ONLY
DRM_MODE_ATOMIC_TEST_ONLY
-
DRM_MODE_ATOMIC_NONBLOCK
DRM_MODE_ATOMIC_NONBLOCK
描述
在应用原子提交时不阻塞。 DRM_IOCTL_MODE_ATOMIC
IOCTL 立即返回,而不是等待硬件应用更改。请注意,驱动程序仍然会检查更新是否可以在返回之前应用。
-
DRM_MODE_ATOMIC_ALLOW_MODESET
DRM_MODE_ATOMIC_ALLOW_MODESET
描述
允许更新在应用过程中导致临时或瞬态可见伪影。应用更新也可能比页面翻转花费更多时间。所有视觉伪影将在更新完成后消失,这通过垂直消隐事件的时间戳发出信号(请参阅结构 drm_event_vblank)。
当 KMS 更新可能导致可见伪影时,必须设置此标志。如果没有此标志,此类 KMS 更新将返回 EINVAL 错误。哪种更新可能导致可见伪影取决于驱动程序和硬件。用户空间需要预先知道更新是否可能导致可见伪影,可以使用 DRM_MODE_ATOMIC_TEST_ONLY
而不使用 DRM_MODE_ATOMIC_ALLOW_MODESET
来查看是否失败。
在驱动程序所知的范围内,当未设置此标志时,保证不会出现视觉伪影。某些接收器可能会显示驱动程序无法控制的视觉伪影。
-
DRM_MODE_ATOMIC_FLAGS
DRM_MODE_ATOMIC_FLAGS
描述
DRM_IOCTL_MODE_ATOMIC
IOCTL 在 drm_mode_atomic.flags
中接受的标志的位字段。
-
struct drm_mode_create_blob
创建新的 blob 属性
定义:
struct drm_mode_create_blob {
__u64 data;
__u32 length;
__u32 blob_id;
};
成员
data
要复制的数据的指针。
length
要复制的数据的长度。
blob_id
返回:新的属性 ID。
描述
创建一个新的“blob”数据属性,从数据指针复制长度字节,并返回新的 blob ID。
-
struct drm_mode_destroy_blob
销毁用户 blob
定义:
struct drm_mode_destroy_blob {
__u32 blob_id;
};
成员
blob_id
要销毁的 blob_id
描述
销毁用户创建的 blob 属性。
用户空间可以在不需要通过其 blob 对象 ID 引用 blob 时立即释放它们。例如,如果您在原子提交中使用 MODE_ID blob,并且您不会进行另一个重用相同 ID 的提交,则可以在发出提交后立即销毁该 blob,而无需等待它完成。
-
struct drm_mode_create_lease
创建租约
定义:
struct drm_mode_create_lease {
__u64 object_ids;
__u32 object_count;
__u32 flags;
__u32 lessee_id;
__u32 fd;
};
成员
object_ids
对象 ID 数组的指针 (__u32)
object_count
对象 ID 的数量
flags
新 FD 的标志 (O_CLOEXEC 等)
lessee_id
返回:承租人的唯一标识符。
fd
返回:新 drm_master 文件的文件描述符
描述
租用模式资源,创建另一个 drm_master。
如果启用了 DRM_CLIENT_CAP_UNIVERSAL_PLANES
,则 object_ids 数组必须至少引用一个 CRTC、一个连接器和一个平面。或者,租约可以完全为空。
-
struct drm_mode_list_lessees
列出租户
定义:
struct drm_mode_list_lessees {
__u32 count_lessees;
__u32 pad;
__u64 lessees_ptr;
};
成员
count_lessees
承租人的数量。
在输入时,提供数组的长度。在输出时,提供总数。不会写回超过输入数字的数字,因此可以使用两次调用来获取大小,然后获取数据。
pad
填充。
lessees_ptr
承租人的指针。
承租人 ID 的 __u64 数组的指针
描述
从 drm_master 列出承租人。
-
struct drm_mode_get_lease
获取租约
定义:
struct drm_mode_get_lease {
__u32 count_objects;
__u32 pad;
__u64 objects_ptr;
};
成员
count_objects
租用对象的数量。
在输入时,提供数组的长度。在输出时,提供总数。不会写回超过输入数字的数字,因此可以使用两次调用来获取大小,然后获取数据。
pad
填充。
objects_ptr
对象的指针。
对象 ID 的 __u32 数组的指针。
描述
获取租用的对象。
-
struct drm_mode_revoke_lease
撤销租约
定义:
struct drm_mode_revoke_lease {
__u32 lessee_id;
};
成员
lessee_id
承租人的唯一 ID
-
struct drm_mode_rect
二维矩形。
定义:
struct drm_mode_rect {
__s32 x1;
__s32 y1;
__s32 x2;
__s32 y2;
};
成员
x1
水平起始坐标(包含)。
y1
垂直起始坐标(包含)。
x2
水平结束坐标(不包含)。
y2
垂直结束坐标(不包含)。
描述
由于 drm 子系统使用 struct drm_rect
来管理矩形区域,因此将其导出到用户空间。
目前由 drm_mode_atomic blob 属性 FB_DAMAGE_CLIPS 使用。
-
struct drm_mode_closefb
定义:
struct drm_mode_closefb {
__u32 fb_id;
__u32 pad;
};
成员
fb_id
帧缓冲 ID。
pad
必须为零。