
DRM (Direct Rendering Manager)
文章平均质量分 93
分享本人学习Linux DRM (Direct Rendering Manager) 图形架构的经验总结,并以最简单的示例展示如何编写DRM应用程序和驱动程序,简单易懂,适合初学者。
何小龙
专注于 Linux Graphics 领域
展开
-
LWN 翻译:DMA-BUF cache handling: Off the DMA API map (part 2)
在上一篇文章中,我绍了一些关于 ION、DMA-BUF Heap、DMA API 的背景知识,以及 CPU Cache “所有权”的基本概念,最后站在传统 DMA API 的角度来描述 DMA-BUF 是如何处理 cache 同步问题的。文章最后还讨论了为什么传统的 DMA API 在现代移动平台上性能会这么差。本文将和大家一起探讨如何让 DMA-BUF exporter 避免不必要的 cache 操作的方法,并就如何改进这些方法提出了一些大致的建议。翻译 2020-06-21 19:42:43 · 3901 阅读 · 2 评论 -
LWN 翻译:DMA-BUF cache handling: Off the DMA API map (part 1)
kernel 中的 DMA API 都是用来在 CPU 和 device 之间共享 memory 的。近年来,传统的 DMA API 已经被运用到 ION、DMA-BUF 和 DMA-BUF Heap 这些接口中,但是在接下来的讲解中我们会看到,关于内存共享的效率问题,到现在都还没能被彻底解决掉。翻译 2020-06-14 15:01:54 · 4235 阅读 · 0 评论 -
dma-buf 由浅入深(八) —— ION 简化版
本篇我们将在上一篇的基础上,实现一个简化版的ION驱动,以此来实现任意 size 大小的内存分配。如果你对 dma-buf 还不熟悉,强烈建议先阅读本系列教程的 1~6 篇,对 dma-buf 有一定理解后再回过头来阅读本文。原创 2020-01-12 20:09:53 · 23757 阅读 · 17 评论 -
dma-buf 由浅入深(七) —— alloc page 版本
在前面的 dma-buf 系列文章中,exporter 所分配的内存都是通过 kzalloc() 来分配的。本篇我们换个方式,使用 alloc_page() 来分配内存。原创 2020-01-12 20:06:09 · 12285 阅读 · 6 评论 -
dma-buf 由浅入深(六) —— begin / end cpu_access
本篇我们将一起来学习 dma-buf 用于 Cache 同步操作的 begin_cpu_access 和 end_cpu_access 这两个接口。之所以将这两个接口放在第六篇讲解,是因为它们在内核中的使用频率并不高,只有在特殊场景下才派的上用场。原创 2019-11-26 00:12:46 · 16831 阅读 · 3 评论 -
dma-buf 由浅入深(五) —— File
在上一篇《dma-buf 由浅入深(四)—— mmap》中,曾提到过 dma_buf_fd() 这个函数,该函数用于创建一个新的 fd,并与 dma-buf 的文件关联起来。本篇我们一起来重点学习 dma-buf 与 file 相关的操作接口,以及它们的注意事项。原创 2019-11-26 00:12:33 · 24962 阅读 · 5 评论 -
dma-buf 由浅入深(四) —— mmap
前面的两篇文章《dma-buf 由浅入深(二) —— kmap/vmap》和《dma-buf 由浅入深(三) —— map attachment》都是在 kernel space 对 dma-buf 进行访问的,本篇我们将一起来学习,如何在 user space 访问 dma-buf。当然,user space 访问 dma-buf 也属于 CPU Access 的一种。原创 2019-11-26 00:12:20 · 25532 阅读 · 14 评论 -
dma-buf 由浅入深(三) —— map attachment
在上一篇《kmap/vmap》中,我们学习了如何使用 CPU 在 kernel 空间访问 dma-buf 物理内存,但如果使用CPU直接去访问 memory,那么性能会大大降低。因此,dma-buf 在内核中出现频率最高的还是它的 dma_buf_attach() 和 dma_buf_map_attachment() 接口。本篇我们就一起来学习如何通过这两个 API 来实现 DMA 硬件对 dma-buf 物理内存的访问。原创 2019-11-26 00:12:05 · 31327 阅读 · 11 评论 -
dma-buf 由浅入深(二) —— kmap / vmap
在上一篇《最简单的 dma-buf 驱动程序》中,我们学习了编写 dma-buf 驱动程序的三个基本步骤,即 dma_buf_ops 、 dma_buf_export_info、 dma_buf_export()。在本篇中,我们将在 exporter-dummy 驱动的基础上,对其 dma_buf_ops 的 kmap / vmap 接口进行扩展,以此来演示这两个接口的使用方法。原创 2019-11-26 00:11:46 · 30723 阅读 · 1 评论 -
dma-buf 由浅入深(一) —— 最简单的 dma-buf 驱动程序
如果你和我一样,是一位从事Android多媒体底层开发的工程师,那么你对 dma-buf 这个词语一定不会陌生,因为不管是 Video、Camera 还是 Display、GPU,它们的buffer都来自于ION,而 ION 正是基于 dma-buf 实现的。假如你对 dma-buf 的理解并不深刻,又期望找个时间来彻底公关一下,那么很高兴,这几篇文章一定能让你对 dma-buf 有个更深入、更透彻的理解。原创 2019-11-26 00:11:02 · 76755 阅读 · 19 评论 -
LWN 翻译:Atomic Mode Setting 设计简介(下)
紧接上篇文章,本篇翻译起来有难度,同时对读者的技术背景有一定要求,适合深入研究 DRM 驱动的开发人员阅读。通过阅读本文,你将了解如下内容:1. DRM_MODE_ATOMIC_ALLOW_MODESET 标志位的由来及其作用2. 驱动中随处可见的 ww_lock 到底是什么鬼?有什么作用?3. atomic helper 与 legacy helper 相比,都做了哪些优化?4. Atomic 框架中的 DPMS 为什么只有“ON”和“OFF”这两种状态?翻译 2021-02-11 00:23:40 · 6413 阅读 · 1 评论 -
LWN 翻译:Atomic Mode Setting 设计简介(上)
通过阅读本文,你将了解以下内容:1. Atomic mode setting 产生的背景2. Atomic KMS 与谷歌 ADF 相比有哪些优势3. TEST_ONLY 模式的正确打开方式4. KMS state 的使用方法5. Atomic check 和 commit 的功能翻译 2020-12-21 22:45:09 · 8295 阅读 · 1 评论 -
DRM 驱动 mmap 详解:(二)CMA Helper
CMA 是 Contiguous Memory Allocator 的缩写,它本身指代的是一种内存分配器(或内存分配策略),专用于分配物理连续的大块内存,以满足大内存需求的设备(如 Display、Camera)。CMA 除了具有内存分配的功能外,还具有内存迁移的功能,使得同一块 CMA 区域既可以被系统使用也可以被专用的 DMA 设备占用,从而大大提高了内存的使用率。要想使用 CMA 内存,需要在内核配置中开启 CONFIG_CMA 配置宏。原创 2020-10-09 22:10:27 · 10214 阅读 · 1 评论 -
DRM 驱动 mmap 详解:(一)预备知识
本文并不打算讲解 mmap 系统调用的原理及其相关细节,因为这涉及到 linux 内存管理的诸多概念,大家只需要了解如何去写一个简单的 mmap 驱动程序就可以了,为后续 drm mmap 驱动的编写做准备。原创 2020-08-21 08:06:49 · 15041 阅读 · 3 评论 -
翻译:Mainline Explicit Fencing
本文翻译自 Gustavo Padovan 于 2016 年 9 月发表在 Collabora 官网的三篇文章,Gustavo 本人也是内核中 dma-fence 的提交作者。通过本文,我们可以了解到 dma-fence 最初是如何演变而来的,以及它是如何在 graphics pipeline 中起作用的。翻译 2020-07-05 14:49:47 · 5355 阅读 · 2 评论 -
翻译:VESA Adaptive-Sync / AMD FreeSync / VRR 白皮书
译者注以下为正文。介绍多年来,显示行业一直普遍认为显示器是以固定的刷新率(refresh rate)运行的,如 60Hz。这与以下事实形成鲜明对比:送给显示器的图像内容多种多样,每种图像都有自己独特的、变化的帧率(frame rate)。当显示的刷新率与图像内容自身的帧率不同步时,用户可能会察觉到撕裂(tearing)和卡顿(stutter)之类的异常效果。在移动应用程序中(如平板、笔记本电脑),对于静态图像和视频播放来说,较高的显示刷新率不仅显得多余,还增加了系统功耗,降低了续航能力。这些因素使得我翻译 2020-07-01 21:37:59 · 9944 阅读 · 1 评论 -
DRM GEM 驱动程序开发(dumb)
在上一篇《关于 DRM 中 DUMB 和 PRIME 名字的由来》 文章中,我们知道了 dumb buffer 名字的由来。本篇,我们将一起来写一个最简单的 GEM 驱动程序。原创 2020-06-18 17:50:08 · 18162 阅读 · 24 评论 -
关于 DRM 中 DUMB 和 PRIME 名字的由来
在上一篇《DRM驱动程序开发(VKMS)》文章里,我们学习了如何编写一个最简单的 KMS 驱动。而本篇,我将以叙述的形式为大家讲解 DRM GEM 的相关概念,代码留到下一篇进行讲解。我知道,大多数的 DRM 初学人员,在刚接触到 GEM 相关概念时,首先困惑的不是 GEM 架构有多难,而是 GEM 里面的那些专业术语到底是怎么来的?为什么要这样命名?比如本篇要讲的“DUMB”和“PRIME”,当你得知它们的作用时,你甚至会有些愤慨:它们的名字和它们的功能简直毫无逻辑关系!是 DRM 社区的大佬们都喜欢原创 2020-05-19 00:41:27 · 15645 阅读 · 14 评论 -
DRM 驱动程序开发(VKMS)
VKMS 是 “Virtual Kernel Mode Setting” 的缩写,它于2018年7月5日被合入到 linux-4.19 主线版本中,并存放在 drivers/gpu/drm/vkms 目录下。之所以称它为 Virtual KMS,是因为该驱动不需要真实的硬件,它完全是一个软件虚拟的“显示”设备,甚至连显示都算不上,因为当它运行时,你看不到任何显示内容。原创 2020-04-27 00:12:37 · 29800 阅读 · 50 评论 -
DRM 驱动程序开发(开篇)
前言在前面的《最简单的DRM应用程序》系列文章中,我们学习了如何使用 libdrm 接口编写 DRM 应用程序。从本篇开始,我们将进入一个全新的世界,一起来学习如何在 kernel 空间编写 DRM 驱动程序。Objects在开始编写 DRM 驱动程序之前,我有必要对 DRM 内部的 Objects 进行一番介绍。因为这些 Objects 是 DRM 框架的核心,它们缺一不可。上图蓝色部...原创 2019-05-04 09:01:50 · 45571 阅读 · 26 评论 -
DRM (Direct Rendering Manager) 的发展历史
https://en.wikipedia.org/wiki/Direct_Rendering_Manager#History翻译 2019-03-23 12:47:38 · 14183 阅读 · 13 评论 -
DRM应用程序进阶 (atomic-plane)
前言在上一篇《DRM应用程序进阶(atomic-crtc)》文章中,我们学习了如何通过libdrm的atomic接口实现modeseting的操作。本篇,我们将一起来学习如何通过atomic接口,来实现 drmModeSetPlane() 相同的操作。Atomic Commitplane update的atomic操作如下:drmModeAtomicAddProperty(req, pla...原创 2019-02-20 21:37:34 · 25676 阅读 · 45 评论 -
DRM应用程序进阶 (atomic-crtc)
前言在上一篇《DRM应用程序进阶(Property)》中,我们学习了Property的基本概念及作用。在本篇中,我们将一起来学习如何操作这些Property,即libdrm Atomic接口的用法。Atomic为什么叫“Atomic Commit”?初学者第一次接触到DRM时,总会好奇当初开发者为什么要起 Atomic 这个名字。Wiki上关于该名词有较详细的解释,如果大家感兴趣可以通过本...原创 2019-02-15 23:04:04 · 27864 阅读 · 14 评论 -
DRM应用程序进阶 (Property)
前言通过前面几篇《最简单的DRM应用程序》系列文章,我们学习了如何编写一个最基本的DRM应用程序。但是,这些程序所使用的接口,在如今的DRM架构中其实早已经被标记为 Legacy(过时的) 接口了,而目前DRM主要推荐使用的是 Atomic(原子的) 接口。Atomic接口我会在下篇文章中重点介绍,本篇主要介绍Atomic操作必须依赖的基本元素,Property(属性)。Property所谓...原创 2019-02-13 22:42:32 · 25260 阅读 · 22 评论 -
最简单的DRM应用程序 (plane-test)
在上一篇 最简单的DRM应用程序 (page-flip)中,我们学习了drmModePageFlip()的用法。而在更早的两篇文章中,我们还学习了drmModeSetCrtc()的使用方法。但是这两个接口都只能全屏显示framebuffer的内容,如何才能在屏幕上只显示framebuffer的一部分内容呢?本篇我们将一起来学习DRM另一个重要的刷图接口:drmModeSetPlane()。在学习...原创 2018-12-10 02:26:18 · 38816 阅读 · 77 评论 -
最简单的DRM应用程序 (page-flip)
在上一篇 最简单的DRM应用程序 (double-buffer)中,我们了解了DRM更新图像的一个重要接口drmModeSetCrtc()。在本篇文章中,我们将一起来学习DRM另一个重要的刷图接口:drmModePageFlip()。drmModePageFlip()的功能也是用于更新显示内容的,但是它和drmModeSetCrtc()最大的区别在于,drmModePageFlip()只会等到V...原创 2018-12-01 15:50:20 · 34470 阅读 · 63 评论 -
最简单的DRM应用程序 (double-buffer)
在上一篇 最简单的DRM应用程序 (single-buffer)中,我们学习了如何去编写一个最基本的DRM应用程序。而本篇文章,将在 modeset-single-buffer 的基础上,对其进行扩展,使用双buffer机制的案例,来加深大家对drmModeSetCrtc()函数的印象。使用上一节中的modeset-single-buffer程序,如果用户想要修改画面内容,就只能对mmap()后...原创 2018-11-24 19:52:35 · 26158 阅读 · 27 评论 -
最简单的DRM应用程序 (single-buffer)
在学习DRM驱动之前,应该首先了解如何使用DRM驱动。以下使用伪代码的方式,简单介绍如何编写一个最简单的DRM应用程序。伪代码:int main(int argc, char **argv){ /* open the drm device */ open("/dev/dri/card0"); /* get crtc/encoder/connector id */ drmModeGe...原创 2018-11-17 11:53:00 · 61090 阅读 · 62 评论 -
DRM(Direct Rendering Manager)学习简介
DRM(Direct Rendering Manager)学习简介学习DRM一年多了,由于该架构较为复杂,代码量较多,且国内参考文献较少,初学者学习起来较为困难。因此决定将自己学习的经验总结分享给大家,希望对正在学习DRM的同学有所帮助,同时交流经验。由于本人工作中只负责Display驱动,因此分享的DRM学习经验都只局限于Display这一块,对于GPU这一块本人无能为力,如果大家有相关经验...原创 2018-11-10 19:41:56 · 113071 阅读 · 59 评论