背景
平常工作中会涉及图形图像的问题,比如丢帧、黑屏等问题,处理底层问题较多,对DRM\KMS等相关知识一直比较模糊。平常想抽时间系统的学习下这部分知识,也是着手搭建下环境。因为前端时间有使用modetest工具,首先从本地编译运行modetest开始。
环境准备
modetest是由libdrm提供的测试程序,可以查询显示设备的支持状况,进行基本的显示测试,以及设置显示的模式。本地通过编译libdrm获取modetest工具,编译环境要求:python>3.6,本人使用的
vmware平台:ubuntu16.04
libdrm-2.4.112:入口
libdrm编译环境
python3.8下载
编译使用的是meson和ninja,需要首先准备python环境。ubuntu16.04默认是python2.7和pyhton3.5的,需要准备python3.6以上版本,本次使用的是python3.8.10,通过源码进行的编译。
python3.8源码:入口。(阿里镜像,下载很快)
//1、创建安装路径
mkdir /usr/local/python3.8
//2.如果不是root,需要赋权限
chmod 777 -R /usr/local/python3.8
//3、解压python3.8.10,运行环境配置
./configure --prefix=/usr/local/python3.8/
//4、编译安装
make && make install
//5、 设置默认python3.8为默认版本,删除原有的软连接,创建python3.8的新软连接
rm -rf /usr/bin/python3
ln -s /usr/local/python3.8/bin/python3.8 /usr/bin/python3
//6. 添加环境变量,在/etc/profile最后添加上
export PATH=/usr/local/python3.8/bin:$PATH
可以通过查看python确认是否安装成功:
更新pip3
更改python版本后会出现pip3兼容问题,当安装meson时报错:
subprocess.CalledProcessError: Command '('lsb_release', '-a')' returned non-zero exit status 1。
尝试了网上的很多版本未能成功,由于很多博主写文章的时候细节没有描述详细。
本人的解决方法:通过get-pip.py脚本重新安装。这里的get-pip.py和python版本一定要对应。
然后命令安装:
//python3 xxx, xxx为get-pip.py路径
python3 '/root/Desktop/Python-3.8.10/get-pip.py'
//查看版本是否成功
pip3 --version
meson安装
如果meson已经安装,可能版本比较老,可以先删除,然后通过pip3安装。这里需要先配置一下pip的国内源,不然meson可能会下载失败:
// 1、创建文件夹
mkdir ~/.pip
// 2、添加配置文件
gedit ~/.pip/pip.conf
//3、添加内容
[global]
index-url = http://mirrors.aliyun.com/pypi/simple
[install]
trusted-host=mirrors.aliyun.com//4、删除老的版本
rm -rf /usr/bin/meson//5、安装
pip3 install --user meson//6、查看版本
meson --version
ninja安装
下载: git clone https://github.com/ninja-build/ninja.git
//ninja依赖re2c
apt-get install re2c
//不是ninja需要的,不过不安装后面会报错:ERROR: Dependency "pciaccess" not found
apt-get install libpciaccess-dev pkg-config
//编译
./configure.py --bootstrap
//把ninja路径添加到环境变量:export PATH=xxx:$PATH
vim /etc/profile
libdrm编译
生成路径;build/tests/modetest/modetest
mkdir build && cd build && meson --buildtype=release -Dudev=true -Dvalgrind=false && ninja
验证
参数确认
modetest测试需要确认下gpu 驱动名和各个参数:
lshw -c video|grep config
参数确认:cat /sys/kernel/debug/dri/0/state,
connector中crtc-0的id:34;
crtc-0对应的id:36;
crtc-0对应的plane id:32
root@ubuntu:~/Desktop/# cat /sys/kernel/debug/dri/0/state
plane[32]: plane-0
crtc=crtc-0
fb=208
format=XR24 little-endian (0x34325258)
modifier=0x0
size=1655x966
layers:
pitch[0]=6620
offset[0]=0
crtc-pos=1655x966+0+0
src-pos=1655.000000x966.000000+0.000000+0.000000
rotation=1
....
crtc[36]: crtc-0
enable=1
active=1
planes_changed=1
mode_changed=0
active_changed=0
connectors_changed=0
color_mgmt_changed=0
plane_mask=1
connector_mask=1
encoder_mask=1
mode: 0:"1655x966" 59 120858 1655 1705 1755 1805 966 1016 1066 1116 0x0 0x6
...
connector[34]: Virtual-1
crtc=crtc-0
...
查看支持的mode参数:./modetest -M vmwgfx
Connectors:
id encoder status name size (mm) modes encoders
34 35 connected Virtual-1 0x0 19 35
modes:
index name refresh (Hz) hdisp hss hse htot vdisp vss vse vtot
#0 preferred 60.00 1655 1705 1755 1805 966 1016 1066 1116 120858 flags: nhsync, pvsync; type: preferred, driver
#1 2560x1600 59.99 2560 2752 3032 3504 1600 1603 1609 1658 348500 flags: nhsync, pvsync; type: driver
#2 1920x1440 60.00 1920 2048 2256 2600 1440 1441 1444 1500 234000 flags: nhsync, pvsync; type: driver
#3 1856x1392 60.00 1856 1952 2176 2528 1392 1393 1396 1439 218250 flags: nhsync, pvsync; type: driver
#4 1792x1344 60.00 1792 1920 2120 2448 1344 1345 1348 1394 204750 flags: nhsync, pvsync; type: driver
#5 1920x1200 59.88 1920 2056 2256 2592 1200 1203 1209 1245 193250 flags: nhsync, pvsync; type: driver
#6 1600x1200 60.00 1600 1664 1856 2160 1200 1201 1204 1250 162000 flags: phsync, pvsync; type: driver
#7 1680x1050 59.95 1680 1784 1960 2240 1050 1053 1059 1089 146250 flags: nhsync, pvsync; type: driver
#8 1400x1050 59.98 1400 1488 1632 1864 1050 1053 1057 1089 121750 flags: nhsync, pvsync; type: driver
#9 1280x1024 60.02 1280 1328 1440 1688 1024 1025 1028 1066 108000 flags: phsync, pvsync; type: driver
#10 1440x900 59.89 1440 1520 1672 1904 900 903 909 934 106500 flags: nhsync, pvsync; type: driver
#11 1280x960 60.00 1280 1376 1488 1800 960 961 964 1000 108000 flags: phsync, pvsync; type: driver
#12 1360x768 60.02 1360 1424 1536 1792 768 771 777 795 85500 flags: phsync, pvsync; type: driver
#13 1280x800 59.81 1280 1352 1480 1680 800 803 809 831 83500 flags: phsync, nvsync; type: driver
#14 1152x864 75.00 1152 1216 1344 1600 864 865 868 900 108000 flags: phsync, pvsync; type: driver
#15 1280x768 59.87 1280 1344 1472 1664 768 771 778 798 79500 flags: nhsync, pvsync; type: driver
#16 1024x768 60.00 1024 1048 1184 1344 768 771 777 806 65000 flags: nhsync, nvsync; type: driver
#17 800x600 60.32 800 840 968 1056 600 601 605 628 40000 flags: phsync, pvsync; type: driver
#18 640x480 59.94 640 656 752 800 480 489 492 525 25175 flags: nhsync, nvsync; type:
测试
接下来真正的验证,ubuntu虚拟机需要切换到命令行模式,否则界面模式下会占用dri设备导致运行modetest时提示:
failed to set mode : Permission denied
进入命令行模式方法:
ctrl+alt+f1
退出命令行模式方法:
ctrl+alt+f7
由第一步获取的参数组成命令:
modetest -M vmwgfx -s 34@36:1280x960
效果:
modetest -M vmwgfx -s 34@36:1280x960 -p 32@36:1280x960 -Ftiles
效果: