关于 DRM 中 DUMB 和 PRIME 名字的由来

2023-10-30

前言

在上一篇《DRM驱动程序开发(VKMS)》文章里,我们学习了如何编写一个最简单的 KMS 驱动。而本篇,我将以叙述的形式为大家讲解 DRM GEM 的相关概念,代码留到下一篇进行讲解。

我知道,大多数的 DRM 初学人员,在刚接触到 GEM 相关概念时,首先困惑的不是 GEM 架构有多难,而是 GEM 里面的那些专业术语到底是怎么来的?为什么要这样命名?比如本篇要讲的“DUMB”和“PRIME”,当你得知它们的作用时,你甚至会有些愤慨:它们的名字和它们的功能简直毫无逻辑关系!是 DRM 社区的大佬们都喜欢故弄玄虚?还是我们的百度翻译不够准确?带着这样的疑问,我查阅了 DRM 相关的历史资料,深挖这些术语的历史来源,最终形成此文。希望通过我的讲解,能为各位扫去心中的疑惑。

DUMB Buffer

如果我们去百度翻译上查询“dumb”一词的含义,得到的解释有2种:

  1. “哑的” 2. “傻的”

哑的 buffer ?什么鬼!而如果我们在 Ubuntu 下运行 man drm-memory 命令,则会得到如下关于 Dumb-Buffer 的解释:

These buffers can be memory mapped via mmap(2) so you can render into them on the CPU. However, GPU access to these buffers is often not possible.

大意就是该 buffer 通常不能用于 GPU 硬件加速,只能给 CPU 使用。但是不能用于硬件加速的 buffer 为什么要叫 dumb buffer 呢?为何不直接叫 simple buffer 呢?“dumb”一词在这里到底是什么含义呢?其实这还得从上世纪80年代的VGA显卡说起。

那时的显卡由一块很小的显存(通常为640x480)加一块数模转换电路(DAC)组成,说白了就是一块 Framebuffer + Display Controller。显卡的功能极其简单,只负责将显存中的图像数据转换成RGB信号发送出去即可,而所有的绘图操作则都交给 CPU 来完成。行业里将这种显卡称为 VGA Card,它的显存则被称为“Dumb Frame Buffer”。而到了后期,随着显卡技术的不断发展,许多原来由 CPU 干的活,渐渐的都被显卡取代了。从最初支持某些特定绘图指令(如画点、画线)的显卡,到后来支持视频解码的 Video Card,再到现代支持复杂3D渲染指令(如OpenGL)的 GPU 显卡,CPU 绘图的繁重任务彻底得到了解放。与 VGA Card 相比较,行业里将后来显卡的显存称为“Smart Frame Buffer”。首先从这两种称谓上我们就可以看出,dumb 是 smart 的反义词,因此 dumb 在这里的解释应该是“傻的”或“傻瓜式的”,而不是“哑的”。

在这里插入图片描述
(图片来自1992年的计算机杂志)

那为什么说用 CPU 画的 framebuffer 就很傻,而 GPU 画的 framebuffer 就很 smart呢?是歧视 CPU 吗?不了解 GPU 的小伙伴可能不知道,当我们要让 GPU 硬件渲染一副图像的时候,并不是简单的传给 GPU 一块 buffer 然后告诉他“你画吧!”就完事了,而是要将好几种不同类型的 buffer 都传给它,这些 buffer 包括 Command Buffer (绘图指令)、Vertex Buffer(顶点数据)、Texture Buffer(纹理数据,即图片)、Framebuffer(GPU最终输出的结果)等等,这样 GPU 才知道自己应该如何去绘制一幅图像(详见本人翻译的“Render Hell”文章)。而如果我们将这些 buffer 发送给一块早期的 VGA 显卡,那可就傻眼了!因为它根本不会去解析 framebuffer 里的数据,只会将它们一股脑的都发送出去,最终的结果可想而知。所以 dumb buffer 和 smart buffer 的区别就在于,你写到显存里的数据,是可以直接上屏显示的图像内容,还是一堆需要 GPU 来解析的命令和资源数据。 如果是前者,那我们就称之为“傻瓜式的” framebuffer,即 dumb buffer。因为它的“大脑”在 CPU 那,它的“智商”不足以解析 framebuffer 中的内容,所以它很“傻”。

