libdrm全解析十 —— 源码全解析(7)

接前一篇文章:libdrm全解析九 —— 源码全解析(6)

本文参考以下博文:

DRM 驱动程序开发(VKMS)

特此致谢!

本文继续对include/drm/drm.h中实际功能宏定义进行讲解。

11. DRM_IOCTL_GEM_FLINK

第11个宏是DRM_IOCTL_GEM_FLINK,相应代码如下:

#define DRM_IOCTL_GEM_FLINK		DRM_IOWR(0x0a, struct drm_gem_flink)

结合之前文章中的_IOWR(type,nr,size)的最终定义,得到如下代码:

#define DRM_IOCTL_GEM_FLINK		( ((3)  << 30) | (('d') << 8) | ((0x0a)   << 0) | ((sizeof(struct drm_gem_flink)) << 16) )

struct drm_gem_flink在同文件(include/drm/drm.h)中定义,代码如下:

/* DRM_IOCTL_GEM_FLINK ioctl argument type */
struct drm_gem_flink {/** Handle for the object being named */__u32 handle;/** Returned global name */__u32 name;
};

drm_gem_flink结构中各成员的意义代码注释描述得很清楚了,在此无需赘述。

DRM_IOCTL_GEM_FLINK虽然并无直接对应的Userspace API(即没有对应的封装),但是libdrm源码中有多处直接对其进行了调用。

  • amdgpu/amdgpu_bo.c中:
static int amdgpu_bo_export_flink(amdgpu_bo_handle bo)
{struct drm_gem_flink flink;int fd, dma_fd;uint32_t handle;int r;fd = bo->dev->fd;handle = bo->handle;if (bo->flink_name)return 0;……memset(&flink, 0, sizeof(flink));flink.handle = handle;r = drmIoctl(fd, DRM_IOCTL_GEM_FLINK, &flink);if (r)return r;……return r;
}
  • etnaviv/etnaviv_bo.c中:
/* get the global flink/DRI2 buffer name */
drm_public int etna_bo_get_name(struct etna_bo *bo, uint32_t *name)
{if (!bo->name) {struct drm_gem_flink req = {.handle = bo->handle,};int ret;ret = drmIoctl(bo->dev->fd, DRM_IOCTL_GEM_FLINK, &req);if (ret) {return ret;}pthread_mutex_lock(&table_lock);set_name(bo, req.name);pthread_mutex_unlock(&table_lock);bo->reuse = 0;}*name = bo->name;return 0;
}
  • exynos/exynos_drm.c中:
/** Get a gem global object name from a gem object handle.** @bo: a exynos buffer object including gem handle.* @name: a gem global object name to be got by kernel driver.** this interface is used to get a gem global object name from a gem object* handle to a buffer that wants to share it with another process.** if true, return 0 else negative.*/
drm_public int exynos_bo_get_name(struct exynos_bo *bo, uint32_t *name)
{if (!bo->name) {struct drm_gem_flink req = {.handle = bo->handle,};int ret;ret = drmIoctl(bo->dev->fd, DRM_IOCTL_GEM_FLINK, &req);if (ret) {fprintf(stderr, "failed to get gem global name[%s].\n",strerror(errno));return ret;}bo->name = req.name;}*name = bo->name;return 0;
}
  • freedreno/freedreno_bo.c中:
drm_public int fd_bo_get_name(struct fd_bo *bo, uint32_t *name)
{if (!bo->name) {struct drm_gem_flink req = {.handle = bo->handle,};int ret;ret = drmIoctl(bo->dev->fd, DRM_IOCTL_GEM_FLINK, &req);if (ret) {return ret;}pthread_mutex_lock(&table_lock);set_name(bo, req.name);pthread_mutex_unlock(&table_lock);bo->bo_reuse = NO_CACHE;}*name = bo->name;return 0;
}
  • intel/intel_bufmgr_gem.c中:
static int
drm_intel_gem_bo_flink(drm_intel_bo *bo, uint32_t * name)
{drm_intel_bufmgr_gem *bufmgr_gem = (drm_intel_bufmgr_gem *) bo->bufmgr;drm_intel_bo_gem *bo_gem = (drm_intel_bo_gem *) bo;if (!bo_gem->global_name) {struct drm_gem_flink flink;memclear(flink);flink.handle = bo_gem->gem_handle;if (drmIoctl(bufmgr_gem->fd, DRM_IOCTL_GEM_FLINK, &flink))return -errno;pthread_mutex_lock(&bufmgr_gem->lock);if (!bo_gem->global_name) {bo_gem->global_name = flink.name;bo_gem->reusable = false;HASH_ADD(name_hh, bufmgr_gem->name_table,global_name, sizeof(bo_gem->global_name),bo_gem);}pthread_mutex_unlock(&bufmgr_gem->lock);}*name = bo_gem->global_name;return 0;
}
  • nouveau/nouveau.c中:
