多屏扩展时内屏竖块乱序问题

2026-10-07 定位结论:内屏"竖块乱序 / 左半幅镜像"

现象:内屏(eDP,GPD1001H)显示为左半幅水平镜像 —— 用 4x4 十六格编号测试图判定,每行呈 2 1 3 4 / 6 5 7 8 / 10 9 11 12 / 14 13 15 16,右半幅正常。肉眼表现为"左红右蓝对半分、像同一张壁纸在循环"。

判别方法(可复用于任何"屏幕显示不对"的排查)

  1. 生成 4x4=16 格、每格一色 + 大号编号的测试图(不依赖字体库,手写点阵字体绘制)。
  2. 用 spectacle -b -n -f -o shot.png 抓全桌面(帧缓冲),按合成器几何裁出目标屏区域,程序采样每格 → 得到"合成器以为画成什么样"。
  3. 手机拍摄实际面板 → 得到"肉眼看到什么"。
  4. 两者比对即可把故障切分到"软件侧"或"链路/面板侧"。

证据(逐条)

编号观测结论
R01合成器帧缓冲里内屏区域 4x4 采样为标准 1..16Plasma / KWin / 壁纸配置侧无问题
R02qdbus org.kde.KWin /KWin supportInformation 的 Screen 几何与 xrandr 完全一致无几何错位、无缩放错配
R03DRM 原子状态中 eDP 所在 plane(crtc-0)rotation=1、src-pos=2560.0x1600.0+4000.0+0.0显示管线未启用任何镜像/旋转变换
R04面板 EDID 仅含 2560x1600@60.01 与 2560x1600@40.00 两条详细时序;8 条标准时序全部未使用;无扩展块无 scaler 的定频面板
R05内核给 eDP 的模式表为 2560x1600 x2、1920x1200、1920x1080、1600x1200… 即除前两条外均为驱动补的 VESA 兜底模式1920x1080 并非面板声明支持的时序
R06dp_dsc_fec_support:DSC_Sink_Support: no;dsc_* 全 0非 DSC 切片问题
R07link_settings: 4 0xa 0(4 lane @2.7Gbps = 10.8Gbps),原生 2560x1600@60 只需 6.88Gbps链路带宽不是瓶颈
R08把内屏切回原生 2560x1600 后,镜像依然存在不是"当前模式"在持续作用
R09对 eDP 做一次断电重初始化(output.eDP.disable → enable)后,镜像消失面板 TCON 锁存进入错误相位,只有断电重锁才能清除

根因

内屏是无 scaler 的定频面板,只按 2560x1600 采样。当它被喂过非 EDID 声明的兜底模式(本次为 1920x1080)时,面板按自己的行缓冲切流、锁错了相位,产生"左半幅镜像";该错误锁存会跨多次 modeset 存活(切回原生也不自愈),只有面板断电重新上电才会重新锁定。故障发生在链路/面板侧,与 X / KWin / Plasma / 壁纸配置无关。

修复(一条命令)

kscreen-doctor output.eDP.disable && sleep 3 && kscreen-doctor output.eDP.enable output.eDP.mode.93 output.eDP.position.4000,0

(mode.93 = 内屏原生 2560x1600;mode id 可用 kscreen-doctor -j 查 eDP 的 2560x1600 条目确认。)

规避建议

  • 内屏保持原生 2560x1600;若想让界面更大,用 KDE 的缩放(如 125%/133%)得到更小的逻辑分辨率,而不是切非原生模式。
  • 若为多屏带宽/布局原因确需非原生模式,出现镜像后按上面的命令断电重锁。

本机环境(发生时的状态)

项值
机型GPD G1619-04(内屏 GPD1001H,2560x1600)
系统NixOS 26.05.11045 / 内核 6.18.54 LTS
会话X11 + KDE Plasma 6.6.6(startplasma-x11)
显示配置services.xserver.videoDrivers = [ "amdgpu" "nvidia" ],hardware.nvidia.prime.reverseSync.enable = true(4060 输出以 reverse PRIME 接入核显主屏)
当时连接内屏 + 屏1(4060 DP)+ 屏2(屏1 菊花链,竖屏)