当然,如果从另一个角度去理解,smart buffer 中的绘图命令和资源数据可以看作是 CPU 和 GPU 交流的媒介,它使得 smart buffer 对 GPU 而言具有了“交流”的能力,那么 dumb buffer 因为没有这种交流能力而被当成是个“哑巴”,似乎也说的过去。。。

总之,不管是“哑巴”还是“傻瓜”,dumb buffer 就代表了所有的绘图操作都由 CPU 来完成的 framebuffer。它只是一种软件功能上的定义,与你系统上是否带 GPU 硬件无关。即使你的硬件支持 GPU 加速,也不妨碍你使用 dumb buffer 来做 CPU 纯软绘的工作。正因为 dumb buffer 的这一功能特性,使得它普遍应用于简单 UI 场景,如 Android 的 Recovery 模式。

与 dumb buffer 命名类似的还有:

  • dumb-terminal:不支持特殊字符的终端,如“清屏”、“粗体”、“彩色字符”等等
  • dumb-panel:不带 GRAM 的 panel
  • dumb-TV:与 Smart-TV 相反,指以前老式的黑白电视


如今的 IT 领域,dumb 一词更多的代表 “功能简单的”、“老式的”、“传统的” 含义。

PRIME

“prime”一词在百度翻译中被解释为“主要的”、“典型的”,如果只是想表达“主要的”一词,为什么不用“primary”?而用过 drm-prime 的小伙伴都知道,PRIME 在 DRM 驱动中其实是一种 buffer 共享机制,它是基于 dma-buf 来实现的。既然如此,那为什么不直接叫 drm-dmabuf 呢?光从字面上看, PRIME 和 DMA-BUF 没有半点关系,这让初学者在刚接触 drm-prime 的时候感到十分困惑。其实 PRIME 这个名字的由来是有背景故事的,故事还得从 NVIDIA 说起。

2010年2月9日,NVIDIA 官方发布了一项新的双显卡技术 —— Optimus Technology。该技术主要运用于带双显卡的笔记本(集成显卡+独立显卡),可以根据当前集成显卡的工作负载,自动的将一部分图形任务交给独立显卡去处理,以此来达到功耗和性能的最佳平衡。举例来说,一个带 Intel 集成显卡和 NVIDIA 独立显卡的笔记本,通常将集成显卡做为默认显卡,且充当了 Display Controller 的角色。当用户使用办公软件时,由于需要渲染的任务量不多,此时直接由 Intel 集成显卡来完成。而当用户玩3D游戏时,由于图形渲染的负载较重,此时系统会将部分或全部的任务交给 NVIDIA 独立显卡去处理,等处理完后再将结果送回给集成显卡做最后的合成显示。而这整个过程都是由软硬件自动完成的,中间无需人为干预,用户体验十分流畅。只可惜,该技术只能用在 Windows 系统上,Linux 系统不支持。

在这里插入图片描述
再看当时的 Linux 开源社区,Dave Airlie (RedHat Graphics 工程师,DRM 社区 maintainer)正如火如荼地向社区提交着他的 vga_switcheroo patch —— 一种用于 Linux 下双显卡切换的技术,但同一时刻只能有1个GPU处于工作状态(请注意和 Optimus 技术区分开来,Optimus 允许同一时刻有2个 GPU 同时处于工作状态)。当 Dave 完成了他的 vga_switcheroo 提交后,他开始在业余时间里研究起 Optimus 技术,并琢磨着怎样在 Linux 平台上实现类似的功能。结果不到2周时间,他就做出了该方案的原型设计,并在自己的笔记本上(Intel集成显卡+ATI独立显卡)实现了该功能的验证。

就像他在自己博客中所描述的,他将这项技术命名为“PRIME”:

