DRM全解析 —— ADD_FB2(0)

news/2024/9/16 7:46:16 标签: libdrm, DRM

本文参考以下博文:

DRM驱动(四)之ADD_FB

特此致谢!

在笔者之前的DRM.html" title=libdrm>libdrm全解析系列文章中,讲到了drmIoctl(fd, DRM_IOCTL_MODE_ADDFB, &f)以及其封装函数drmModeAddFB。对应的文章链接为:

DRM.html" title=libdrm>libdrm全解析三十一 —— 源码全解析(28)

DRM.html" title=libdrm>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"); //phph
            ret = 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、DRM.html" title=libdrm>libdrm/DRM)的深入研究以及更深刻理解,本系列文章开始对于更常用暨更为重要的drmModeAddFB2WithModifiers和drmModeAddFB2函数进行深入解析。

本篇文章就作为契子或引子吧,真正的解析内容从下一篇文章开始。


http://www.niftyadmin.cn/n/5055598.html

相关文章

【密评】商用密码应用安全性评估从业人员考核题库(一)

商用密码应用安全性评估从业人员考核题库&#xff08;一&#xff09; 国密局给的参考题库5000道只是基础题&#xff0c;后续更新完5000还会继续更其他高质量题库&#xff0c;持续学习&#xff0c;共同进步。 1 单项选择题 党的二十大主题是&#xff1a;高举中国特色社会主义伟…

分析几道关于死锁的真题

以下四点是408中死锁这一节的内容&#xff0c;考频基本上为每年一道题&#xff0c;虽然一半以上的题目是关于银行家算法的不安全序列的送分题&#xff0c;但其中有几道题综合了这以下几个概念&#xff0c;如果现在不提前分析这几个概念之间的关系的话。可能考场上就是随便蒙一个…

MySQL基础篇-基本sql语句

目录 1.SQL分类 2.SQL-DDL 2.1 数据库操作 查询 创建 删除 使用某个数据库 2.2 数据表操作 创建表 查询表 修改表 3.SQL-DML(增删改) 3.1 插入 3.2 修改 3.3 删除 4.SQL-DQL(查) 4.1 基础查询 4.2 条件查询 4.3 聚合函数查询 4.4 分组查询 4.5 排序查询 …

硬件设计之——GPIO配置表

所谓的GPIO配置表&#xff0c;就是平台厂商提供的IO_MUX表&#xff0c;我们要根据IO_MUX表设置合理的输入输出、上下拉、总线等关键配置信息。 下面是典型的MTK平台的IO_MUX表&#xff0c;从此表中&#xff0c;可以看出所有的IO最多可以复用8个functions &#xff08;即8个功能…

Vue以及整合ElementUI

初始化vue项目 #vue 脚手架使用 webpack 模板初始化一个 appname 项目 vue init webpack appname启动 vue 项目 #项目的 package.json 中有 scripts&#xff0c;代表我们能运行的命令 npm start npm run dev #启动项目 npm run build&#xff1a;将项目打包项目结构 运行流程…

图像处理: ImageKit.NET 3.0.10704 Crack

关于 ImageKit.NET3 100% 原生 .NET 图像处理组件。 ImageKit.NET 可让您快速轻松地向 .NET 应用程序添加图像处理功能。从 TWAIN 扫描仪和数码相机检索图像&#xff1b;加载和保存多种格式的图像文件&#xff1b;对图像应用图像滤镜和变换&#xff1b;在显示屏、平移窗口或缩略…

护眼灯什么价位的好?最具性价比的护眼台灯推荐

到了晚上光线比较弱&#xff0c;这时候就需要开灯&#xff0c;要是孩子需要近距离看字学习等等&#xff0c;给孩子选择的灯具要特别的重视。护眼灯就是目前颇受学生家长青睐的灯具之一&#xff0c;越来越多的人会购买一个护眼灯给自己的孩子让孩子能够在灯光下学习的时候&#…

【深度学习】ONNX模型多线程快速部署【基础】

【深度学习】ONNX模型CPU多线程快速部署【基础】 提示:博主取舍了很多大佬的博文并亲测有效,分享笔记邀大家共同学习讨论 文章目录 【深度学习】ONNX模型CPU多线程快速部署【基础】前言搭建打包环境python多线程并发简单教程基本教程ONNX模型多线程并发 打包成可执行文件总结 前…