-
Notifications
You must be signed in to change notification settings - Fork 2
DRM_README
SweerItTer edited this page Feb 1, 2026
·
3 revisions
DRM 模块提供 Linux DRM(Direct Rendering Manager)设备的封装,支持显示管理和硬件加速图层合成。
| 类 | 文档 | 说明 |
|---|---|---|
DeviceController |
DeviceController | DRM 设备控制器 |
DrmLayer |
DrmLayer | DRM 图层(未完成) |
PlanesCompositor |
PlanesCompositor | 图层组合器 |
| 类 | 文档 | 说明 |
|---|---|---|
DrmBpp |
DrmBpp | DRM 格式和BPP(未完成) |
- DRM 设备打开和初始化
- CRTC 和 Connector 查询
- Plane 查询和管理
- 热插拔监控
- 添加和移除图层
- 更新图层属性
- 图层组合
- 原子提交
- 帧缓冲区管理
- Fence 同步
- 模式设置
- 显示控制
// 打开 DRM 设备
auto controller = DeviceController::create("/dev/dri/card0");
if (!controller) {
fprintf(stderr, "Failed to open DRM device\n");
}
// 注册资源回调
controller->registerResourceCallback([](DeviceEvent event, uint32_t id) {
if (event == DeviceEvent::CONNECTOR_CONNECTED) {
printf("Connector %d connected\n", id);
} else if (event == DeviceEvent::CONNECTOR_DISCONNECTED) {
printf("Connector %d disconnected\n", id);
}
});// 查询 CRTC
auto crtcs = controller->getPossibleCrtcs();
for (auto crtc : crtcs) {
printf("CRTC ID: %d\n", crtc.id);
printf(" Possible connectors: %zu\n", crtc.possible_connectors.size());
printf(" Possible planes: %zu\n", crtc.possible_planes.size());
}// 查询 Plane
auto planes = controller->getPossiblePlanes();
for (auto plane : planes) {
printf("Plane ID: %d\n", plane.id);
printf(" Type: %d\n", plane.type);
printf(" Formats: %zu\n", plane.formats.size());
}// 创建帧缓冲区
uint32_t fb_id = controller->createFramebuffer(
dma_fd,
width,
height,
format,
0, // handle
0 // pitch
);
if (fb_id == 0) {
fprintf(stderr, "Failed to create framebuffer\n");
}// 创建组合器
PlanesCompositor compositor(controller);
// 创建图层
auto layer = std::make_unique<DrmLayer>(plane_id);
compositor.addLayer(std::move(layer));
// 更新图层属性
LayerProperties props;
props.crtc_id = crtc_id;
props.fb_id = fb_id;
props.crtc_x = 0;
props.crtc_y = 0;
props.crtc_w = 1920;
props.crtc_h = 1080;
compositor.updateLayer(plane_id, props);
// 提交
compositor.commit();// 获取输入 Fence
int in_fence = rga_get_out_fence();
// 设置输入 Fence
compositor.setInFence(in_fence);
// 设置输出 Fence
int out_fence = -1;
compositor.setOutFence(&out_fence);
// 提交
compositor.commit();
// 等待输出 Fence
wait_for_fence(out_fence);
// 关闭 Fence
close(in_fence);
close(out_fence);DMA-BUF → Plane → CRTC → Connector → 显示器
添加/更新图层 → 创建原子请求 → 添加属性 → 执行提交 → 等待完成
- DeviceController 内部使用互斥锁保护资源访问
- PlanesCompositor 使用 DRM 原子提交机制
- Fence 使用 Linux Fence 机制
- 使用原子提交减少闪烁
- 使用 Fence 同步硬件操作
- 使用 DMA-BUF 实现零拷贝
- 合理使用图层组合
- 检查所有函数的返回值
- 处理设备不支持的情况
- 处理热插拔事件
- 设备权限: 确保有访问 DRM 设备的权限
- 原子提交: 使用原子提交避免闪烁
- Fence 管理: 使用完 Fence 后要关闭
- 热插拔: 处理热插拔事件
- 格式支持: 确保硬件支持对应的格式
- 图层限制: 注意硬件的图层数量限制
- 性能: 合理使用图层组合
- 同步: 使用 Fence 同步硬件操作
- v1.0 - 初始版本,支持基本显示管理
主页
API 文档
DMA 模块
DRM 模块
- DRM 模块总览
- DeviceController - DRM 设备控制器
- DrmLayer - DRM 图层管理
- PlanesCompositor - DRM 平面合成器
- DrmBpp - DRM 格式定义
NET 模块
- NET 模块总览
- TcpServer - TCP 服务器
- SocketConnection - Socket 连接管理
- CommandHandler - 命令处理器
- DataPacket - 数据包
V4L2 模块
- V4L2 模块总览
- CameraController - V4L2 摄像头控制器
- Frame - V4L2 帧数据结构
- FormatTool - V4L2 格式工具
- Exception - V4L2 异常类
V4L2Param 模块
- V4L2Param 模块总览
- ParamControl - 参数控制
- ParamLogger - 参数日志
- ParamProcessor - 参数处理器
RGA 模块
- RGA 模块总览
- RgaConverter - RGA 转换器
- RgaProcessor - RGA 处理器
- FormatTool - RGA 格式工具
MPP 模块
- MPP 模块总览
- EncoderContext - 编码器上下文
- EncoderCore - 编码器核心
- JpegEncoder - JPEG 编码器
- StreamWriter - 流写入器
- MppResourceGuard - MPP 资源守护
- FileTools - 文件工具
- FormatTool - 格式工具
Sys 模块
- Sys 模块总览
- CpuMonitor - CPU 监控器
- MemoryMonitor - 内存监控器
- Base - 基础类
Mouse 模块
- Mouse 模块总览
- Watcher - 鼠标监视器
Utils 模块
- Utils 模块总览
- AsyncThreadPool - 异步线程池
- ConcurrentQueue - 并发队列
- FdWrapper - 文件描述符包装器
- FenceWatcher - 围栏监视器
- FixedSizePool - 固定大小对象池
- Logger - 日志记录器
- ObjectsPool - 对象池
- OrderedQueue - 有序队列
- ProgressBar - 进度条
- SafeQueue - 安全队列
- SharedBufferState - 共享缓冲区状态
- SimpleVariant - 简单变体类型
- ThreadPauser - 线程暂停器
- ThreadUtils - 线程工具
- Types - 类型定义
- UdevMonitor - Udev 监视器