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…...
终极指南:如何深度调试AMD Ryzen处理器实现性能最大化
终极指南:如何深度调试AMD Ryzen处理器实现性能最大化 【免费下载链接】SMUDebugTool A dedicated tool to help write/read various parameters of Ryzen-based systems, such as manual overclock, SMU, PCI, CPUID, MSR and Power Table. 项目地址: https://gi…...
独家:华为黄大年143期硬件难题:无现场实验条件,仅提供务实思路建议
华为黄大年143期硬件难题:无现场实验条件,仅提供务实思路建议 作者:华夏之光永存(杨建宾) 华为黄大年难题揭榜143期里面有多道偏向材料、声学、结构、仿真类的硬件工程题目。这类题目高度依赖现场实验条件、样品测试、…...
5个硬核功能的惠普游戏本性能控制工具:OmenSuperHub完全指南
5个硬核功能的惠普游戏本性能控制工具:OmenSuperHub完全指南 【免费下载链接】OmenSuperHub 使用 WMI BIOS控制性能和风扇速度,自动解除DB功耗限制。 项目地址: https://gitcode.com/gh_mirrors/om/OmenSuperHub 你是否曾因官方游戏控制软件的臃肿…...
Cyber Engine Tweaks:解锁《赛博朋克2077》终极自定义体验的3个关键维度
Cyber Engine Tweaks:解锁《赛博朋克2077》终极自定义体验的3个关键维度 【免费下载链接】CyberEngineTweaks Cyberpunk 2077 tweaks, hacks and scripting framework 项目地址: https://gitcode.com/gh_mirrors/cy/CyberEngineTweaks Cyber Engine Tweaks&a…...
ComfyUI-Manager:一站式AI绘画插件智能管理平台
ComfyUI-Manager:一站式AI绘画插件智能管理平台 【免费下载链接】ComfyUI-Manager ComfyUI-Manager is an extension designed to enhance the usability of ComfyUI. It offers management functions to install, remove, disable, and enable various custom node…...
RefluxJS入门指南:构建React应用的终极单向数据流解决方案
RefluxJS入门指南:构建React应用的终极单向数据流解决方案 【免费下载链接】refluxjs A simple library for uni-directional dataflow application architecture with React extensions inspired by Flux 项目地址: https://gitcode.com/gh_mirrors/re/refluxjs …...
Phi-4-mini-reasoningGPU算力适配:A10/A100/T4多卡环境下的推理吞吐调优
Phi-4-mini-reasoning GPU算力适配:A10/A100/T4多卡环境下的推理吞吐调优 1. 模型特性与部署概述 Phi-4-mini-reasoning 是一款专注于推理任务的文本生成模型,特别擅长处理数学题、逻辑题等需要多步分析和简洁结论输出的场景。与通用聊天模型不同&…...
远程工作事故树:一次误删库引发的跨国追责
远程协作下的“脆弱”系统深夜,伦敦办公室的数据库工程师在连续工作十二小时后,敲下了一条他以为指向“测试环境”的删除命令。与此同时,上海的测试团队正在为次日的上线进行最后一轮回归验证。六小时后,当阳光照进浦东的办公室&a…...
编译期AI推理成为可能?C++27 constexpr增强深度解析,含Clang 19/MSVC 17.10实测基准数据,立即升级避坑指南
第一章:C27 constexpr函数增强的演进脉络与核心动机C27 对 constexpr 函数的扩展并非孤立演进,而是对自 C11 引入 constexpr、经 C14 放宽语义、C17 支持 if/switch 和局部变量、C20 引入 constexpr new/allocator 与虚拟函数等关键里程碑的系统性收敛与…...
25岁后为什么老得快?你的细胞在偷偷减少
有没有发现一个扎心的事实:25岁像是一道隐形的分水岭,把青春和初老狠狠隔开。20岁的时候,通宵打游戏、追剧、赶ddl,第二天睡半天就能满血复活,脸上看不到一丝疲惫,皮肤透着原生态的光泽,哪怕偶尔…...
