这里整理几个在学习Linux DRM/KMS中用到的工具,modetest、kmscude、igt-gpu-tools。


简介:

modetest

是由libdrm提供的测试程序,可以查询显示设备的支持状况,进行基本的显示测试,以及设置显示的模式。

kmscube

是由mesa3d提供和维护,这是一个基于 KMS/GBM/EGL/OPENGL ES2.0 测试用例。

kmscube is a little demonstration program for how to drive bare metal graphics without a compositor like X11, wayland or similar, using DRM/KMS (kernel mode setting), GBM (graphics buffer manager) and EGL for rendering content using OpenGL or OpenGL ES.

igt-gpu-tools

是一个测试DRM drivers的测试工具集

IGT GPU Tools is a collection of tools for development and testing of the DRM drivers.


测试环境和编译环境:

如未特别注明,所有的程序编译和测试均是在如下环境中进行的:

硬件环境:raspberry Pi 3 Model B

仍将环境:Linux alarm 5.6.13-1-ARCH #1 SMP Sat May 16 21:58:40 MDT 2020 aarch64 GNU/Linux


modetest

代码编译:

libdrm的下载链接:https://dri.freedesktop.org/libdrm/libdrm-2.4.100.tar.bz2

解压代码后,进入目录执行:

# ./configure

# Make -j4

编译完成后会在目录libdrm-2.4.100/tests/modetest下生成 modetest 可执行文件。


modetest示例:

modetest的运行需要root权限。

首先这里给出一组显示示例,命令参数如下:

./modetest -M vc4 -D 0 -a -s 32@140:1920x1080  -P 173@140:1920x1080 -Ftiles

命令执行的console输出:

程序运行效果如下,通过HDM连接的显示器整屏的显示了渐变的斜条纹:

如果你运气不错,那么你能看到与我相同的显示效果,但是如果(likely())运气差了点,没关系,接下来会详细介绍modetest这些参数的由来。


通过--help参数可以查看modetest支持的全部选项,如下:

./modetest --help

usage: /home/alarm/workspace/linux/libdrm-2.4.100/tests/modetest/.libs/lt-modetest [-acDdefMPpsCvw]

Query options:

-c    list connectors

-e    list encoders

-f    list framebuffers

-p    list CRTCs and planes (pipes)

Test options:

-P <plane_id>@<crtc_id>:<w>x<h>[+<x>+<y>][*<scale>][@<format>]    set a plane

-s <connector_id>[,<connector_id>][@<crtc_id>]:<mode>[-<vrefresh>][@<format>]    set a mode

-C    test hw cursor

-v    test vsynced page flipping

-w <obj_id>:<prop_name>:<value>    set property

-a     use atomic API

-F pattern1,pattern2    specify fill patterns

Generic options:

-d    drop master after mode set

-M module    use the given driver

-D device    use the given device

Default is to dump all info.

可以看到参数一共分为3类。

Query options:提供查询操作,用于列举出connectors、encoders、framebuffers,CRTCs and planes,未指定参数时默认输出所有信息。

Test options:设定显示测试的参数。

Generic options: 指定打开设备节点,DRM/KMS对用户层来说是一个标准的linux字符设备,其设备节点路径为/dev/dri/cardX、/dev/dri/renderX(之所有有两个设备节点这,涉及到DRM-Master 和 client相关的内容,这里可以简单的认为它们代表用一个设备)

现在我们来看看如何实现一个这样的需求:通过HDMI连接的显示器输出一副分辨率为1920X1080的pattern图像。

这个需求很明确,通过HDMI输出分辨率为1920X1080的图像,Linux DRM/KMS 内核中的显示组件,如下图所示:

我们要做的就是找出一组connectors、encoders、framebuffers,CRTCs 和 planes的一个组合,使其能完成我们的需求,步骤如下:

1. 找出与HDMI 相连接的connector

2. 在找到connectors后,要找出可与connector匹配的encoder,

3. 找到connector和encoder可用的CRTC,

4. 为CRTC配置合适plane

5. 为plane创建framebuffers,指定framebuffer大小,并填充pattern图像,framebuffer是唯一有用户层创建的内核对象,其余4个对象均是在DRM driver加载时注册的。

这里所谓的“找到”,就是获取各个组件在内核中的id号,即handle值。

