当前位置: 首页 > news >正文

libdrm 和 libgbm

libdrmlibgbm 是密切相关但功能侧重点不同的两个库,它们常常配合使用于 GPU 显存管理、EGL 图形渲染以及硬件加速管线中,尤其是在 Wayland、OpenGL ES、VAAPI 等图形栈中。下面从结构、功能、作用关系等角度为你详解。


🔧 一、基本定义与定位

项目libdrmlibgbm
名称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 显存管理

示例流程:

  1. gbm_create_device(fd) ← 传入 DRM 设备文件(如 /dev/dri/card0
  2. gbm_bo_create() ← 创建 GPU buffer
  3. gbm_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

项目libdrmlibgbm
级别底层库高层封装库
依赖关系不依赖 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),我可以帮你生成。是否继续?

http://www.dtcms.com/a/333679.html

相关文章:

  • 零基础从头教学Linux(Day 13)
  • 13_集合框架
  • ScanNet项目介绍
  • Linux网络配置:聚合链路与网桥实战
  • 开疆智能ModbusTCP转Ethernet网关连接FBOX串口服务器配置案例
  • MySQL多表查询案例
  • 360 集团20周年会:战略升级ALL IN Agent,抢占智能体时代先机
  • OSCP - Proving Grounds - CVE-2024-25180
  • 基于WSL搭建Ubuntu 22.04.x LTS开发环境
  • LLM - 使用 SGLang 部署 Qwen3-32B 与 Qwen2.5-VL-32B-Instruct
  • 《GUI-Actor: Coordinate-Free Visual Grounding for GUI Agents》论文精读笔记
  • 今日分享:C++模板(全详解)
  • 大数据系列之:设置CMS垃圾收集器
  • std::set_symmetric_difference
  • 第七十三章:AI的“黑箱”迷局:推理链路中的断点与Tensor调试——让模型“交代一切”!
  • CCS双轴相位偏移光源 让浅凹痕无处遁形
  • 【Redis】超详细基础入门学习
  • 硬件开发_基于STM32单片机的热水壶系统
  • GitHub的使用教程
  • Upload 上传 vue2前端 + 后端
  • 【DDIA】第二部分:分布式数据
  • 【大模型微调系列-02】 深度学习与大模型初识
  • Java Lambda表达式是什么,怎么用
  • C语言笔记6:C高级 part1
  • Go从入门到精通系列学习路线规划
  • 区块链技术原理(13)-以太坊燃料费Gas
  • ITM(仪器跟踪宏单元)是什么?
  • Elasticsearch赋能规章制度智能检索:从海量文档到秒级响应
  • PyInstaller打包Python应用操作备忘
  • 学习嵌入式之硬件——I2C