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函数的详细解析,放到下一篇文章中。
相关文章:
DRM全解析 —— ADD_FB(2)
接前一篇文章:DRM全解析 —— ADD_FB(1) 本文参考以下博文: DRM驱动(四)之ADD_FB 特此致谢! 上一回围绕libdrm与DRM在Linux内核中的接口: DRM_IOCTL_DEF(DRM_IOCTL_MODE_ADDFB, d…...
windows下docker compose方式挂载数据卷volume遇到的问题
例子一,windows 下docker desk top部署TDengine td-compose.yml version: 3 services:tdengine1:image: tdengine/tdengine:latestcontainer_name: tdengine1hostname: tdengine1ports:- 6030:6030- 6041:6041- 6043-6049:6043-6049- 6043-6049:6043-6049/udpresta…...
TCP三次握手四次挥手总结
目录 一、两种传输模式: 二、数据方向: 三、端口的作用: 四、端口类型: 五、三次握手: 六、四次断开 常见面试题 TCP(Transfer control protocol)传输控制协议 一、两种传输模式&#x…...
【0901作业】QTday3 对话框、发布软件、事件处理机制,使用文件相关操作完成记事本的保存功能、处理键盘事件完成圆形的移动
目录 一、思维导图 二、作业 2.1 使用文件相关操作完成记事本的保存功能 2.2 处理键盘事件完成圆形的移动 一、思维导图 二、作业 2.1 使用文件相关操作完成记事本的保存功能 void Widget::on_saveBtn_clicked() {QString filename QFileDialog::getSaveFileName(this,&…...
mysql数据库运行sql:datetime(0) NULL DEFAULT NULL报错【杭州多测师_王sir】
一、错误信息 CREATE TABLE file (id varchar(32) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL COMMENT 文件md5,name varchar(128) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL,create_time datetime(0) NULL DEFAULT NULL,update_time date…...
手撕二叉平衡树
今天给大家带来的是平衡树的代码实现,如下: #pragma once #include <iostream> #include <map> #include <set> #include <assert.h> #include <math.h> using namespace std; namespace cc {template<class K, clas…...
超图嵌入论文阅读1:对偶机制非均匀超网络嵌入
超图嵌入论文阅读1:对偶机制非均匀超网络嵌入 原文:Nonuniform Hyper-Network Embedding with Dual Mechanism ——TOIS(一区 CCF-A) 背景 超边:每条边可以连接不确定数量的顶点 我们关注超网络的两个属性࿱…...
Qt xml解析之QXmlStreamReader
文章目录 背景QXmlStreamReader简单介绍使用QXmlStreamReader添加头文件<QXmlStreamReader>toString()toInt()完整代码 背景 项目中遇到需要解析某个方法返回的xml字符串,奈何C/C中没有原生的方法可供调用,只能使用第三方库,搜了一圈资…...
Selenium基础 — CSS选择器定位大全
1、css属性定位 css选择器策略示例说明#id#telA选择id"telA"的所有元素。.class.telA选择 class"telA”的所有元素。[属性名属性值][nametelA]除了id和class属性,其他属性的定位格式[attribute][target]选择带有target 属性所有元素。**选择所有元素…...
vue3中keep-alive的使用及结合transition使用
正确用法 在组件中使用(这里结合了 transition 内置动画组件 ) <template><div class"layout clearfix"><router-view v-slot"{ Component, route }"><transition name"fade-transform" mode"…...
【提示工程】询问GPT返回Json结构数据
theme: orange 众所周知,我们可以通过构建的Prompt获取期望的内容,但是通常都是以自然语言返回的,假如我们想得到结构化的数据,比如Json,XML那么怎么办,这篇文章给你一个思路。 理所当然的想法 要实现询问大…...
CSS水平垂直居中方案
1 前言 水平居中、垂直居中是前端面试百问不厌的问题。其实现方案也是多种多样,常叫人头昏眼花。 水平方向可以认为是内联方向,垂直方向认为是块级方向。 2 内联元素的水平垂直居中 首先,常见内联元素有:a、span、em、b、stro…...
SpringBoot入门篇3 - 整合junit、整合mybatis、基于SpringBoot实现ssm整合
目录 1.整合JUnit Spring整合JUnit SpringBoot整合JUnit 测试类注解:SpringBootTest 作用:设置JUnit加载的SpringBoot启动类 2.整合mybatis ①使用spring initializr初始化项目的时候,添加依赖。 ②设置数据源application.yml spring:d…...
C#,《小白学程序》第七课:列表(List)应用之一“编制高铁车次信息表”
1 文本格式 /// <summary> /// 车站信息类 class /// </summary> public class Station { /// <summary> /// 编号 /// </summary> public int Id { get; set; } 0; /// <summary> /// 车站名 /// </summary>…...
周报/月报 Prompt
前言 用 AI 写好一份周报或月报。 文章目录 前言一、目的二、Prompt 设计原则三、模板 一、目的 简单的日程,扩写成一篇高质量的周报; 二、Prompt 设计原则 角色 目标 背景 要求 三、模板 内容生成模板 你是我的周报助手,根据我的工作…...
c++ 学习 之 构造函数的分类和调用类型 深入学习
正文 构造函数是在C中用于创建和初始化对象的特殊函数。构造函数可以根据不同的特性和参数进行分类,以下是一些常见的构造函数分类和详细讲解它们的调用方式: 默认构造函数: 默认构造函数是一个特殊的构造函数,它没有参数&#x…...
Royal TSX 6 Mac多协议远程软件
Royal TSX是一款功能强大的远程桌面管理软件,适用于Mac操作系统。它允许用户通过一个集成的界面来管理和访问多个远程计算机和服务器。 Royal TSX支持多种远程协议,包括RDP、VNC、SSH、Telnet和FTP等,可以方便地连接到Windows、Linux、Mac和其…...
远程管理通道安全SSH协议主机验证过程
可以使用SSH协议进行远程管理通道安全保护,其中涉及的主要安全功能包括主机验证、数据加密性和数据完整性保护。 这里要注意的是【主机验证】和【身份验证】的区别,主机验证是客户端确认所访问的服务端是目标访问对象,比如从从客户端A(192.16…...
.NET 操作 TDengine .NET ORM
TDengine 是国内比较流的时序库之一,支持群集并且免费,在.NET中资料比较少,这篇文章主要介绍SqlSugar ORM来操作TDengine 优点: 1、SqlSugar支持ADO.NET操作来实现TDengine,并且支持了常用的时间函数、支持联表、分…...
SQL Server对象类型(3)——视图(View)
1. 视图概念 与Oracle中的视图类似,SQL Server中的视图也是一种虚的、通过一个查询定义的逻辑对象,主要用于集中、简化、定制用户需求,控住其底层表安全,以及应用系统提供向后兼容等方面。 --注: 1)上述内容中的“虚的”,表示视图本身并不实际包含和存储数据,SQL Ser…...
关于fiddler报错“The system proxy was changed. click to reenable capturing”的解决办法
背景:第一次下载安装fiddler,安装过程没有任何问题,但启动即报错 参考了很多帖子,一个一个排查后,发现是sslvpn的问题(因为访问校园网需要安装了 EasyConnect 深信服SSLVPN客户端),把…...
华南x79-8d 支持 E5-2680 V3 或者 E5-2680 V4吗
不支持。 华南金牌 X79-8D 主板仅支持 E5-2600系列V1和V2版本的处理器,无法兼容您提到的 E5-2680 V3 或 V4。以下是关于该主板CPU支持情况的详细说明:💡 为什么不支持 V3/V4?根本原因在于CPU的接口和主板芯片组不匹配:…...
LLMUnity:大模型原生嵌入Unity的实时3D认知架构
1. 这不是“把大模型塞进Unity”,而是重新定义3D交互的起点很多人第一次听说“LLMUnity”时,下意识反应是:“哦,又一个把ChatGPT API调进Unity的Demo?”——这恰恰踩进了最典型的认知陷阱。LLMUnity不是在Unity里开个H…...
智能自动化黑苹果配置:OpCore-Simplify全面解析
智能自动化黑苹果配置:OpCore-Simplify全面解析 【免费下载链接】OpCore-Simplify A tool designed to simplify the creation of OpenCore EFI 项目地址: https://gitcode.com/GitHub_Trending/op/OpCore-Simplify OpCore-Simplify是一款革命性的黑苹果配置…...
Splunk紧急推送安全补丁:三枚高危漏洞同时曝光,企业数据面临泄露与瘫痪双重风险
2026年5月20日,Splunk官方安全团队一次性披露了旗下多款核心产品的重大安全隐患。此次波及范围相当广泛,从本地部署的Splunk Enterprise到云端服务Splunk Cloud Platform,再到新推出的Splunk AI Toolkit,无一幸免。三枚漏洞编号分…...
HTTPS明文调试实战:SSLKEYLOGFILE原理与浏览器配置指南
1. 为什么你抓不到HTTPS的明文——不是Wireshark不行,是浏览器在“加密保护”你很多人第一次尝试用Wireshark分析网页请求时,都会卡在一个看似简单却令人抓狂的问题上:HTTP流量清清楚楚,每个GET/POST、Header、Body都一览无余&…...
免费AI搜索工具推荐2026,92%用户不知道的3个隐藏权限设置——关闭行为追踪、锁定模型版本、强制HTTPS直连
更多请点击: https://kaifayun.com 第一章:免费AI搜索工具推荐2026 2026年,开源与社区驱动的AI搜索工具生态迎来爆发式增长。得益于大语言模型轻量化部署、RAG(检索增强生成)架构普及,以及WebAssembly对客…...
如何在C加加项目中快速接入Taotoken的多模型API服务
🚀 告别海外账号与网络限制!稳定直连全球优质大模型,限时半价接入中。 👉 点击领取海量免费额度 如何在C项目中快速接入Taotoken的多模型API服务 对于使用C进行开发的工程师而言,直接调用HTTP API是集成第三方服务最灵…...
Wireshark深度解析TLS 1.3与HTTP/2隐性故障pcap样本
1. 这不是一份普通pcap,而是一份“网络故障诊断教科书级样本”你有没有遇到过这样的情况:客户发来一个几十MB的pcap文件,标题叫“系统登录超时”,你打开Wireshark,密密麻麻全是TCP重传、RST包、DNS超时,但翻…...
linux基础命令有哪些? linux基础命令使用方法
本期介绍linux基础命令的使用1、用who命令显示当前Linux系统的用户名2、使用下列命令显示有关计算机系统信息:uname(显示操作系统的名称),uname –n(显示系统域名),uname –p(显示CPU 的名称)3、使用passwd命令修改用whoami命令找到的用户名和…...