handle有点像文件描述符,是一个32bits的整数,某个linux DRM/KMS内核对象通过handle导出,并在接收到用户的handle后找到该内核对象。

首先来找出与HDMI相关的connector,前面提到modetest具有查询功能,而参数-c  list connectors能列举出所以的connector,查询结果如下:

sudo ./modetest -M vc4 -c

Connectors:

id    encoder    status        name        size (mm)    modes    encoders

32    31    connected    HDMI-A-1           550x310        39    31

modes:

name refresh (Hz) hdisp hss hse htot vdisp vss vse vtot)

1920x1080 60 1920 2008 2052 2200 1080 1084 1089 1125 148500 flags: phsync, pvsync; type: preferred, driver

...

props:

20 CRTC_ID:

flags: object

value: 140

...

47    0    unknown    composite-1        0x0        1    46

...

输出了两组connector的详细(原始log较长,这里只截取关键部分),从log中的关键字可知,id=32的connector是与HDMI相连接的,而该connector是与id=31的encoder相连的,并且通过后面的props列表可以当前连接的CRTC_ID=140. modes列表这列出了connector支持的全部参数配置,即:

CRCT(ID=140) --> ENCODER(ID=31) --> CONNECTED(ID=32) --> HDMI

让我们来回顾一下之前的测试命令:

./modetest -M vc4 -D 0 -a -s 32@140:1920x1080  -P 173@140:1920x1080 -Ftiles

对照一下modetest的参数项: -s  <connector_id>[,<connector_id>][@<crtc_id>]:<mode>[-<vrefresh>][@<format>]

即 connector_id = 32,crtc_id =140, mode = 1920x1080,encoder和connector通常是一一对应的,在内核中这两者一般也是一同注册的,并通过函数drm_connector_attach_encoder()关联在一起。

mode我们选择了 1920x1080。

所以connector_id、crtc_id、mode就是这样来的。

列出 encoder:

./modetest -M vc4 -e
Encoders:
id        crtc        type        possible crtcs        possible clones
31        140        TMDS        0x00000004        0x00000000
46        0          TVDAC        0x00000004        0x00000000
52        0           Virtual        0x00000002        0x00000000

接下里我们分析-P这个参数的设定,前面已经知道connector_id=32是与crtc_id=140组合的,接下来我们需要为crtc_id=140匹配一个可用的plane id。

列举CRCT和PLANE的命令如下(这里省略了很多内容,因为raspberry Pi 3的vc4 driver支持3个CRCT,每个CRTC又支持10个plane,所以输出内容较多):

./modetest -M vc4 -D 0 -p

CRTCs:

id        fb        pos        size

58        0        (0,0)        (0x0)

99        0        (0,0)        (0x0)

140        178        (0,0)        (1920x1080)

1920x1080 60 1920 2008 2052 2200 1080 1084 1089 1125 148500 flags: phsync, pvsync; type: preferred, driver

Planes:

id        crtc        fb        CRTC x,y        x,y        gamma size        possible crtcs

173        0           0        0,0             0,0        0                   0x00000004

这里我选择了planes_id=173,选择的依据是possible crtcs = 0x00000004,即bit2=1,表示该plane可用于第3个crcts。

如何理解这里的第3个呢?前面说了CRCT都是通过id来标识的,第3个与crtc=140是关联不上的。

简单的理解是按照上述命令输出的CRCT信息顺序编号,比如第3个crct的id=140。

深层次的原因是kernel中,每成功注册成功一个CRCT后,会把它加入到mode_config->crtc_list中,加入的同时它会获得一个index,而这个index基本上就是按CRCT注册的先后顺序来分配的了(crtc->index = config->num_crtc++)。

最后回到我们下面这个命令:

./modetest -M vc4 -D 0 -a -s 32@140:1920x1080  -P 173@140:1920x1080 -Ftiles

-P选项的命令格式:-P <plane_id>@<crtc_id>:<w>x<h>[+<x>+<y>][*<scale>][@<format>]

即 plane_id=173, crct_id=140

<w>x<h>=1920x1080设置分辨率。

设置后我们的连接状况如下:

PLANE(ID=173, W=1920, H=1080)

|

\ | /