drm_public int
nouveau_bo_name_get(struct nouveau_bo *bo, uint32_t *name)
{struct drm_gem_flink req = { .handle = bo->handle };struct nouveau_drm *drm = nouveau_drm(&bo->device->object);struct nouveau_bo_priv *nvbo = nouveau_bo(bo);*name = nvbo->name;if (!*name) {int ret = drmIoctl(drm->fd, DRM_IOCTL_GEM_FLINK, &req);if (ret) {*name = 0;return ret;}nvbo->name = *name = req.name;nouveau_bo_make_global(nvbo);}return 0;
}
  • omap/omap_drm.c中:
/* get the global flink/DRI2 buffer name */
drm_public int omap_bo_get_name(struct omap_bo *bo, uint32_t *name)
{if (!bo->name) {struct drm_gem_flink req = {.handle = bo->handle,};int ret;ret = drmIoctl(bo->dev->fd, DRM_IOCTL_GEM_FLINK, &req);if (ret) {return ret;}bo->name = req.name;}*name = bo->name;return 0;
}
  • radeon/radeon_bo_gem.c中:
drm_public int
radeon_gem_get_kernel_name(struct radeon_bo *bo, uint32_t *name)
{struct radeon_bo_gem *bo_gem = (struct radeon_bo_gem*)bo;struct radeon_bo_int *boi = (struct radeon_bo_int *)bo;struct drm_gem_flink flink;int r;if (bo_gem->name) {*name = bo_gem->name;return 0;}flink.handle = bo->handle;r = drmIoctl(boi->bom->fd, DRM_IOCTL_GEM_FLINK, &flink);if (r) {return r;}bo_gem->name = flink.name;*name = flink.name;return 0;
}
  • tegra/tegra.c中:
drm_public int drm_tegra_bo_get_name(struct drm_tegra_bo *bo, uint32_t *name)
{struct drm_tegra *drm = bo->drm;struct drm_gem_flink args;int err;memset(&args, 0, sizeof(args));args.handle = bo->handle;err = drmIoctl(drm->fd, DRM_IOCTL_GEM_FLINK, &args);if (err < 0)return err;if (name)*name = args.name;return 0;
}

这里顺带把各种显卡都列出来了。每种显卡都会调用DRM_IOCTL_GEM_FLINK对应的drmIoctl。

其余宏定义将在后续文章中继续解析。

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

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

相关文章

kotlin 比较 let apply

let 和 apply 是 Kotlin 标准库中的两个非常有用的函数&#xff0c;它们用于在代码中实现更简洁和可读的操作。它们通常在函数式编程和链式调用中使用&#xff0c;以简化代码并提高可维护性。下面是关于这两个函数的详细解释&#xff1a; let let 函数是一个作用域函数&#…

安卓系列机型-禁止卸载某个APP 防止误卸载软件 无需root权限

安卓系列机型-禁止安装某软件 防止“沉迷游戏的小孩”操作解析_安卓机器的博客-CSDN博客 上一期讲了如何禁止安装某个app。今天讲下如何禁止卸载某app。正好相反的操作。任何操作有利有弊。主要看使用者如何对待使用。 &#x1f494;&#x1f494;&#x1f494;以腾讯的一款游…

Android Lottie加载gson文件动画

一&#xff1a;Lottie的使用 在你工程的build.gradle文件里添加如下配置 implementation com.airbnb.android:lottie:3.4.0二&#xff1a;布局文件直接引入LottieAnimationView <com.airbnb.lottie.LottieAnimationViewandroid:id"id/lottie_view"android:layout…

2023年国赛 高教社杯数学建模思路 - 案例:最短时间生产计划安排

文章目录 0 赛题思路1 模型描述2 实例2.1 问题描述2.2 数学模型2.2.1 模型流程2.2.2 符号约定2.2.3 求解模型 2.3 相关代码2.4 模型求解结果 建模资料 0 赛题思路 &#xff08;赛题出来以后第一时间在CSDN分享&#xff09; https://blog.csdn.net/dc_sinor?typeblog 最短时…

基于Jenkins自动打包并部署docker环境

目录 1、安装docker-ce 2、阿里云镜像加速器 3、构建tomcat 基础镜像 4、构建一个Maven项目 实验环境 操作系统 IP地址 主机名 角色 CentOS7.5 192.168.200.111 git git服务器 CentOS7.5 192.168.200.112 Jenkins git客户端 jenkins服务器 CentOS7.5 192.168…

【实训项目】易行APP设计(c2c二手交易平台)

1.设计摘要 1.1市场背景 随着经济的迅速发展与科技日新月异的进步&#xff0c;家庭内的各项物品更新换代频率越来越快&#xff0c;人们购买新商品后越来越多旧的商品积压需要处理&#xff1b;在互联网电商的各种营销刺激下&#xff0c;消费者非常容易形成“冲动”消费&#x…

回归预测 | MATLAB实现DBN-ELM深度置信网络结合极限学习机多输入单输出回归预测

回归预测 | MATLAB实现DBN-ELM深度置信网络结合极限学习机多输入单输出回归预测 目录 回归预测 | MATLAB实现DBN-ELM深度置信网络结合极限学习机多输入单输出回归预测预测效果基本介绍模型描述程序设计参考资料 预测效果 基本介绍 1.MATLAB实现DBN-ELM深度置信网络结合极限学习…

基于paddleocr的文档识别

