无法在 xrandr 中为外部显示器添加新模式

无法在 xrandr 中为外部显示器添加新模式

今天我试图将第二台显示器连接到我的笔记本电脑。我有:

  • 英伟达显卡
  • 304.43驱动程序[支持xrandr 1.2]
  • archlinux [最新]
  • 真棒wm
  • 兰德尔1.3

我的问题是我的外接显示器 (VGA) 的分辨率大于 640x480。 xrandr -q:

Screen 0: minimum 8 x 8, current 1920 x 800, maximum 8192 x 8192
VGA-0 connected 640x480+1280+0 (normal left inverted right x axis y axis) 0mm
   640x480        59.9*+
   320x240       120.1  
LVDS-0 connected 1280x800+0+0 (normal left inverted right x axis y axis) 331m
   1280x800       59.9*+
HDMI-0 disconnected (normal left inverted right x axis y axis)

正如我们所看到的,VGA 的分辨率没有更高,所以我添加了新模式:

xrandr --newmode $(gtf 1280 1024 70.4 | grep Modeline | sed s/Modeline\ // | tr -d '"')

我检查了Windows下可用的分辨率和刷新率:其中之一是1024x768x70(我的显示器的OSD说是70.4HZ)。创建新模式后,我想添加它:

xrandr --addmode VGA-0 1280x1024_70.40

而且......它失败了:

X Error of failed request:  BadMatch (invalid parameter attributes)
  Major opcode of failed request:  153 (RANDR)
  Minor opcode of failed request:  18 (RRAddOutputMode)
  Serial number of failed request:  29
  Current serial number in output stream:  30

从谷歌我了解到,在较旧的 xrandr / nvidia 驱动程序中,可用模式列表存在问题,但现在有了 nvidia 驱动程序对 xrandr 1.2 的支持,情况应该会更好。我也尝试使用较低的分辨率和刷新率(例如1024x768x50),但我遇到了同样的错误。我不知道该怎么解决这个问题......

答案1

我不确定您是否xrandr --newmode自己创建了后面的字符串,或者是否从其他地方复制了它,但它无法以当前的形式工作。

我建议逐步进行。

首先,您需要生成新模式。我建议 LCD 显示器使用 60Hz,CRT 显示器使用 85Hz

gtf 1280 1024 60

你会得到类似的东西:

 # 1280x1024 @ 60.00 Hz (GTF) hsync: 63.60 kHz; pclk: 108.88 MHz 
 Modeline "1280x1024_60.00"  108.88  1280 1360 1496 1712  1024 1025 1028 1060  -HSync Vsync

然后将此模式呈现给xrandr使用--newmode(复制粘贴以“Modeline”开头的行。

 xrandr --newmode "1280x1024_60.00"  108.88  1280 1360 1496 1712  1024 1025 1028 1060  -HSync Vsync

然后将此模式添加到VGA-0:

xrandr --addmode VGA-0 "1280x1024_60.00"

最后你可以使用这个新模式:

 xrandr --output VGA-0 --mode 1280x1024_60.00

答案2

我遇到了 BadMatch 错误问题,直到我删除了之前添加的“1280x1024_60.00”,因为它永远无法成功使用双引号模式。最终,意识到该模式的更好名称有所帮助。

所以我通过以普通用户身份运行以下命令删除了“1280x1024_60.00”:

$ xrandr --version 
reports 1.4.0 and 1.4
$ xrandr | grep 1280 #Do you see any 1280x1024 anywhere?  Does it have double quotes?
$ xrandr --verbose --delmode VGA1 '"1280x1024_60.00"'
$ xrandr --verbose --rmmode '"1280x1024_60.00"' 

删除和删除系统中的垃圾通常不起作用或会回来,即使我会从我的帐户和根目录中删除它。它通常会返回名为 VIRTUAL1 而不是 VGA1 的输出。

发现留下垃圾信息并在我新创建的模式末尾添加一个字母甚至删除 .00 更容易,所以1280x1024_60B。请仔细注意下面的 --newmode 参数周围有双引号,但不是 --addmode 也不是 --mode

$ xrandr --verbose --newmode "1280x1024_60B" 108.88 1280 1360 1496 1712 1024 1025 1028 1060 -HSync +Vsync
$ xrandr --verbose --addmode VGA1 1280x1024_60B
$ xrandr --verbose --output VGA1 --mode 1280x1024_60B

屏幕有点闪烁,我的外部 19 英寸方形显示器以 1280x1024 的分辨率运行。

答案3

如果您在 VM(特别是 VirtualBox)上运行 Linux,请确保 VM 有足够的视频内存。

尝试运行 xrandr 时,视频内存太少会导致此错误。

答案4

如果您的显示器实际上支持该模式,您可以使用以下 Xorg 配置选项强制它:

Option         "ModeValidation" "AllowNonEdidModes"

这允许强制 GPU 进入与所连接显示器的 EDID 数据不符的模式。有时显示器实际上支持未列出的显示模式,但在最坏的情况下,系统可能认为它有效,但最终会出现完全空白的屏幕。如果发生这种情况,请准备好恢复正确的显示模式的计划。

众所周知,Nvidia GPU 对 EDID 数据支持的模式非常挑剔。

相关内容