DRM全解析 —— ADD_FB2(0)
本文参考以下博文:
DRM驱动(四)之ADD_FB
特此致谢!
在笔者之前的libdrm全解析系列文章中,讲到了drmIoctl(fd, DRM_IOCTL_MODE_ADDFB, &f)以及其封装函数drmModeAddFB。对应的文章链接为:
libdrm全解析三十一 —— 源码全解析(28)
libdrm全解析三十二 —— 源码全解析(29)
实际上你如果看KWin源码,会发现使用更多的并不是drmModeAddFB函数,而是drmModeAddFB2WithModifiers函数。KWin源码中的代码片段如下(src/backends/drm/drm_buffer.cpp):
std::shared_ptr<DrmFramebuffer> DrmFramebuffer::createFramebuffer(const std::shared_ptr<DrmGpuBuffer> &buffer)
{const auto size = buffer->size();const auto handles = buffer->handles();const auto strides = buffer->strides();const auto offsets = buffer->offsets();uint32_t framebufferId = 0;int ret;if (buffer->gpu()->addFB2ModifiersSupported() && buffer->modifier() != DRM_FORMAT_MOD_INVALID) {uint64_t modifier[4];for (uint32_t i = 0; i < 4; i++) {modifier[i] = i < buffer->planeCount() ? buffer->modifier() : 0;}ret = drmModeAddFB2WithModifiers(buffer->gpu()->fd(), size.width(), size.height(), buffer->format(), handles.data(), strides.data(), offsets.data(), modifier, &framebufferId, DRM_MODE_FB_MODIFIERS);} else {ret = drmModeAddFB2(buffer->gpu()->fd(), size.width(), size.height(), buffer->format(), handles.data(), strides.data(), offsets.data(), &framebufferId, 0);if (ret == EOPNOTSUPP && handles.size() == 1) {//qCCritical(KWIN_DRM, "meidaozheli vvvv333...\n\n"); //phphret = drmModeAddFB(buffer->gpu()->fd(), size.width(), size.height(), 24, 32, strides[0], handles[0], &framebufferId);}}if (ret == 0) {return std::make_shared<DrmFramebuffer>(buffer, framebufferId);} else {return nullptr;}
}
这里我们的重点并不是KWin(针对于KWin源码的研究笔者正在进行中,后续会有专门的文章对于KWin源码进行解析),只是让读者感受一下实际的使用场景,并且能够知道真正主要使用的是drmModeAddFB2WithModifiers(),更准确地说,使用的优先级是drmModeAddFB2WithModifiers() > drmModeAddFB2() > drmModeAddFB()。
对于drmModeAddFB函数,笔者之前已经有过系列文章“DRM全解析 —— ADD_FB”,写得还算比较清楚和深入。有了前系列文章的基础,再加上笔者近一段时间对于图形部分(KWin、libdrm/DRM)的深入研究以及更深刻理解,本系列文章开始对于更常用暨更为重要的drmModeAddFB2WithModifiers和drmModeAddFB2函数进行深入解析。
本篇文章就作为契子或引子吧,真正的解析内容从下一篇文章开始。
相关文章:
DRM全解析 —— ADD_FB2(0)
本文参考以下博文: DRM驱动(四)之ADD_FB 特此致谢! 在笔者之前的libdrm全解析系列文章中,讲到了drmIoctl(fd, DRM_IOCTL_MODE_ADDFB, &f)以及其封装函数drmModeAddFB。对应的文章链接为: libdrm全解…...
01Redis的安装和开机自启的配置
安装Redis 单机安装Redis 大多数企业都是基于Linux服务器来部署项目,而且Redis官方也没有提供Windows版本的安装包(此处选择的Linux版本的CentOS 7) Windows版直接下载对应版本的.zip压缩包解压即可使用 第一步: Redis是基于C语言编写的,因此首先需要…...
进入IT行业:选择前端开发还是后端开发?
一、前言 开发做前端好还是后端好?这是一个常见的问题,特别是对于初学者来说。在编程世界中,前端开发和后端开发分别代表着用户界面和数据逻辑,就像城市的两个不同街区一样。但是,究竟哪个街区更适合我们作为开发者呢…...
Java集成Onlyoffice以及安装和使用示例,轻松实现word、ppt、excel在线编辑功能协同操作,Docker安装Onlyoffice
安装Onlyoffice 拉取onlyoffice镜像 docker pull onlyoffice/documentserver 查看镜像是否下载完成 docker images 启动onlyoffice 以下是将本机的9001端口映射到docker的80端口上,访问时通过服务器ip:9001访问,并且用 -v 将本机机/data/a…...
编程面试_动态规划
题目1 最大连续乘积子串 题目描述给一个浮点数序列,取最大乘积连续子串的值,例如 -2.5,4,0,3,0.5,8,-1,则取出的最大乘积连续子串为3,0.5,8。也就…...
ip地址可以精确定位吗
在互联网时代,IP地址的重要性不言而喻。作为网络通信的基础,IP地址用于标识每一台连接到互联网的设备。然而,传统的IP地址定位方式仅能粗略地确定设备的大致位置,无法实现精确定位。那么,IP地址能否实现精确定位呢&…...
Xamarin体验:使用C#开发iOS/Android应用
http://www.cnblogs.com/lwme/p/use-xamarin-develop-Android-iOS-app.html Xamarin是Mono创始人Miguel de Icaza创建的公司,旨在让开发者可以用C#编写iOS, Android, Mac应用程序,也就是跨平台移动开发。 简介 Xamarin是基于Mono的平台,目前主要有以下产品(更具体请见:h…...
聊聊druid连接池的监控
序 本文主要研究一下druid连接池的监控 init com/alibaba/druid/pool/DruidDataSource.java public void init() throws SQLException {//......registerMbean();//...... }DruidDataSource的init方法会执行registerMbean registerMbean com/alibaba/druid/pool/DruidData…...
CentOS 7 安装 Docker 的详细步骤
文章目录 Docker简介1.更新2.安装必要的软件包3.添加Docker仓库4.安装5.安装后的一些常规设置及常用的命令5.1 启动 Docker5.2 Docker 在系统启动时自动运行5.3 运行一个 Hello World 镜像5.4 查看docker运行状态5.5 docker ps5.6 查看docker版本 6.安装种常见的错误错误1:yum-…...
竞赛 基于深度学习的动物识别 - 卷积神经网络 机器视觉 图像识别
文章目录 0 前言1 背景2 算法原理2.1 动物识别方法概况2.2 常用的网络模型2.2.1 B-CNN2.2.2 SSD 3 SSD动物目标检测流程4 实现效果5 部分相关代码5.1 数据预处理5.2 构建卷积神经网络5.3 tensorflow计算图可视化5.4 网络模型训练5.5 对猫狗图像进行2分类 6 最后 0 前言 &#…...
数据结构之【泛型】
泛型:定义阶段不明确具体类型,产生对象时明确具体类型。 //Object是Java中的最高参数统一化,能够接受所有的引用类型; //有了包装类的自动拆装箱之后,Object还能够接收基本类型数值(自动装箱) …...
华为ac无线侧命令行配置思路和步骤
无线侧配置思路: Ap和ac在同一个广播域内,不用配置 option 43 source 源ip回包哪个模式都得配置 Cli配置业务模版流程: 1、 AC控制器上全局配置capwap回包接口地址 1、配置ssid:wifi名称 2、配置安全模版:用户连接密码…...
十六)Stable Diffusion教程:出图流程化
今天说一个流程化出图的案例,适用很多方面。 1、得到线稿,自己画或者图生图加线稿lora出线稿;如果想sd出图调整参数不那么频繁细致,则线稿的素描关系、层次、精深要表现出来,表现清楚。 2、文生图,seed随机…...
SpringBoot全局异常处理源码
SpringBoot全局异常处理源码 一、SpringMVC执行流程二、SpringBoot源码跟踪三、自定义优雅的全局异常处理脚手架starter自定义异常国际化引入封装基础异常封装基础异常扫描器,并注册到ExceptionHandler中项目分享以及改进点 一、SpringMVC执行流程 今天这里叙述的全…...
设计模式——7. 装饰者模式
1. 说明 装饰者模式(Decorator Pattern)是一种结构型设计模式,它允许你在不改变对象接口的前提下,动态地将新行为附加到对象上。这种模式是通过创建一个包装(或装饰)对象,将要被装饰的对象包裹起来,从而实现对原有对象功能的增强和扩展。 装饰者模式的主要特点包括:…...
安卓玩机-----反编译apk 修改apk 去广告 去弹窗等操作中的一些常识
安卓机型app的编译与反编译 apk文件的简单说明与解析 -安卓修改apk apk的组成和编译 一 电脑端几种反编译apk工具操作步骤解析 前面几个博文有说明关于反编译apk和apk架构等有些常识.今天对以上做个补充。初学者记住一点。对于一个apk文件使用压缩软件7zip打开可以查看到文件…...
Hoeffing不等式
在李航老师的统计学习方法(第一版中) H o e f f i n g 不等式 Hoeffing不等式 Hoeffing不等式是这样子给出的 设 X 1 , X 2 , . . . , X N X_1,X_2,...,X_N X1,X2,...,XN是独立随机变量,且 X i ∈ [ a i , b i ] , i 1 , 2 , . . . ,…...
ffmpeg解复用指定pid转推udp
命令 ffmpeg -re -i udp://224.2.2.2:4003?fifo_size1024000 -map #5001 -acodec copy -flush_packets 1 -f mpegts udp://192.168.2.62:5161 ffmpeg -re -i udp://224.2.2.2:4003?fifo_size1024000 -map #5001 -acodec copy -flush_packets 1 -f mpegts udp://192.16…...
Vue组件通信方式
1.props通信 1.1在 Vue 2 中使用 props 通信 注意:props传递的数据是只读的,子组件修改,不会影响父组件 1.1.1.定义 props 在子组件中使用 props 选项来定义要接收的属性 // 子组件 <script> export default {props: {message: String} } </script>1.1.2.传递…...
redis-设置从节点
节点结构 节点配置文件 主节点 不变 6380节点 port 6380 slaveof 127.0.0.1 63796381节点 port 6381 slaveof 127.0.0.1 6380启动 指定配置文件的方式启动 D:\jiqun\redis\Redis-6380>redis-server.exe redis.windows.conf启动时,会触发同步数据命令 主节点…...
OpenClaw多模型切换指南:ollama-QwQ-32B与本地小模型协同工作
OpenClaw多模型切换指南:ollama-QwQ-32B与本地小模型协同工作 1. 为什么需要多模型协同 去年冬天,当我第一次尝试用OpenClaw自动整理电脑里堆积如山的论文时,发现一个尴尬的问题:简单的文件分类任务消耗了过多token。每次让大模…...
嵌入式设备文件传输协议解析与实践
嵌入式设备文件传输协议深度解析与应用实践1. 文件传输协议概述1.1 传统串口文件传输协议Xmodem协议族作为经典的串口文件传输解决方案,在嵌入式领域已有数十年的应用历史。该协议通过串口实现设备间的可靠数据传输,采用校验和或CRC校验机制确保数据完整…...
告别手动调参!模糊PID如何让直流电机在负载突变时稳如泰山?
模糊PID控制:让直流电机在负载突变时稳如泰山的实战指南 引言:工业自动化中的电机控制痛点 在自动化产线上,直流电机突然遭遇负载变化时,你是否也经历过这样的场景?——机械臂正在精准抓取工件,突然因为物料…...
无公网IP解决方案:OpenClaw+nanobot内网穿透配置
无公网IP解决方案:OpenClawnanobot内网穿透配置 1. 为什么需要内网穿透? 去年我在尝试将OpenClaw接入家庭NAS时遇到了一个典型问题:没有公网IP。这意味着我无法在外网直接访问部署在家里的nanobot服务。经过多次尝试,最终通过内…...
Vue-Sonner:面向现代Vue应用的高性能Toast通知架构解析
Vue-Sonner:面向现代Vue应用的高性能Toast通知架构解析 【免费下载链接】vue-sonner 🔔 An opinionated toast component for Vue. 项目地址: https://gitcode.com/gh_mirrors/vu/vue-sonner 在当今快节奏的Web应用开发中,实时反馈机制…...
基于NLP的计算机毕业设计智能客服助手:从零搭建到性能优化实战
背景痛点:毕业设计智能客服的常见“坑” 很多计算机专业的同学在做毕业设计时,会选择智能客服助手这个方向,因为它既贴近实际应用,又能综合运用NLP、Web开发、数据库等多门课程知识。但真正动手后,常常会遇到几个让人…...
智能客服方案库物流JSON格式优化:从数据冗余到高效解析
在智能客服系统中,物流信息的查询与展示是高频核心功能。随着业务增长,我们方案库中存储和传输的物流JSON数据日益庞大。最初为了图省事,我们采用了“全量字段”的设计,即每次接口返回都包含物流单号、状态、时间、承运商、路由节…...
神经高利贷:预支未来技能导致认知崩溃
在软件测试领域,从业者常面临一个隐形威胁:过度追求新技能而忽视认知极限,最终引发崩溃。这种现象被称为“神经高利贷”,即通过预支未来学习能力来应对当前挑战,结果导致认知资源枯竭、错误率飙升,甚至职业…...
VIIRS在灾害监测中的实战应用:以洪水检测为例的Python代码解析
VIIRS在灾害监测中的实战应用:以洪水检测为例的Python代码解析 当洪水席卷城镇时,每一分钟的响应延迟都可能意味着更多生命财产的损失。VIIRS(可见光红外成像辐射计套件)作为NASA灾害监测系统的"鹰眼",其375…...
Vue.Draggable深度解析:源码实现与高级应用实战
Vue.Draggable深度解析:源码实现与高级应用实战 【免费下载链接】Vue.Draggable SortableJS/Vue.Draggable: Vue.Draggable 是 Sortable.js 的 Vue.js 封装组件,提供了拖放排序功能,可以在 Vue 应用中轻松实现列表元素的可拖拽重排。 项目地…...