1、版面分析 使用轻量模型PP-PicoDet检测模型实现版面各种类别的检测。 数据集&#xff1a; 英文&#xff1a;publaynet数据集的训练集合中包含35万张图像&#xff0c;验证集合中包含1.1万张图像。总共包含5个类别。 中文&#xff1a;CDLA据集的训练集合中包含5000张图像&a…

蓝蓝设计-UI设计公司作品-博晖创新原子吸收光谱仪软件交互及界面设计

博晖创新原子吸收光谱仪软件交互及界面设计 图标设计 | 交互设计 | 界面设计 博晖公司拥有强大的自主研发实力&#xff0c;建立了专业的研发团队&#xff0c;通过不断的技术创新&#xff0c;形成了分子诊断、免疫诊断、原子吸收、原子荧光及质谱五大技术平台&#xff0c;并成功…

UE学习记录03----UE5.2 使用拖拽生成模型

0.创建蓝图控件&#xff0c;自己想要展示的样子 1.侦测鼠标拖动 2.创建拖动操作 3.拖动结束时生成模型 3.1创建actor , 创建变量EntityMesh设为可编辑 生成Actor&#xff0c;创建变量EntityMesh设为可编辑 屏幕鼠标位置转化为3D场景位置 4.将texture设置为变量并设为可编辑&am…

【SpringCloud】Stream消息通知使用

文章目录 概述标准MQ 配置POMYML 示例消息发送配置RabbitMQ可视化插件消息消费者 遇到的问题复现解决&#xff1a;修改YML注意 概述 屏蔽底层消息中间件的差异,降低切换成本&#xff0c;统一消息的编程模型 官网&#xff1a; https://spring.io/projects/spring-cloud-stream#…

3、Spring_容器执行

容器执行点 1.整合 druid 连接池 添加依赖 <dependency><groupId>com.alibaba</groupId><artifactId>druid</artifactId><version>1.2.8</version> </dependency>1.硬编码方式整合 新建德鲁伊配置 <?xml version"1.…

【Alibaba中间件技术系列】「RocketMQ技术专题」小白专区之领略一下RocketMQ基础之最!

应一些小伙伴们的私信&#xff0c;希望可以介绍一下RocketMQ的基础&#xff0c;那么我们现在就从0开始&#xff0c;进入RocketMQ的基础学习及概念介绍&#xff0c;为学习和使用RocketMQ打好基础&#xff01; RocketMQ是一款快速地、可靠地、分布式、容易使用的消息中间件&#…

剪枝基础与实战(4):稀疏训练及剪枝效果展示

稀疏训练是通过在损失loss中增加BN的 γ \gamma γ 参数的L1正则,从而让绝大多数通道对应的 γ \gamma γ值趋近与0, 从而使得模型达到稀疏化的效果:

cloud_mall-notes03

请求方式GetMapping&#xff08;11&#xff09;用途方法返回值GetMapping(“info”)查询管理员信息getByIdsysUserGetMapping(“info/{userId}”)查询管理员详情getByIdsysUserGetMapping(“info/{roleId}”)查询角色详情getByIdsysRoleGetMapping(“info/{categoryId}”)根据标…

mysql 04.子查询和多表查询

一、子查询定义 当我们进⾏语句查询的时候&#xff0c;总会遇到我们需要的条件需要通过另⼀个查询语句查询出来后才能进⾏&#xff0c;就是说A 查询语句需要依赖B 查询语句的查询结果&#xff0c;B 查询就是⼦查询&#xff0c;A 查询语句就是主查询&#xff0c;⼀个SQL语句可以…

三目运算符和“??”

1.什么是三目运算符&#xff1f; 三目运算符是一种固定的运算格式&#xff0c;它的作用是简化“ if ”操作。它的语法格式为“ a ? b : c ”&#xff0c;a为条件&#xff0c;是布尔表达式&#xff0c;如果 a 为 true &#xff0c;该表达式返回 b &#xff0c;否则返回 c 。 2…

AD(第一部分---绘制元件库)

5.元件库介绍及电阻容模型的创建 注&#xff1a;元件库创建是在&#xff0c;以.SchLib结尾的 注&#xff1a;右下角的Panels消失/出现 点击左上角 "视图""状态栏" (快捷键&#xff1a;VS) 此处的SCH Library就是元件库列表 RES____电阻 CAP____电容&am…

数学——七桥问题——图论

当涉及数学&#xff0c;有很多不同的话题可以讨论。你是否有特定的数学领域、概念或问题想要了解更多&#xff1f;以下是一些常见的数学领域和主题&#xff0c;你可以选择一个或者告诉我你感兴趣的具体内容&#xff0c;我将很乐意为你提供更多信息&#xff1a; 代数学&#xff…

JavaScript Es6_4笔记

JavaScript 进阶 文章目录 JavaScript 进阶深浅拷贝浅拷贝深拷贝递归实现深拷贝js库lodash里面cloneDeep内部实现了深拷贝JSON序列化 异常处理throwtry ... catchdebugger 处理this普通函数箭头函数改变this指向callapplybind 防抖节流 深浅拷贝 浅拷贝 首先浅拷贝和深拷贝只…