DRM全解析 —— CREATE_DUMB(2)

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

本文参考以下博文:

DRM驱动(三)之CREATE_DUMB

特此致谢!

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

DRM_IOCTL_DEF(DRM_IOCTL_MODE_CREATE_DUMB, drm_mode_create_dumb_ioctl, 0),

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

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

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

/*** DOC: overview** The KMS API doesn't standardize backing storage object creation and leaves it* to driver-specific ioctls. Furthermore actually creating a buffer object even* for GEM-based drivers is done through a driver-specific ioctl - GEM only has* a common userspace interface for sharing and destroying objects. While not an* issue for full-fledged graphics stacks that include device-specific userspace* components (in libdrm for instance), this limit makes DRM-based early boot* graphics unnecessarily complex.** Dumb objects partly alleviate the problem by providing a standard API to* create dumb buffers suitable for scanout, which can then be used to create* KMS frame buffers.** To support dumb objects drivers must implement the &drm_driver.dumb_create* and &drm_driver.dumb_map_offset operations (the latter defaults to* drm_gem_dumb_map_offset() if not set). Drivers that don't use GEM handles* additionally need to implement the &drm_driver.dumb_destroy operation. See* the callbacks for further details.** Note that dumb objects may not be used for gpu acceleration, as has been* attempted on some ARM embedded platforms. Such drivers really must have* a hardware-specific ioctl to allocate suitable buffer objects.*/int drm_mode_create_dumb(struct drm_device *dev,struct drm_mode_create_dumb *args,struct drm_file *file_priv)
{u32 cpp, stride, size;if (!dev->driver->dumb_create)return -ENOSYS;if (!args->width || !args->height || !args->bpp)return -EINVAL;/* overflow checks for 32bit size calculations */if (args->bpp > U32_MAX - 8)return -EINVAL;cpp = DIV_ROUND_UP(args->bpp, 8);if (cpp > U32_MAX / args->width)return -EINVAL;stride = cpp * args->width;if (args->height > U32_MAX / stride)return -EINVAL;/* test for wrap-around */size = args->height * stride;if (PAGE_ALIGN(size) == 0)return -EINVAL;/** handle, pitch and size are output parameters. Zero them out to* prevent drivers from accidentally using uninitialized data. Since* not all existing userspace is clearing these fields properly we* cannot reject IOCTL with garbage in them.*/args->handle = 0;args->pitch = 0;args->size = 0;return dev->driver->dumb_create(file_priv, dev, args);
}

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

    create.width = width;create.height = height;create.bpp = 32;drmIoctl(fd, DRM_IOCTL_MODE_CREATE_DUMB, &create);	//创建显存,返回一个handle

在libdrm全解析系列文章中讲过,在用户空间中通过

drmIoctl(fd, DRM_IOCTL_MODE_CREATE_DUMB, &create)

可以为显示创建buff。创建显示buf需要三个参数:

  • width:图像宽度。
  • height:图像高度。
  • bpp:每个像素所占位(bit)数。

设置好以上参数后,将其放入数据结构struct drm_mode_create_dumb create中,并作为参数调用drmIoctl(fd, DRM_IOCTL_MODE_CREATE_DUMB, &create)传递给内核。内核根据请求创建显示buff后返回对应的handle赋值给handle、pitch、size给用户使用。

为了便于理解,再次贴出struct drm_mode_create_dumb的定义,在/usr/include/drm/drm_mode.h中,代码如下:

/* create a dumb scanout buffer */
struct drm_mode_create_dumb {__u32 height;__u32 width;__u32 bpp;__u32 flags;/* handle, pitch, size will be returned */__u32 handle;__u32 pitch;__u64 size;
};

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/61067.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

C++ list模拟实现

list模拟实现代码&#xff1a; namespace djx {template<class T>struct list_node{T _data;list_node<T>* _prev;list_node<T>* _next;list_node(const T& x T()):_data(x),_prev(nullptr),_next(nullptr){}};template<class T,class Ref,class Pt…

Linux 云服务器挂载数据盘

1、检查linux服务器磁盘情况 df -h 可以看到无磁盘挂载信息。 2、查看待挂载磁盘信息 fdisk -l 可以看到40G系统盘、50G数据盘&#xff08;盘符&#xff1a;/dev/vdb&#xff09; 3、对数据盘分区 fdisk /dev/vdb 根据提示&#xff0c;依次输入“n”&#xff0c;“p”“1…

今日举办亚马逊云科技re:Inforce大会:结合生成式AI安全最新趋势,解决企业新挑战

2023年&#xff0c;生成式AI带来了无数的创新&#xff0c;并将会在行业应用中产生更多的新能力、新场景。与此同时&#xff0c;关于生成式AI的风险管控成为各方关注焦点&#xff0c;数据隐私、合规保护、防欺诈等&#xff0c;已成为生成式AI时代的安全合规的新话题。 随着云上业…

Java【手撕滑动窗口】LeetCode 3. “无重复字符的最长子串“, 图文详解思路分析 + 代码

文章目录 前言一、长度最小子数组1, 题目2, 思路分析3, 代码 前言 各位读者好, 我是小陈, 这是我的个人主页, 希望我的专栏能够帮助到你: &#x1f4d5; JavaSE基础: 基础语法, 类和对象, 封装继承多态, 接口, 综合小练习图书管理系统等 &#x1f4d7; Java数据结构: 顺序表, 链…

Nacos配置管理

统一配置管理 当微服务部署的实例越来越多&#xff0c;达到数十、数百时&#xff0c;逐个修改微服务配置就会让人抓狂&#xff0c;而且很容易出错。我们需要一种统一配置管理方案&#xff0c;可以集中管理所有实例的配置。 Nacos一方面可以将配置集中管理&#xff0c;另一方可…

Python钢筋混凝土结构计算.pdf-已知弯矩确定混凝土梁截面尺寸

计算原理 确定混凝土梁截面的合理尺寸通常需要考虑弯矩、受力要求和约束条件等多个因素。以下是一种常见的计算公式&#xff0c;用于基于已知弯矩确定混凝土梁截面的合理尺寸&#xff1a; 请注意&#xff0c;以上公式仅提供了一种常见的计算方法&#xff0c;并且具体的规范和设…

Python 实战之ChatGPT + Python 实现全自动数据处理/可视化详解

本文目录 一、引言 二、成果演示——口述式数据可视化 三、远原理述 四、实现过程 &#xff08;一&#xff09;环境配置 &#xff08;二&#xff09;申请OpenAI账号 &#xff08;一&#xff09;调用ChatGPT API &#xff08;二&#xff09;设计AI身份&#xff0c;全自动处理数据…

【附安装包】Multisim 14.0安装教程|电子电路

软件下载 软件&#xff1a;Multisim版本&#xff1a;14.0语言&#xff1a;简体中文大小&#xff1a;649.68M安装环境&#xff1a;Win11/Win10/Win8/Win7硬件要求&#xff1a;CPU2.5GHz 内存4G(或更高&#xff09;下载通道①百度网盘丨64位下载链接&#xff1a;https://pan.bai…

jdk17+springboot使用webservice,踩坑记录

这几天wms对接lbpm系统&#xff0c;给我的接口是webservice的&#xff0c;老实说&#xff0c;这个技术很早&#xff0c;奈何人家只支持这个。 环境说明&#xff1a;JDK17 springboot2.6.6。网上很多教程是基于jdk8的&#xff0c;所以很多在17上面跑不起来。折腾两天&#xff0c…

OJ练习第154题——到家的最少跳跃次数

到家的最少跳跃次数 力扣链接&#xff1a;1654. 到家的最少跳跃次数 题目描述 有一只跳蚤的家在数轴上的位置 x 处。请你帮助它从位置 0 出发&#xff0c;到达它的家。 跳蚤跳跃的规则如下&#xff1a; 它可以 往前 跳恰好 a 个位置&#xff08;即往右跳&#xff09;。 它…

【Linux】进程概念

文章目录 一.进程1.概念2.描述进程——pcb3.pcb&#xff08;task_struct&#xff09;内容分类4.查看进程&#xff08;1&#xff09;通过系统调用查看&#xff08;2&#xff09;通过ps命令查看 二.通过系统调用获取进程的PID和PPID三.通过系统调用创建子进程fork()1.fork函数创建…

53. 最大子数组和

题目 给你一个整数数组 nums &#xff0c;请你找出一个具有最大和的连续子数组&#xff08;子数组最少包含一个元素&#xff09;&#xff0c;返回其最大和。子数组 是数组中的一个连续部分示例 示例 1&#xff1a; 输入&#xff1a;nums [-2,1,-3,4,-1,2,1,-5,4] 输出&#…

docker拉取镜像报错

#拉取镜像报错如下 failed to register layer: exit status 22: unpigz: abort: zlib version less than 1.2.3这个是因为pigz的bug github链接。 复现&#xff1a; # 查看pigz版本 ~]# pigz version zlib version less than 1.2.3 #但是实际上我的zlib版本是大于1.2.3的&am…

小游戏分发平台如何以技术拓流?

2023年&#xff0c;小游戏的发展将受到多方面的影响&#xff0c;例如新技术的引入、参与小游戏的新玩家以及游戏市场的激烈竞争等。首先&#xff0c;新技术如虚拟现实&#xff08;VR&#xff09;、增强现实&#xff08;AR&#xff09;和机器人技术都可以带来新颖的游戏体验。其…

spring打入filter内存马+冰蝎成功

环境&#xff1a; springboot版本2.4.5 <parent><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-parent</artifactId><version>2.4.5</version><relativePath/> <!-- lookup parent from r…

thinkphp6如何将需要记录的日志单独记录到一个日志中

如何将需要记录的日志单独记录到一个日志中 有时候需要将具体情况的日志统一记录到单一的类目中方便查看。比如支付日志&#xff0c;回调日志。可以使用通道解决方法。 1.日志通道channel 将配置不同的日志通道&#xff0c;将不同的日志记录到不同的日志中 使用方法&#xf…

浏览器从输入 url 到显示网页的全过程

浏览器从输入 url 到显示网页的全过程 浏览器从输入 url 到显示网页的全过程DNS&#xff08;Domain Name System&#xff09;解析 浏览器从输入 url 到显示网页的全过程 当你在浏览器中输入一个URL并按下Enter键&#xff0c;以下是浏览器为显示网页所执行的一系列步骤&#xf…

spring小记

Spring是轻量级的开源的javaEE框架目的&#xff1a;解决企业应用开发的复杂性 Spring有两个核心部分&#xff1a;IOC和AOP <1>IOC&#xff1a;控制反转&#xff0c;把创建的对象过程交给Spring进行管理 <2>AOP&#xff1a;面向切面&#xff0c;不修改源代码进行…

为什么建议同时学多门编程语言

晨读一本名叫《4点起床》的书&#xff0c;书中有一段描述与最近学习编制语言时自己的感受完全一致。算是一个小经验&#xff0c;分享给大家。 书中有一章的标题为《同时学六国语言记起来比较快》&#xff0c;其中有两段描述如下&#xff1a; 为什么我推荐大家同时学不同的语言…