我所理解的DRM显示框架

2023-11-16

什么是DRM:

DRM全称是DirectRenderingManager,是linux主流的一种显示框架,支持多图层合成,为用户图层提供统一的API(libdrm),来访问GPU,实现统一管理。它是为了解决多个程序对video card访问协同资源使用而产生的。DRM可以简单的分成三个模块:

  • libdrm:它是一个库,向上层提供通用的 API,是对底层各种 ioctl 的接口进行封装,用来进行图像显示和图像处理。 当然用 drm 的 ioctl 或者是用 framebuffer 来操作显示图像也可以。
  • GEM:内存管理,主要负责显示buffer的分配和释放、显存的共享和处理CPU、GPU内存同步
  • KMS:Kernel Mode Setting,用于更新画面和参数的设置,完成显卡的配置,和对硬件gpu操作进行了一层接口的封装。可以抽象为:Framebuffer、CRTC、Plane、Encoder、Connector等模块。

DRM框架图:

KMS框架组成:

  • Framebuffer:一块内存区域,用于存储显示的图像数据,驱动和应用层都可以访问,并且保存分辨率、色彩模式(yuv、rgb)等信息。
  • Crtc:显示控制,如用于display timings,resolution等配置,扫描读取Framebuffer的数据,在叠加Plane的内容传输给 Encoder。在vop(Video Output Processor)里,也就是lcdc控制器。
  • Plane:和Framebuffer一样是一块内存,是一块硬件图像层,一个图像层由一个或者多个plane组成。手机不同界面的叠加就是这个原理。有三种类型的plane:
    • DRM_PLANE_TYPE_PRIMARY: 主要图层,显示背景或者图像内容
    • DRM_PLANE_TYPE_OVERLAY: 用于显示叠加、缩放
    • DRM_PLANE_TYPE_CURSOR: 用于显示鼠标
  • Encoder:编码器,将接收到的数据转化成不同的信号:mipi、edp、vga等。
  • Connector:具体外部接口,如edp, hdmi, mipi等,连接到物理显示输出设备,存储着输出设备的相关信息,如:EDID、视频模式等。

        一般的流程是用户将显示的数据填充在Framebuffer,然后通过libdrm接口通知VOP设备,(crtc)vop驱动将 Framebuffer 和 plane 的数据叠加然后转换成标准的LCDC timing时序,然后通过 Encoder 转化成具体mipi、edp、vga等信号,到Connector显示输出。

KMS框架图:

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

