前言

在上一篇《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) 学习简介

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

  1. linux名字的由来,Linux中的nice程序名字的由来

    Linux中nice程序的作用,想必大家都知道,就是通过一个 -20到19 的数字,来控制CPU分配到这个进程的时间片得多少.数字越小,CPU分配的时间片越多,也就是所谓的优先级越高. 我其实第一眼看 ...

  2. DRM dumb,prime介绍

    直接渲染管理器(Direct Rendering Manager)是给予DRI客户端直接访问硬件的内核模块,简称DRM.DRM 中管理内存的模块叫做GEM(Graphics Execution Man ...

  3. phonegap工程中修改app的名字

    针对phonegap比较高的版本,我的是6.4.0. 在phonegap工程中,当添加了iOS和android平台或多个平台后,工程进行了开发,然后觉得app的名字想修改一下(比如在手机上显示的app ...

  4. 编写一个Java程序实现多线程,在线程中输出线程的名字,隔300毫秒输出一次,共输出20次。

    编写一个Java程序实现多线程,在线程中输出线程的名字,隔300毫秒输出一次,共输出20次. 一.ThreadDemo class ThreadDemo extends Thread {public ...

  5. win7修改网络计算机名字,Win7系统中不能修改计算机名字是怎么回事?

    我们在使用电脑的过程中,有的用户为了让自己的电脑更加个性化,便会去修改计算机名字,当我们在局域网中共享文件时,我们的电脑就很容易找到了,因为咱们往往需要通过计算机名称来进行识别,找到对方的电脑,但是在 ...

  6. android女孩名字的由来,诗经中的女孩灵动名字 寓意深刻而又唯美

    给孩子起名字,特别是女孩子起名字会有些困难,毕竟总是很难找到有气质而又好听的名字.不过现在却不用纠结了,因为小编给大家整理了一些诗经中的女孩灵动名字,这些名字每一个不仅有深刻的寓意而且还非常的唯美. ...

  7. 微型计算机中ram中文名字是,微型计算机中,RAM的中文名字是().

    微型计算机中,RAM的中文名字是(). 微型基坑边坡坡度系数越大,边坡越不易坍塌. 计算机中临床上嵌顿发生率最高的腹外疝是 中文下列哪项不可能是斜疝的特点 名字直疝三角的三边解剖构成是 微型患者,男, ...

  8. 如何在Windows中修改您的名字和公司名?

    如何在Windows中修改您的名字和公司名? 安装Windows时,安装程序会提示输入注册用户的名字,所在公司等信息.安装完毕后,这些信息可以通过在打开我的电脑的" 属性"对话框中 ...

  9. python中不论类的名字是什么意思_Python中的名实关系——名字、命名空间、作用域...

    对象(object) 一切皆对象. 在Python中,包括数据和处理数据的函数,一切实体都是对象.在一个程序的运行过程中,不断地动态创建对象,然后通过对象之间的相互作用修改.销毁已存在的对象或生成新的 ...

最新文章

  1. 丰田chr优惠5万_别克昂科威优惠5万?是否该考虑入手了呢?
  2. zipimport.ZipImportError: can't decompress data; zlib not available 解决办法
  3. doc文件转换html,HTML+CSS入门 如何使用POI将doc文件转换为HTML
  4. CLR Via CSharp读书笔记(7):常量和字段
  5. 18-ESP8266 SDK开发基础入门篇--TCP 服务器 RTOS版,串口透传,TCP客户端控制LED
  6. vue.js安装与配置
  7. Python 中的 10 个常见安全漏洞,以及如何避免(上)
  8. html设置外边距不合并,CSS外边距合并代码
  9. python运行时间只算快的吗_Python 疑难问题:[] 与 list() 哪个快?为什么快?快多少呢?...
  10. 支持HTML5 SqlLite的AndroidApp
  11. Java网络编程(TCP协议-练习-上传文本文件)
  12. Java 获取日期间的日期 根据日期获取星期
  13. 格式化字符串两种方式
  14. 微信公众平台开发--表情符号
  15. 湖北刷脸支付:中国银联联合商业银行推出“刷脸付”产品
  16. 【Nodejs】Http模块01
  17. 腾讯人力资源管理体系
  18. 高德地图Demo,生成apk发布到手机签名不一致
  19. Jeff Dean长文展望:2021年后,机器学习领域的五大潜力趋势!
  20. 突然明白了原来我的QQ密保是这样被盗的

热门文章

  1. Tipask目录结构
  2. Python爬虫与信息提取(八)将新浪热搜排名导入数据库
  3. python绘制五角星
  4. Linux下使用 ./ 来运行可执行文件
  5. mvc+xrecyclerview+SQL+自定义控件
  6. Router+Redux学习总结
  7. 算法实现自动扫雷游戏
  8. 同是办公软件,wps和office有什么区别?
  9. windows mysql 开启非3306端口
  10. 1031 查验身份证 (15 分) python