CRCT(ID=140) --> ENCODER(ID=31) --> CONNECTED(ID=32) --> HDMI

buffer的创建是通过函数完成的,大小是从plane相匹配。

framebuffer是在modetest内部分配的,会根据设定的分辨率通过ioctl向驱动程序分配。

剩下的-a 和 -Ftiles两项,

“-a use atomic API“。

-F是指填充一种pattern,后面的值需要在modetest的源码里找,其他可用的值tiles、smpte、plain、gradient。

参考链接:

1.https://www.kernel.org/doc/html/v4.10/gpu/index.html

2.https://gitlab.freedesktop.org/drm/igt-gpu-tools

3.https://gitlab.freedesktop.org/mesa/kmscube

4.https://wiki.st.com/stm32mpu/index.php?title=DRM_KMS_overview&printable=yes#How_to_use_the_framework

kmscube

kmscube is a little demonstration program for how to drive bare metal graphics without a compositor like X11, wayland or similar, using DRM/KMS (kernel mode setting), GBM (graphics buffer manager) and EGL for rendering content using OpenGL or OpenGL ES.

是由mesa3d提供和维护,这是一个基于 KMS/GBM/EGL/OPENGL ES2.0 测试用例。

kmscude不依赖X11、wayland等窗口系统的简单图像测试程序。

GBM、EGL和OpenGL ES产生图形数据,再经由DRM/KMS显示。

GBM、EGL和OpenGL ES由mesa3D提供相关的库,DRM/KMS通过libdrm库进行访问。

所以kmscude同时包含OpenGL、EGL、GBM和DRM/KMS的基本用法。


代码下载和编译:

下载地址:https://gitlab.freedesktop.org/mesa/kmscube

编译:

meson . build && ninja -C build

编译成功后,build路径下会生成可执行文件:

ls build/

build.ninja             kernel.trace   kmscube-l.profile   kmscube.profile  'kmscube@exe'/   meson-logs/      oprofile_data/  'texturator@exe'/

compile_commands.json   kmscube*       kmscube.1.trace     kmscube.trace     meson-info/     meson-private/   texturator*


测试实例:

进入到build命令,通过如下命令查看kmscude的帮助信息:

./kmscube --help

./kmscube: unrecognized option '--help'

Usage: ./kmscube [-ADfMmSsVv]

options:

-A, --atomic             use atomic modesetting and fencing

-c, --count              run for the specified number of frames

-D, --device=DEVICE      use the given device

-f, --format=FOURCC      framebuffer format

-M, --mode=MODE          specify mode, one of:

smooth    -  smooth shaded cube (default)

rgba      -  rgba textured cube

nv12-2img -  yuv textured (color conversion in shader)

nv12-1img -  yuv textured (single nv12 texture)

-m, --modifier=MODIFIER  hardcode the selected modifier

-p, --perfcntr=LIST      sample specified performance counters using

the AMD_performance_monitor extension (comma

separated list, shadertoy mode only)

-S, --shadertoy=FILE     use specified shadertoy shader

-s, --samples=N          use MSAA

-V, --video=FILE         video textured cube (comma separated list)

-v, --vmode=VMODE        specify the video mode in the format

<mode>[-<vrefresh>]

基本用法:

sudo ./kmscube -A -D /dev/dri/card0 -M smooth

说明:

-A:DRM/KMS使用atomic模式

-D:指定设备节点,DRM/KMS和GPU是同一个设备节点

-M:指定OpenGL的绘图模式,可选的值包括:smooth、rgba、nv12-2img、nv12-1img

测试结果如下:

参考链接:

.https://gitlab.freedesktop.org/mesa/kmscube

