当前位置: 首页 > news >正文

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函数进行深入解析。

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

http://www.lryc.cn/news/178221.html

相关文章:

  • 01Redis的安装和开机自启的配置
  • 进入IT行业:选择前端开发还是后端开发?
  • Java集成Onlyoffice以及安装和使用示例,轻松实现word、ppt、excel在线编辑功能协同操作,Docker安装Onlyoffice
  • 编程面试_动态规划
  • ip地址可以精确定位吗
  • Xamarin体验:使用C#开发iOS/Android应用
  • 聊聊druid连接池的监控
  • CentOS 7 安装 Docker 的详细步骤
  • 竞赛 基于深度学习的动物识别 - 卷积神经网络 机器视觉 图像识别
  • 数据结构之【泛型】
  • 华为ac无线侧命令行配置思路和步骤
  • 十六)Stable Diffusion教程:出图流程化
  • SpringBoot全局异常处理源码
  • 设计模式——7. 装饰者模式
  • 安卓玩机-----反编译apk 修改apk 去广告 去弹窗等操作中的一些常识
  • Hoeffing不等式
  • ffmpeg解复用指定pid转推udp
  • Vue组件通信方式
  • redis-设置从节点
  • k8s-实战——基于nfs实现动态存储
  • 【广州华锐互动】鱼类授精繁殖VR虚拟仿真实训系统
  • RocketMQ Promethus Exporter
  • Kafka收发消息核心参数详解
  • Springboot中Aop的使用
  • 创建vue3项目、链式调用、setup函数、ref函数、reactive函数、计算和监听属性、vue3的生命周期、torefs的使用、vue3的setup写法
  • 搭建好自己的PyPi服务器后怎么使用
  • Vue3 中使用provide和reject
  • 大数据flink篇之一-基础知识
  • No140.精选前端面试题,享受每天的挑战和学习
  • Oracle 11g_FusionOS_安装文档