我所理解的DRM显示框架 的相关文章

  • Linux 中热插拔设备时检测设备是否存在

    我正在运行 SPIcode http lxr free electrons com source drivers spi spi omap2 mcspi c在熊猫板上 我想知道其中的哪个功能code http lxr free electr
  • 为 Qt 应用程序创建 Linux 安装

    我刚刚用 Qt Creator 制作了一个很棒的程序 我对自己很满意 如何将其从台式机移至笔记本电脑 那么 最好的方法是安装程序 对吗 对于 Ubuntu 这是一个 Debian 软件包 对吗 我怎么做 有人这样做过吗 他们可以分享 QT
  • 在 Ubuntu 16.04 上找不到 printf.c

    我最近切换到Ubuntu 16 04 我在用vscode作为 Ubuntu 上的 IDE 我配置了其他语言 但我无法做到这一点C C 我创建c cpp properties json launch json tasks json 当我开始编
  • 如何以编程方式从Linux中的进程名称获取进程ID

    在我的项目中 我们使用 ACE 自适应通信环境 中间件来编写可在 Windows 和 Linux 上运行的独立于操作系统的代码 要求是从进程名称中获取进程 ID 由于 ACE 不支持这一点 因此我们必须使用特定于平台的宏来分离 Window
  • linux x86 汇编语言 sys_read 调用的第一个参数应为 0 (stdin)

    我正在编写一个简单的汇编程序来从标准输入读取 如 scanf 这是我的代码 section bss num resb 5 section txt global start start mov eax 3 sys read mov ebx 0
  • sleep 0 有特殊含义吗?

    我看到很多用法sleep 0在我的一个客户项目中 代码看起来像这样 while true sleep 0 end 阅读一些像这样的答案this https stackoverflow com questions 3727420 signif
  • 无需 cron 在后台发送邮件

    我想知道是否有一种方法可以运行 PHP 循环 以便在后台向订阅者发送几百封电子邮件 我的目标是格式化新闻通讯 单击发送 然后关闭浏览器或更改页面 当然 发送电子邮件的实际过程将在后台运行 不会因浏览器关闭而中断 我知道这可以通过 cron
  • 如何查找连接到 AF_INET 套接字的客户端的 UID?

    有什么方法或类似的东西ucred for AF UNIX如果是AF INET插座 TCP在我的例子中 找出连接到我的套接字的客户端的UID 还有 proc net tcp但它显示了UID of the creator插座的而不是连接的cli
  • 没有可用的符号表信息

    我正在测试第三方的库 它崩溃了 当我想查看崩溃的原因时 我的 gdb 告诉我没有可用的调试符号 Program received signal SIGSEGV Segmentation fault Switching to Thread 0
  • 如何制作和应用SVN补丁?

    我想制作一个SVN类型的补丁文件httpd conf这样我就可以轻松地将其应用到其他主机上 If I do cd root diff Naur etc httpd conf httpd conf original etc httpd con
  • Godaddy 托管上的 CakePHP 控制台

    我一直在努力让我的 CakePHP 网站在 Godaddy 网格托管 帐户上运行 我的蛋糕应用程序设置是从帐户的子目录托管的 并且可以通过子域访问 我必须调整我的 htaccess 文件才能使其正常工作 现在我需要让 CakePHP 控制台
  • ansible 重新启动 2.1.1.0 失败

    我一直在尝试创建一个非常简单的 Ansible 剧本 它将重新启动服务器并等待它回来 我过去在 Ansible 1 9 上有一个可以运行的 但我最近升级到 2 1 1 0 并且失败了 我正在重新启动的主机名为 idm IP 为 192 16
  • awk 子串单个字符

    这是columns txt aaa bbb 3 ccc ddd 2 eee fff 1 3 3 g 3 hhh i jjj 3 kkk ll 3 mm nn oo 3 我可以找到第二列以 b 开头的行 awk if substr 2 1 1
  • 是否可以在Linux上将C转换为asm而不链接libc?

    测试平台为Linux 32位 但也欢迎 Windows 32 位上的某些解决方案 这是一个c代码片段 int a 0 printf d n a 如果我使用 gcc 生成汇编代码 gcc S test c 然后我会得到 movl 0 28 e
  • Linux 中的无缓冲 I/O

    我正在写入大量的数据 这些数据数周内都不会再次读取 由于我的程序运行 机器上的可用内存量 显示为 空闲 或 顶部 很快下降 我的内存量应用程序使用量不会增加 其他进程使用的内存量也不会增加 这让我相信内存正在被文件系统缓存消耗 因为我不打算
  • 跟踪 Linux 程序中活跃使用的内存

    我想跟踪各种程序在特定状态下接触了多少内存 例如 假设我有一个图形程序 最小化时 它可能会使用更少的内存 因为它不会重新绘制窗口 这需要读取图像和字体并执行大量库函数 这些对象仍然可以在内存中访问 但实际上并没有被使用 类似的工具top它们
  • 如何使用 xterm.js 创建基于 Web 的终端以 ssh 进入本地网络上的系统

    我偶然发现了这个很棒的图书馆xterm js https xtermjs org 这也是 Visual Studio Code 终端的基础 我有一个非常普遍的问题 我想通过基于网络的终端 不在网络中 可能位于 aws 服务器上 访问本地网络
  • 从 csv 文件中删除特定列,保持输出上的相同结构[重复]

    这个问题在这里已经有答案了 我想删除第 3 列并在输出文件中保留相同的结构 输入文件 12 10 10 10 10 1 12 23 1 45 6 7 11 2 33 45 1 2 1 2 34 5 6 I tried awk F 3 fil
  • Jenkins中找不到环境变量

    我想在詹金斯中设置很多变量 我试过把它们放进去 bashrc bash profile and profile of the jenkins用户 但 Jenkins 在构建发生时找不到它们 唯一有效的方法是将所有环境变量放入Jenkinsf
  • 如何查明CONFIG_FANOTIFY_ACCESS_PERMISSIONS是否启用?

    我想利用fanotify 7 http man7 org linux man pages man7 fanotify 7 html我遇到的问题是在某些内核上CONFIG FANOTIFY ACCESS PERMISSIONS不起作用 虽然C