So NVIDIA unveiled their optimus GPU selection solution for Windows 7, so I decided to see what it would take to implement something similar under DRI. I’ve named it PRIME for obvious reasons.

关键是这句 “I’ve named it PRIME for obvious reasons.” 许多国人看不明白,怎么就 obvious 了?博客里也没给出进一步的解释。其实如果把 Optimus 和 Prime 组合在一起,它是一个人的名字,谁的名字?
在这里插入图片描述
没错!Optimus Prime 就是变形金刚 擎天柱 的名字!《变形金刚》系列动画最早从1984年就开始在美国盛行,后来在2007年的时候又开始推出一系列3D真人版大电影,因此对于当时国外的年轻人来说,Optimus Prime 这个名字是再熟悉不过的了。这里也不得不夸赞一下 NVIDIA 当初给他们 Optimus 技术命名的精妙之处:擎天柱本身所具有的变形能力,形象的表达了 Optimus 这项技术可以在功耗和性能之间来回自由变换;而擎天柱作为汽车人的统领,象征着 NVIDIA 是行业里双显卡技术的领军人物!回过头来再说 Dave 将他这项 Linux 下的技术命名为 “PRIME”,其实是很巧妙的玩了一把文字游戏,同时也隐晦的告诉大家:DRM Prime 技术就是用来对标 NVIDIA Optimus 技术的!

不过需要注意的是,当时的 PRIME 并不是基于 dma-buf 的,而是基于 shm (共享内存)的。但只可惜,Dave 提出了他的 PRIME 原型设计后,就没有再进一步跟进下去,理由是该项工作除了需要修改 DRM 公共代码,还涉及到底层 GPU 硬件驱动的修改,以及上层 X Server 整个架构的改动,工作量实在太大了。而此后他一直致力于 Multi-GPU 的上层修改中,直到2年后 dma-buf 被合入到 linux-3.3 后,他才又回到 PRIME 的开发中来,并于2012年3月最终合入到 linux-3.4 主线版本中,也就是我们今天看到的基于 dma-buf 架构的 PRIME 版本。

这里顺便提一下,在 PRIME 概念提出之后,另有一群开源爱好者为了让 NVIDIA Optimus 硬件也能在 Linux 下正常使用 ,他们发起了一个新的项目,名字叫“Bumblebee”!
在这里插入图片描述
没错,Bumblebee 就是变形金刚里奶狗奶狗的大黄蜂!如果说 PRIME 是 Linux 下 Multi-GPU Rendering (或者叫 GPU Offloading)的通用技术方案,那么 Bumblebee 则是为 NVIDIA 硬件专门定制的 Linux 下 Optimus 全套技术解决方案。该项目也是几经波折,中间还出现了不少闹剧,甚至人们一度怀疑该项目已经死了,但它其实到现在都还在维护中,感兴趣的同学可以直接点此链接访问它们的官网,这里就不赘述了。

结尾

总之,DRM 有太多的历史讲不完,但至少通过本文,你应该已经了解了为什么 DRM 中会有 DUMB 和 PRIME 这两个莫名其妙的词语了。下一节,我们将开始真正动手写一个最简单的 GEM 驱动程序,敬请期待!

参考资料

  1. Frame Buffer FAQ
  2. Google: PC Mag 1992年7月
  3. 百度百科:NVIDIA Optimus
  4. Dave Airlie: GPU offloading - PRIME - proof of concept
  5. Phoronix: Hybrid Graphics Comes To Linux In Crude Form
  6. Phoronix: Last Minute For Linux 3.4: DMA-BUF PRIME Support
  7. The Bumblebee Project
  8. History of the bumblebee project

文章汇总: DRM (Direct Rendering Manager) 学习简介

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

