一、简介
在 Linux DRM(Direct Rendering Manager)子系统中,Plane(平面)代表了一个图像源,可以在扫描输出过程中与 CRTC 混合或叠加显示。每个 Plane 从 drm_framebuffer 中获取输入数据,并负责图像的裁剪、缩放、旋转等变换,最终显示在 CRTC 代表的显示区域上。
Plane 分为三种类型:
-
Primary Plane:主平面,通常用于显示主内容,每个 CRTC 必须有一个主平面。
-
Cursor Plane:光标平面,用于显示硬件光标。
-
Overlay Plane:覆盖平面,用于额外的叠加层(如视频播放)。
二、代码分析
1. drm_plane.c
这是 DRM 核心中 Plane 的主要实现文件,包含了 Plane 的创建、初始化、销毁、属性管理等核心功能。
主要函数及作用:
| 函数名 | 作用 |
|---|---|
drm_universal_plane_init |
初始化一个通用 Plane 对象 |
__drm_universal_plane_init |
内部函数,实际执行 Plane 初始化 |
drmm_universal_plane_alloc |
分配并初始化一个受 DRM 管理的 Plane |
drm_plane_cleanup |
清理 Plane 资源,不释放结构体本身 |
drm_plane_force_disable |
强制禁用 Plane(非原子模式) |
drm_mode_setplane |
处理 DRM_IOCTL_MODE_SETPLANE ioctl |
drm_mode_cursor_ioctl |
处理光标设置 ioctl |
drm_mode_page_flip_ioctl |
处理页面翻转 ioctl |
drm_plane_enable_fb_damage_clips |
启用 Framebuffer 损伤区域属性 |
drm_plane_create_scaling_filter_property |
创建缩放滤波器属性 |
2. drm_plane_helper.c
这个文件提供了一些过渡性的辅助函数,主要用于传统(非原子)模式下的 Plane 操作,帮助驱动逐步迁移到原子模式。
主要函数及作用:
| 函数名 | 作用 |
|---|---|
drm_primary_helper_update |
用于主 Plane 的更新操作(传统模式) |
drm_primary_helper_disable |
用于主 Plane 的禁用操作(传统模式) |
drm_primary_helper_destroy |
用于主 Plane 的销毁操作 |
drm_plane_helper_check_update |
检查 Plane 更新参数是否有效 |
drm_universal_plane_init()
-> __drm_universal_plane_init()
-> drm_mode_object_add()
-> create_in_format_blob()
-> drm_object_attach_property() [多次]
drm_mode_setplane()
-> drm_plane_find()
-> drm_framebuffer_lookup()
-> setplane_internal()
-> __setplane_internal() 或 __setplane_atomic()
drm_mode_cursor_ioctl()
-> drm_mode_cursor_common()
-> drm_mode_cursor_universal()
-> __setplane_internal() 或 __setplane_atomic()
drm_mode_page_flip_ioctl()
-> drm_crtc_find()
-> drm_framebuffer_lookup()
-> crtc->funcs->page_flip() 或 crtc->funcs->page_flip_target()
drm_primary_helper_update()
-> drm_plane_helper_check_update()
-> crtc->funcs->set_config()
drm_primary_helper_disable()
-> 返回 -EINVAL(表示需驱动自己实现)
drm_primary_helper_destroy()
-> drm_plane_cleanup()
-> kfree(plane)
-
drm_plane.c是 Plane 的核心实现,包含生命周期管理、属性控制、IOCTL 处理等。 -
drm_plane_helper.c提供传统模式下的辅助函数,主要用于过渡期。 -
现代 DRM 驱动应优先使用原子模式,逐步弃用传统辅助函数。
-
Plane 的类型、格式、修饰符、损伤区域、缩放滤波等属性都由这些函数管理。
drm_plane_helper.c 和 drm_plane.c 代码分析
这两个文件是 Linux 内核 DRM (Direct Rendering Manager) 子系统中与平面 (Plane) 管理相关的核心组件。平面是 DRM KMS (Kernel Mode Setting) 框架中的关键抽象,用于表示图像源,可以在扫描输出过程中与 CRTC (Cathode Ray Tube Controller) 混合或叠加。它们与 GPU 的显示硬件密切相关,支持裁剪、缩放、旋转和 Z 位置等属性。
- drm_plane_helper.c:这是一个辅助库文件,提供主平面 (Primary Plane) 的实现支持,以及从遗留接口向原子 (Atomic) 接口的过渡函数。文件强调驱动应逐步迁移到原子接口,而这些辅助函数是过渡性的。它处理主平面的更新、禁用和销毁,并与 CRTC 和连接器交互。版权从 2014 年 Intel 开始,主要用于简化驱动开发,但注释警告新驱动不应依赖这些过渡性辅助。
- drm_plane.c:这是平面管理的核心文件,实现平面的初始化、属性管理、损伤跟踪 (Damage Tracking) 和用户空间接口 (如 ioctl)。它定义了平面的类型 (主平面、覆盖平面、游标平面),支持修改器 (Modifiers) 和原子模式设置。文件处理平面与帧缓冲区 (Framebuffer) 的关联、标准属性 (如 IN_FORMATS、type) 和遗留 ioctl(如光标和页面翻转)。版权从 2016 年 Intel 开始,强调驱动必须为所有平面设置修改器支持。
这些文件紧密协作:drm_plane_helper.c 依赖 drm_plane.c 中的平面结构和函数(如 drm_plane_cleanup),而 drm_plane.c 提供更底层的平面管理。它们与 GPU 相关,因为平面操作直接映射到 GPU 的硬件平面(如 Intel 的 Universal Planes 或 AMD 的 Overlay),涉及缓冲区格式、修改器和原子更新。
关键函数分析
以下列出两个文件中需要注意和熟悉的关键函数。这些函数是导出的(EXPORT_SYMBOL),常用于驱动实现钩子、初始化或用户空间交互。重点关注:
- 初始化和清理函数:用于设置平面对象。
- 更新和检查函数:处理平面状态变化,与原子模式设置相关。
- 属性管理函数:暴露给用户空间的属性,如损伤剪辑或缩放过滤。
- ioctl 和遗留支持:处理用户空间请求,如光标移动或页面翻转。

- KMS drm_plane.c&spm=1001.2101.3001.5002&articleId=150578009&d=1&t=3&u=d52728368b71436ba67ba1c0154e639d)
2648

被折叠的 条评论
为什么被折叠?