随机推荐

  • 数据结构经典面试题:多种方法实现字符串循环移位

    来源 我是码农 转载请保留出处和链接 本文链接 http www 54manong com id 12 问题描述 要求在时间复杂度和空间复杂度分别为O n 和O 1 的条件下把一个长度为N的字符串循环左移M位 例如将长度为9的字符串 123
  • C语言中的警告overflow in implicit constant conversion

    程序很简单 1 include
  • Docker容器与虚拟化技术:Docker架构、镜像操作

    目录 一 理论 1 Doker概述 2 Docker核心概念 3 Docker安装 4 Docker的镜像管理命令 二 实验 1 Docker安装 2 查看Docker信息 3 Docker的镜像管理命令 三 问题 1 如何注册Docker
  • C++友元声明与定义依赖关系

    ifndef A H define A H include
  • 小程序日期(日历)时间 选择器组件

    封装一个小程序日期 日历 时间 选择器组件 简要说明 一共两个版本 date time picker 和 date time picker plus date time picker 弹窗层是 基于 vant weapp 的 van pop
  • 机器学习之数据预处理

    1 导入需要的库 Numpy Pandas 2 导入数据集 3 处理丢失数据 数据可能是因为各种原因丢失 未了不降低机器学习模型的性能 需要处理数据 我们可以用整列的平均值 或中间值替换丢失的数据 我们用sklearn preprocess
  • STM32F103-定时器

    STM32F103系列的单片机一共有11个定时器 其中 1个系统嘀嗒定时器 2个看门狗定时器 2个基本定时器 TIM6和TIM7 4个通用定时器 TIM2 TIM5 2个高级定时器 TIM1和TIM8 基本定时器 TIM6和TIM7 只具有
  • springmvc+mongodb+maven 项目搭建配置

    操作步骤我就不再细化了 项目能运行 测试过了 先上配置 另一篇文章上代码 源码地址 http pan baidu com s 1pJslZ0v 项目结构 pom xml
  • react井字棋---最全井字棋小游戏教程

    上一期我们利用create react app搭建了好了一个react项目 这期我们通过跟随React官方教程 编写一个 井字棋 小游戏 来熟悉react的基本用法 首先来看下 井字棋 的最终实现效果 从演示中我们可以看到 这个游戏大致有以
  • JavaScript Math

    JavaScript Math 算数 对象 Math 算数 对象的作用是 执行常见的算数任务 在线实例 round 如何使用 round random 如何使用 random 来返回 0 到 1 之间的随机数 max 如何使用 max 来返
  • 14.进程间通信

    一 进程间通信概述 1 目的 1 数据传输 一个进程需要将它的数据发送给另一个进程 2 资源共享 多个进程之间共享同样的资源 3 通知事件 一个进程需要向另一个或一组进程发送消息 通知它们发生了某种事件 4 进程控制 有些进程希望完全控制另
  • 再谈Linux epoll惊群问题的原因和解决方案

    差别是什么 差别只是西装 缘起 近期排查了一个问题 epoll惊群的问题 起初我并不认为这是惊群导致 因为从现象上看 只是体现了CPU不均衡 一共fork了20个Server进程 在请求负载中等的时候 有三四个Server进程呈现出比较高的
  • Git进行pull时,出现please enter the commit message for your changes...

    在服务端更新代码时 git pull时总是出现需要编辑一个commit message git status 查看了下 原来是服务端有部分代码需要commit后尚未push导致 这种问题 解决办法如下 如果你本地仓库不需要push 这里编辑
  • 自定义指令、具名卡槽的使用与演示

    目录 一 v model简化代码 二 sync修饰符 三 ref 与 refs 四 自定义指令 五 插槽 默认插槽 六 具名卡槽 一 v model简化代码 1 目标 父组件通过v model简化代码 实现子组件和父组件数据双向绑定 2 如
  • np.array()函数

    函数调用方法 numpy array object dtype None 各个参数意义 object 创建的数组的对象 可以为单个值 列表 元胞等 dtype 创建数组中的数据类型 返回值 给定对象的数组 普通用法 import numpy
  • 【C语言】用迭代法求平方根。

    include
  • jar包启动、停止、重启脚本

    启动命令 sh start sh start 停止命令 sh start sh stop 重启命令 sh start sh restart 注意 1 把test jar改成自己的jar包名 2 把文件命名为start sh 在linux环境
  • JavaScript(7)本地存储,函数深入理解

    1 本地存储 1 1本地存储特性 数据存储在用户浏览器中 设置和读取数据方便 而且页面刷新不丢失数据 容量较大 sessionStorage约5M localStorage约20M 只能存储字符串 可以将对象JSON stringify 编
  • css - 选择器

    css 选择器 css选择器用于选择html元素 为其设置css样式 选择器不会选择纯文本 只选择html元素 ID选择器 html标签的唯一编号由id属性指定 通过使用id的形式可以选择指定的元素对象 慎用id选择器 因为css不会检测i
  • 我所理解的DRM显示框架

    什么是DRM DRM全称是DirectRenderingManager 是linux主流的一种显示框架 支持多图层合成 为用户图层提供统一的API libdrm 来访问GPU 实现统一管理 它是为了解决多个程序对video card访问协同