关于 DRM 中 DUMB 和 PRIME 名字的由来 的相关文章

  • Linux DRM KMS 驱动简介

    Whoops xff0c 上次写完 Linux DRM Graphic 显示简单介绍 博文后 xff0c 心情还是蛮愉悦的 xff0c 来来 xff0c 这次在说说具体的显卡驱动 1 DRM 框架分解 DRM 框架提供了一系列的 IOCTL
  • 数字无线广播(DAB、DRM)

    1 什么是数字广播 数字化技术指的是运用0和1两位数字编码 xff0c 通过电子计算机 光缆 通信卫星等设备 xff0c 来表达 传输和处理所有信息的技术 数字化技术一般包括 数字编码 数字压缩 数字传输 数字调制 与解调 等技术 所谓的数
  • DRM驱动代码分析:图层参数更新

    前言 无业居家 闭门造车 非常欢迎大家帮忙指正 有些代码流程是看代码分析的 没有去验证是否正确 我对DRM框架的很多东西都不了解 所以有些地方会比较生硬 熟悉学习需要时间 文章一直堆在草稿箱可能会降低我的积极性 所以我还是先发布了文章 后面
  • dma-buf 由浅入深(一) —— 最简单的 dma-buf 驱动程序

    dma buf 由浅入深 一 最简单的 dma buf 驱动程序 dma buf 由浅入深 二 kmap vmap dma buf 由浅入深 三 map attachment dma buf 由浅入深 四 mmap dma buf 由浅入深
  • 图显系统DRM CRTC完全解析

    目录 CRTC 工作原理和意义 CRTC 模块的初始化和功能 0 引言 DRM 下的 CRTC 代表 RGB 数据管道 从 drm plane 接收像素数据并将其混合到一起 传输给下级显示设备 drm encoder 由 drm displ
  • 关于 DRM 中 DUMB 和 PRIME 名字的由来

    前言 在上一篇 DRM驱动程序开发 VKMS 文章里 我们学习了如何编写一个最简单的 KMS 驱动 而本篇 我将以叙述的形式为大家讲解 DRM GEM 的相关概念 代码留到下一篇进行讲解 我知道 大多数的 DRM 初学人员 在刚接触到 GE
  • 最简单的DRM应用程序 (single-buffer)

    在上一篇DRM Direct Rendering Manager 学习简介 中 我们学习了DRM的基本概念以及基本组成元素 从本篇开始 我将以示例代码的形式 给大家分享学习DRM驱动开发的整个学习过程 在学习DRM驱动之前 应该首先了解如何
  • LWN 翻译:Atomic Mode Setting 设计简介(下)

    译者注 紧接上篇文章 本篇翻译起来有难度 同时对读者的技术背景有一定要求 适合深入研究 DRM 驱动的开发人员阅读 通过阅读本文 你将了解如下内容 DRM MODE ATOMIC ALLOW MODESET 标志位的由来及其作用 驱动中随处
  • DRM框架(vkms)分析(3)----connector->func && connector->helper_private的使用

    一 connector gt func drm connector funcs类型的对象实例 其中有些对象实例可直接使用helper函数 有些可以自定义 还有一些可以忽略掉不赋值的 struct drm connector funcs co
  • DRM驱动(七)之atomic_commit

    上节已经把应用的参数check了一遍 这次就可以把对应的参数配置到硬件里进行刷图操作了 int drm atomic commit struct drm atomic state state struct drm mode config c
  • 图显系统DRM ENCODER和CONNECTOR完全解析

    0 引言 DRM ENCODER 和 CONNECTOR 模块由图显外设抽象而来 从传统意义上来讲 ENCODER 包含外设控制器的功能 而 CONNECTOR 包含外设 PHY 或者显示器参数 但是这两部分又紧密关联 因此 软件 DRM
  • MIPI DSI的linux kernel驱动原理

    为了点亮一块MIPI屏幕 我们除了要了解MIPI DSI的工作原理之外 大前提是要了解整个MIPI DSI图显系统的组成 更需要清楚点亮一块MIPI屏幕需要做哪些事情 本文会捋顺各个环节所实现的功能以及基于RK3399来分析各个环节实现的原
  • Delphi Win32 的最佳共享软件锁 [关闭]

    Closed 此问题正在寻求书籍 工具 软件库等的推荐 不满足堆栈溢出指南 目前不接受答案 与我上一个问题相同的介绍 我正在重写和 或合并一堆我的 应用程序框架 类 基本主窗体 关于框 锁定例程和购买链接 自动更新 数据模块初始化程序等 基
  • 如何使用android.drm框架

    我正在开发一个基于 DRM 的 Android 应用程序 应用程序旨在在下载并获得对文件 音频 视频 的控制访问权限后对 音频 视频 文件进行加密 防止文件 音频 视频 复制和粘贴并使文档过期 从而无法再查看它们 为此我使用 android
  • 与加密流相比,DRM 的附加值是多少?

    这个问题是关于使用 MPEG DASH 和 或 HLS 的视频流 我试图了解商业 DRM 系统 例如 EZDRM BuyDRM 等 与简单的加密流媒体 例如 DRM 相比的附加值 AES 128 加密的 HLS 我对商业口号有点迷失了 因此
  • Silverlight - 保护网络内的内容(DRM?)

    我想使用Windows 2003 的流媒体服务器和Silverlight 设置一些WMV 视频流 现在 不幸的是 Silverlight 仅支持 HTTP 这意味着人们只能下载视频 虽然这本身不是问题 但我想知道有哪些选项可以阻止它们在网络
  • 三星智能电视通过 PlayRead 串流 MPEG DASH

    我尝试在 Orsay TV Tizen 之前的三星电视 上播放流 带有 PlayReady 的 MPEG DASH 未加密的 DASH 工作正常 我试图严格按照 DRM Today 手册 即我的 DRM 提供商 获取许可证 但播放无法开始
  • 如何确定 Android 应用程序是否使用可信执行环境 (TEE) 和安全元件 (SE)?

    我已经解决了问题One https stackoverflow com questions 61225795 how to check whether android phone supports tee 64422042 64422042
  • 有没有办法在 HTML5 视频上使用 DRM?

    由于 Flash 正在节节败退 我想知道是否有办法通过 DRM H264 ogg 和 WebM 保护 html5 视频 On the HTML5 上的 W3C 常见问题解答 http www w3 org html wiki FAQs Is
  • 如何在 Cast Receiver Player 中续订过期的 DRM 许可证?

    我基于以下内容开发自定义 Cast Receiver 应用程序Google Cast 应用程序框架 https developers google com cast docs caf receiver 接收器应用程序负责播放 Widevin

