我的显示器显示的所有内容都是粉绿色
我在 Windows 中遇到了同样的问题,但通过更改显示器的像素格式解决了这个问题YCbCr 4:4:4到全 RGB 4:4:4在AMD Radeon 软件。但是我如何在 Ubuntu 中做到这一点?
我有Ryzen 5 5600G(无独立显卡)+三星显示器
答案1
驱动amdgpu
程序不支持切换显示像素格式。人们正在/曾经致力于修复该功能,但由于各种问题,尚未完成。请参阅这个 GitLab 问题了解详情。
然而,黑客涉及更改显示器的 EDID 数据,以便它仅报告支持 RGB 而不是 YCbCr。其工作原理如下:
- 安装
wxedid
(必须启用宇宙知识库首先)使用
sudo apt update && sudo apt install wxedid
使用 查找显示器的 EDID 存储位置
xrandr --props
,然后查找显示器的 EDID 列出位置。如果您使用的是 Wayland,则可能需要切换到 xorg首先,为了使这个工作正常进行。从显示器获取 EDID 数据并将其复制到设备上的文件中
cp /substitute/this/with/whatever/you/found/from/the/last/step ~/edid.bin
运行
wxedid
并编辑edid.bin
主目录中的文件。执行以下操作:- 查找 SPF:支持的功能 -> vsig_format -> 将 0b01 替换为 0b00
- 找到 CHD: CEA-861 标头 -> 将 YCbCr420 和 YCbCr444 的值更改为 0
- 重新计算校验和:选项 > 重新计算校验和
- 保存文件
告诉内核使用该文件:
sudo mkdir /lib/firmware/edid
sudo mv edid.bin /lib/firmware/edid/edid.bin
- 编辑 Grub添加以下内核参数:
drm.edid_firmware=HDMI-A-1:edid/edid.bin
- 重新生成你的 initramfs
- 重启
答案2
我尝试使用这些说明,但在转储 edid.bin 时遇到了麻烦。混合使用 printf 和 perl 似乎终于可以将 ascii 转换为 hex:
printf '%b' $(xrandr --props | perl -pe 's/^((?![[:xdigit:]]{32}).)*$//g ; s/[\s\t]+//g ; s/([[:xdigit:]]{2})/\\x\1/g') > edid.bin
单独使用表达式来检查输出:
xrandr --props | perl -pe 's/^((?![[:xdigit:]]{32}).)*$//g ; s/[\s\t]+//g'
xrandr --props | perl -pe 's/^((?![[:xdigit:]]{32}).)*$//g ; s/[\s\t]+//g ; s/([[:xdigit:]]{2})/\\x\1/g'
perl 仅捕获包含 32 个十六进制字符的行,删除空格/制表符,然后将每个两位数字对重新格式化为 \x##,以便 printf 解释转义序列以输出十六进制。另一个接受方法使用 edid-decode:
xrandr --verbose | edid-decode - edid.bin
由于存在多个 edid,因此它无法在多显示器环境中工作。