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的基本用法。
 

 
代码下载和编译:
 
编译:
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
 
测试结果如下:
 

 
参考链接:

------------恢复内容开始------------

这里整理几个在学习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
 
代码编译:
解压代码后,进入目录执行:
 
# ./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输出:
@alarm /h/a/w/l/l/t/mocdetest# ./modetest -M vc4 -D root -a setting mode 192øx1Ø8Ø-6ØHz on connectors 32, crtc 140 testing 192øx1Ø8Ø@XR24 on plane 173, crtc 140 -Ftiles
程序运行效果如下,通过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。
 
参考链接:
 
 

------------恢复内容结束------------

linux DRM/KMS 测试工具 modetest、kmscude、igt-gpu-tools (二)的更多相关文章

  1. linux DRM/KMS 测试工具 modetest、kmscude、igt-gpu-tools (一)

    这里整理几个在学习Linux DRM/KMS中用到的几个工具,modetest.kmscude.igt-gpu-tools. 简介: modetest 是由libdrm提供的测试程序,可以查询显示设备 ...

  2. Linux DRM KMS 驱动简介【转】

    转自:https://blog.csdn.net/yangkuanqaz85988/article/details/48689521 Whoops,上次写完<Linux DRM Graphic ...

  3. linux的压力测试工具

    只能用于http的测试工具: ab: 安装方法:yum install httpd-tools -y 使用:ab -c 1000 -n 10000 + ip            -c 为并发数,-n ...

  4. linux 磁盘IO测试工具:FIO (同时简要介绍dd工具测试)

    FIO是测试IOPS的非常好的工具,用来对硬件进行压力测试和验证.磁盘IO是检查磁盘性能的重要指标,可以按照负载情况分成照顺序读写,随机读写两大类. 目前主流的第三方IO测试工具有fio.iomete ...

  5. Kail Linux渗透测试之测试工具Armitage

    Kali Linux下的Armitage是一个很强大的渗透工具,图形化操作页面,但我们把kali linux装在虚拟机里面,然后再启动armitage就会出现一个error,他会给你一个message ...

  6. linux ab压力测试工具及ab命令详解

    原文链接:https://blog.csdn.net/qq_27517377/article/details/78794409 yum -y install httpd-tools ab -v 查看a ...

  7. Linux 监测 常用测试工具

    fio [global]bs=16kdirect=1rw=readioengine=libaioiodepth=6write_bw_logruntime=60[test]filename=/data/ ...

  8. 覆盖率测试工具gcov的前端工具_LCOV

    http://my.oschina.net/alphajay/blog/33725 1.Gcov是进行代码运行的覆盖率统计的工具,它随着gcc的发布一起发布的,它的使用也很简单,需要在编译和链接的时候 ...

  9. 后端程序员之路 30、webapi测试工具的一点想法

    有了webapi,对应的,也就要有各种语言的sdk,有时候,还要有一个好用的api测试工具.sdk和api测试工具在功能上有一些异同,有时候测试工具会直接基于sdk来制作. 它们通常包含: 1.htt ...

随机推荐

  1. Vue学习—— Vuex学习笔记

    组件是Vue最强大的功能之一,而组件实例的作用域是相互独立的,意味着不同组件之间的数据是无法相互使用.组件间如何传递数据就显得至关重要,这篇文章主要是介绍Vuex.尽量以通俗易懂的实例讲述这其中的差别 ...

  2. The Preliminary Contest for ICPC Asia Xuzhou 2019 徐州网络赛 D Carneginon

    Carneginon was a chic bard. But when he was young, he was frivolous and had joined many gangs. Recen ...

  3. 软件——IDEA中如何去掉警告虚线

    初次安装使用IDEA,总是能看到导入代码后,出现很多的波浪线,下划线和虚线,这是IDEA给我们的一些提示和警告,但是有时候我们并不需要,反而会让人看着很不爽,这里简单记录一下自己的调整方法,供其他的小 ...

  4. Java 经典面试题:聊一聊 JUC 下的 CopyOnWriteArrayList

    ArrayList 是我们常用的工具类之一,但是在多线程的情况下,ArrayList 作为共享变量时,并不是线程安全的.主要有以下两个原因: 1. ArrayList 自身的 elementData. ...

  5. E. Count The Blocks(找数学规律)

    \(\color{Red}{先说一下自己的歪解(找规律)}\) \(n=1是答案是10\) \(n=2时答案是180\) \(n=3时模拟一下,很容易发现答案是2610\ \ 180\ \ 10\) ...

  6. Java集合简单介绍

    再最前面分享一下我再学习集合时的方法: 1.首先了解各集合的定义和特点 2.集合的构造方法和常用方法(增删改查等) 3.了解集合使用的场景,再什么情况下使用什么类型的集合(关键是集合的特性) 4.了解 ...

  7. Web前端基础第一天

    Web标准的构成 结构:结构对于网页元素进行整理和分类,现阶段主要学的是html 表现:表现用于设置元素的板式.颜色.大小等外观样式,主要指的是CSS 行为:行为是指网页模型的定义及交互的编写,现阶段 ...

  8. leetcode_二叉树验证(BFS、哈希集合)

    题目描述: 二叉树上有 n 个节点,按从 0 到 n - 1 编号,其中节点 i 的两个子节点分别是 leftChild[i] 和 rightChild[i]. 只有 所有 节点能够形成且 只 形成 ...

  9. opencv-12-高斯滤波-双边滤波(附C++代码实现)

    开始之前 这几天由于自己的原因没有写, 一个是因为自己懒了, 一个是感觉这里遇到点问题不想往下写了, 我们先努力结束这个章节吧, 之前介绍了比较常用而且比较好理解的均值和中值滤波, 但是呢,在例程Sm ...

  10. 带你看看Java的锁(三)-CountDownLatch和CyclicBarrier

    带你看看Java中的锁CountDownLatch和CyclicBarrier 前言 基本介绍 使用和区别 核心源码分析 总结 前言 Java JUC包中的文章已经写了好几篇了,首先我花了5篇文章从源 ...