随机推荐

  • ==与equals有什么区别

    与equals的区别 相同点 1 和equals都是用于完成比较操作 2 和equals的判定结果都是boolean值 true或false 不同点 1 是个运算符 本质上用于比较两个值是否相等 2 使用 运算符比较的值可以是基本类型的值
  • 在ubuntu20.4下安装ROS-noetic(全步骤经反复验证成功)

    注意 如果有conda环境 conda deactivate推出环境 1 4步骤都是很顺利的 如果下载失败请换源 第5步rosdep比较繁琐 但是根据我的使用情况 发现不按照rosdep也能正常使用 更新于2022 3 安装过程的打印信息可
  • 【图像处理】《数字图像处理-冈萨雷斯》笔记

    数字图像处理 冈萨雷斯 笔记 第一章 绪论 图像处理实例 伽马射线成像 X射线成像 紫外波段成像 可见光以及红外线成像 微波波段成像 无线电波成像 声波成像 图像处理的基本步骤 图像获取 滤波与增强 图像复原 彩色图像处理 小波与分辨率处理
  • JMeter 安装教程(详细安装教程)

    JMeter 安装教程 详细安装教程 一 jdk下载 注意 因为jmeter运行依赖jdk环境 所以在安装jmeter之前需要安装jdk且配置环境变量 需要jdk1 8以上版本 1 jdk下载地址 http www oracle com t
  • Vue实现下载及文件重命名

    效果如下 实现步骤 html
  • 理解JavaScript作用域和作用域链

    一 JavaScript中的作用域 作用域是当前的执行上下文 值和表达式在其中 可见 或可被访问 如果一个变量或表达式不在当前的作用域中 那么它是不可用的 function foo var x sfa console log x x is
  • 31黑马QT笔记之QPixmap、QImage、QPicture功能大总结

    31黑马QT笔记之QPixmap QImage QPicture功能大总结 QPixmap QImage既可以用于绘图 又可以作绘图设备时保存图片 而QPicture只能用于作绘图设备时保存图片状态 保存前需要用到前两种方法绘图 要显示必须
  • Go Lang 从Request中解析文件和参数

    如果要处理上传的文件 就必须使用multipart form data编码 处理multipart form data编码的请求时 解析使用ParseMultipartForm 之后从MultipartForm字段取值 前端上传代码
  • powershell 学习笔记

    命令模式 字符串不需要加引号 除变量和圆括号中的内容外的所有内容均可看作字符串 copy users txt accounts txt copy src dest write host 2 2 表达式模式 以最高级别语言分析方法来进行分析
  • 高通平台MSM8916LCM模块移植(一)-bootloader部分

    目录 LK中LCM启动流程 oem panel select mdss dsi initialize read panel id 此次移植打算分成两个模块来说 bootloader部分和kernel部分 在实际的移植调试过程中也是这么分成了
  • C语言期末复习编程练习之百钱百鸡问题

    古代数学家张丘建在 算经 一书中提出的数学问题 鸡翁一值钱五 鸡母一值钱三 鸡雏三值钱一 百钱买百鸡 问鸡翁 鸡母 鸡雏各几何 创作此系列的原因也是为了复习期末考试 各位见谅哦 include
  • 近7000万美元被盗:Curve被攻击事件分析

    7 月 31 日 以太坊编程语言Vyper发布公告称 Vyper 0 2 15 0 2 16 和 0 3 0 版本的递归锁失效 随后Curve Finance等相关协议出现了漏洞攻击事件 漏洞的根源都是某些版本的 Vyper 中出现故障的递
  • python发送邮件zmail库

    第三方库 zmail 和 yagmail 可实现邮件发送 在实际使用对比zmail比yagmail更简洁 使用zmail 无需登录OA邮箱 便可完成邮件的发送及附件的自动加载 import zmail def send zmail send
  • JupyterHub on Kubernetes部署

    理论是灰色的 实践之树长青 恩格斯 近日在做毕设项目 涉及到在K8s和swarm基础上部署JupyterHub 经过两天时间的学习和部署 N次的失败尝试 最终在服务器上成功部署了JupyterHub 实验依赖 阿里云服务器2核4G ubun
  • SpringBoot项目的创建和jar、war方式的部署

    一 创建项目 项目开发用的是IDEA java版本为1 8 Tomcat版本为9 0 8 新建项目 选择Spring Initializr 下一步 填写group和artifact信息 下一步 选择Web中的Web 下一步 选择存放路径 例
  • git部署出现的问题

    git部署出现的问题 error remote origin already exists remote rejected master master hook declined 一 出错信息 fatal remote origin alr
  • spring boot 配置log4j2

    刚入职新公司 接到的第一个需求就是把项目的log4j 1 x 升级到2 x 之前没有做过日志配置 都是直接拿来用的 这是第一次自己配置日志文件 所以记录下相关知识点 1 排除1 0的jar包 首先排查项目中log的版本 把1 0相关的版本都
  • AI-day02-2(Python小白逆袭大神)

    安装paddlehub pip install paddlehub 1 6 0 i https pypi tuna tsinghua edu cn simple Looking in indexes https pypi tuna tsin
  • AndroidStudio如何使用@hide api

    前提 你的应用必须是System App 在project的build gradle里面添加 gradle projectsEvaluated 所有的 project 都配置完成后的回调 此时 所有的project都已经配置完毕 准备开始生
  • 关于 DRM 中 DUMB 和 PRIME 名字的由来

    前言 在上一篇 DRM驱动程序开发 VKMS 文章里 我们学习了如何编写一个最简单的 KMS 驱动 而本篇 我将以叙述的形式为大家讲解 DRM GEM 的相关概念 代码留到下一篇进行讲解 我知道 大多数的 DRM 初学人员 在刚接触到 GE