linux DRM/KMS 测试工具 modetest、kmscude、igt-gpu-tools (一)相关推荐

  1. 【Linux 系统启动优化测试工具的使用——grabserial 】

    Linux 系统启动优化测试工具的使用--grabserial Linux 系统启动优化测试工具的使用--grabserial 1.grabserial工具安装 2.grabserial工具使用 3. ...

  2. linux服务器测试软件,linux服务器常用测试工具及命令

    linux服务器常用测试工具及命令 1. 服务器配置查看 执行teddysun大牛的bench.sh脚本,输入下列命令: wget -qO- bench.sh | bash 拿腾讯云的香港轻量级服务器 ...

  3. Linux平台代码覆盖率测试工具GCOV的前端工具LCOV简介

    本博客 http://blog.csdn.net/livelylittlefish 贴出作者(三二一@小鱼)相关研究.学习内容所做的笔记,欢迎广大朋友指正! Content 1. Lcov是什么? 2 ...

  4. Linux平台代码覆盖率测试工具GCOV简介

    本博客 http://blog.csdn.net/livelylittlefish 贴出作者(三二一@小鱼)相关研究.学习内容所做的笔记,欢迎广大朋友指正! Content 1. gcov是什么? 2 ...

  5. linux 服务器 硬盘测试工具,Linux 下的硬盘读写速度测试工具

    Linux 下的硬盘读写速度测试工具 执行一下以下命令看看你服务器的磁盘性能如何. hdparm -Tt /dev/sda 以下是 2块 希捷 ES2 SATA 500G 做 Raid0 的速度 [r ...

  6. Linux入门 内存测试工具(Memtest86+)

    分享一下我老师大神的人工智能教程.零基础!通俗易懂!风趣幽默!还带黄段子!希望你也加入到我们人工智能的队伍中来!https://blog.csdn.net/jiangjunshow 一.memtest ...

  7. linux下稳定性测试工具(拷机工具)

    http://blog.xok.la/2009/07/linux_test_kaoji.html 在网上查了有如下些: stresslinux super pi prime mprime nbench ...

  8. windows linux 并发,Windows/Linux安装压力测试工具siege

    Siege是一款高性能的Http压力测试工具. Siege支持身份验证.cookies.http.https和ftp协议. Linux安装Siege 如果要支持https,需要先下载安装openssl ...

  9. ab测试工具 linux,超实用压力测试工具-ab工具

    写在前面 在学习ab工具之前,我们需了解几个关于压力测试的概念吞吐率(Requests per second) 概念:服务器并发处理能力的量化描述,单位是reqs/s,指的是某个并发用户数下单位时间内 ...

最新文章

  1. kotlin 反射java类_关于Kotlin反射中实例化类的问题
  2. 利用 python 的各种开源工具自制浏览器
  3. DL之SPP-Net:SPP-Net算法的简介(论文介绍)、架构详解、案例应用等配图集合之详细攻略
  4. 圆锥破碎机常见故障_圆锥破碎机飞车危害大! 7种原因早知道早预防
  5. linux-shell命令之rm(remove)【删除文件或目录】
  6. java顺序栈和链栈_Java的顺序栈和链式栈
  7. 访问修饰符,封装,继承
  8. Node.js设置CORS跨域请求中多域名白名单的方法
  9. 使用os.system调用外部程序,如wget下载
  10. mysql 事务 游标_mysql之——存储过程 + 游标 + 事务
  11. 视频过大怎么压缩变小
  12. elasticsearch(七)java 搜索功能Search Request的介绍与使用
  13. 【大云制造】大云PaaS平台BC-PaaS V2.4—— 治理微服务,纳管中间件,平台能力更全面!...
  14. JAVA中如何计算文具店总费用,文具店的连锁属于。
  15. Nginx实现文件共享
  16. 定时将redis数据存入mysql_Python定时从Mysql提取数据存入Redis的实现
  17. 【YbtOJ 线段树 - 2】公园遛狗
  18. 全球及中国组织工程医疗产品行业深度分析及十四五前景预测报告2022年版
  19. AutoCAD Electrical(ACE)的基本操作——画布与新建圆、直线
  20. 【C#】SharpDevelop使用教程,C#写windows下第一个窗口程序,简单粗暴,初学者进,全图文,一看就明白

热门文章

  1. 如何用Git将代码上传到GitHub
  2. 软考-信息安全工程师-1
  3. 关于Hystrix整合ribbon调用其他服务时 首次进入回退
  4. 酷家乐怎样把两个方案合并_两个地产科技的理工男联姻:他们都想做一家云端的Autodesk...
  5. ACM投稿版权信息去除问题
  6. linux怎么sftp传文件,Linux 如何使用SFTP命令传输文件
  7. 【已解决】sftp命令没有反应
  8. mysql免安装版安装教程
  9. POJ - 1789 Truck History (最小生成树)
  10. react-router(路由)