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

DRM全解析 —— ADD_FB(2)

接前一篇文章:DRM全解析 —— ADD_FB(1)

本文参考以下博文:

DRM驱动(四)之ADD_FB

特此致谢!

上一回围绕libdrm与DRM在Linux内核中的接口:

DRM_IOCTL_DEF(DRM_IOCTL_MODE_ADDFB, drm_mode_addfb_ioctl, 0),

进行了相关宏的展开。本文开始对于drm_mode_addfb_ioctl函数进行详解。drm_mode_addfb_ioctl函数在drivers/gpu/drm/drm_framebuffer.c中,代码如下:

int drm_mode_addfb_ioctl(struct drm_device *dev,void *data, struct drm_file *file_priv)
{return drm_mode_addfb(dev, data, file_priv);
}

drm_mode_addfb_ioctl函数只是一层简单封装,实际的工作交给了drm_mode_addfb_ioctl函数。它就在上边,代码如下:

/*** drm_mode_addfb - add an FB to the graphics configuration* @dev: drm device for the ioctl* @or: pointer to request structure* @file_priv: drm file** Add a new FB to the specified CRTC, given a user request. This is the* original addfb ioctl which only supported RGB formats.** Called by the user via ioctl, or by an in-kernel client.** Returns:* Zero on success, negative errno on failure.*/
int drm_mode_addfb(struct drm_device *dev, struct drm_mode_fb_cmd *or,struct drm_file *file_priv)
{struct drm_mode_fb_cmd2 r = {};int ret;if (!drm_core_check_feature(dev, DRIVER_MODESET))return -EOPNOTSUPP;r.pixel_format = drm_driver_legacy_fb_format(dev, or->bpp, or->depth);if (r.pixel_format == DRM_FORMAT_INVALID) {drm_dbg_kms(dev, "bad {bpp:%d, depth:%d}\n", or->bpp, or->depth);return -EINVAL;}/* convert to new format and call new ioctl */r.fb_id = or->fb_id;r.width = or->width;r.height = or->height;r.pitches[0] = or->pitch;r.handles[0] = or->handle;ret = drm_mode_addfb2(dev, &r, file_priv);if (ret)return ret;or->fb_id = r.fb_id;return 0;
}

在讲解此函数之前,先来看一下用户空间一般流程中调用此步骤(ioctl系统调用)的上下文:

    struct drm_mode_create_dumb create = {};uint32_t fb_id;create.width = width;create.height = height;create.bpp = 32;drmIoctl(fd, DRM_IOCTL_MODE_CREATE_DUMB, &create);	//创建显存,返回一个handledrmModeAddFB(fd, create.width, create.height, 24, 32, create.pitch,create.handle, &fb_id); 

在libdrm全解析系列文章以及DRM全解析 —— CREATE_DUMB系列文章中讲过,在用户空间中通过

drmIoctl(fd, DRM_IOCTL_MODE_CREATE_DUMB, &create)

最终在内核中在不同的显卡驱动相对应的函数中创建了一个dumb buffer对象(实际上是分配了struct drm_gem_object *gobj),返回的是与分配的struct drm_gem_object *gobj绑定的handle。

drm_gem_object创建之后需要与一块drm_framebuffer进行绑定使用,因为最终刷图使用的是fb。因此,使用下面接口创建drm_framebuffer并与之前创建的struct drm_gem_object *gobj进行绑定。

围绕DRM_IOCTL_MODE_ADDFB宏的用户态和内核态上下调用流程,如下图所示:

对于drm_mode_addfb函数的详细解析,放到下一篇文章中。

http://www.lryc.cn/news/151700.html

相关文章:

  • windows下docker compose方式挂载数据卷volume遇到的问题
  • TCP三次握手四次挥手总结
  • 【0901作业】QTday3 对话框、发布软件、事件处理机制,使用文件相关操作完成记事本的保存功能、处理键盘事件完成圆形的移动
  • mysql数据库运行sql:datetime(0) NULL DEFAULT NULL报错【杭州多测师_王sir】
  • 手撕二叉平衡树
  • 超图嵌入论文阅读1:对偶机制非均匀超网络嵌入
  • Qt xml解析之QXmlStreamReader
  • Selenium基础 — CSS选择器定位大全
  • vue3中keep-alive的使用及结合transition使用
  • 【提示工程】询问GPT返回Json结构数据
  • CSS水平垂直居中方案
  • SpringBoot入门篇3 - 整合junit、整合mybatis、基于SpringBoot实现ssm整合
  • C#,《小白学程序》第七课:列表(List)应用之一“编制高铁车次信息表”
  • 周报/月报 Prompt
  • c++ 学习 之 构造函数的分类和调用类型 深入学习
  • Royal TSX 6 Mac多协议远程软件
  • 远程管理通道安全SSH协议主机验证过程
  • .NET 操作 TDengine .NET ORM
  • SQL Server对象类型(3)——视图(View)
  • 【LeetCode】剑指 Offer <二刷>(1)
  • MySQL事物和存储引擎
  • 代码随想录算法训练营Day51 | 309. 最佳买卖股票时机含冷冻期 | 714. 买卖股票的最佳时机含手续费 | 股票总结
  • C#,《小白学程序》第八课:列表(List)应用之二“编制高铁列车时刻表”
  • 2、QT的信号与槽
  • Java代码审计15之Apache log4j2漏洞
  • c语言每日一练(13)
  • H5 + C3基础(六)(2D转换transform 位移 旋转 缩放)
  • 2023最新 Electron.js 桌面应用开发教程(基础篇)更新中
  • 【ES】笔记-Set集合实践
  • 缺陷或负样本难以收集怎么办?使用生成式模型自动生成训练样本,image-to-image Stable diffusion