libdrm 和 libgbm
libdrm
和 libgbm
是密切相关但功能侧重点不同的两个库,它们常常配合使用于 GPU 显存管理、EGL 图形渲染以及硬件加速管线中,尤其是在 Wayland、OpenGL ES、VAAPI 等图形栈中。下面从结构、功能、作用关系等角度为你详解。
🔧 一、基本定义与定位
项目 | libdrm | libgbm |
---|---|---|
名称 | Direct Rendering Manager 用户空间库 | Generic Buffer Management 通用缓冲管理库 |
所属层级 | 低层(硬件封装接口) | 高层(缓冲抽象封装) |
主要用途 | 提供对 DRM 内核接口的访问,如 GEM buffer 等 | 为 EGL/OpenGL ES 提供平台无关的 buffer 接口 |
常见场景 | DRM buffer 分配与管理 | 分配 render target buffer,创建 EGLSurface |
所依赖的库 | 内核 DRM 接口 | 依赖 libdrm (内部通过它分配 buffer) |
🔗 二、二者关系:libgbm 是基于 libdrm 的封装层
可以这样理解:
✅
libgbm
是构建在libdrm
基础上的高级 buffer 管理接口,专为与 EGL/OpenGL 渲染系统配合而设计。
➕ libgbm 封装了:
- buffer 创建(调用
libdrm
) - format 指定(如
GBM_FORMAT_XRGB8888
,GBM_BO_USE_RENDERING
) - dma-buf 导出(用于零拷贝给视频编解码器)
- 和 EGL 的整合(EGLImage、EGLSurface)
🔄 三、常见调用链与结构图
应用程序↓
libgbm↓ 调用
libdrm↓
DRM/KMS 驱动↓
GPU 显存管理
示例流程:
gbm_create_device(fd)
← 传入 DRM 设备文件(如/dev/dri/card0
)gbm_bo_create()
← 创建 GPU buffergbm_bo_get_fd()
← 导出为 dma-buf fd,用于 VAAPI 编码或其他设备共享
🎯 四、使用场景对比
场景 | 使用 libdrm | 使用 libgbm |
---|---|---|
OpenGL 渲染到屏幕 | ✅(分配 framebuffer) | ✅(创建 buffer 绑定到 EGLSurface) |
Wayland buffer 提交 | ✅(支持 dma-buf 导出) | ✅(更方便创建 EGLImage) |
VAAPI 编码硬件加速 | ✅(显存作为输入) | ✅(创建 buffer 并传出 dma-buf) |
原始 GEM buffer 操作 | ✅(可更灵活控制) | ❌(不暴露底层 handle) |
应用于 Mesa EGL/KWin/weston | ⛔️ 直接调用较繁琐 | ✅(为 Mesa 平台抽象标准接口) |
🧪 五、简单代码对比
🔧 使用 libdrm
:
drm_fd = open("/dev/dri/card0", O_RDWR);
struct drm_mode_create_dumb create = { width, height, bpp };
ioctl(drm_fd, DRM_IOCTL_MODE_CREATE_DUMB, &create);
✨ 使用 libgbm
(封装更高层):
int drm_fd = open("/dev/dri/card0", O_RDWR);
struct gbm_device* dev = gbm_create_device(drm_fd);
struct gbm_bo* bo = gbm_bo_create(dev, width, height,GBM_FORMAT_XRGB8888, GBM_BO_USE_RENDERING);
int dma_buf_fd = gbm_bo_get_fd(bo); // 输出为 dma-buf
🧠 总结:libdrm vs libgbm
项目 | libdrm | libgbm |
---|---|---|
级别 | 底层库 | 高层封装库 |
依赖关系 | 不依赖 libgbm | ✅ 依赖 libdrm |
接口粒度 | 粗、灵活 | 抽象、简洁,易与 EGL/Wayland 接轨 |
是否支持 dma-buf | ✅ 支持 GEM 导出为 dma-buf | ✅ 更方便地导出 dma-buf |
用于图形栈位置 | DRM/KMS 原始操作层 | OpenGL、EGL 中 GBM 平台适配层 |
🧰 附:常见应用中两者配合使用
应用 / 框架 | 使用 libdrm | 使用 libgbm |
---|---|---|
Wayland Compositor(如 Weston) | ✅ | ✅ |
Mesa EGL Platform | ⛔️ | ✅ |
GStreamer + OpenGL sink | ✅(硬件 buffer 传输) | ✅ |
自定义 DRM framebuffer 显示程序 | ✅ | 可选 |
如果你需要我写一段完整的 libgbm
+ EGL
+ libdrm
示例代码(如创建一个 dma-buf buffer 并传给 VAAPI 或 Wayland),我可以帮你生成。是否继续?