HDR 视频早已不是什么新鲜格式,但“在桌面 UI 框架里正确显示 HDR”至今仍然是一件麻烦事。问题通常不在解码器,也不在 GPU。FFmpeg 能解 PQ、HLG,shader 能做色域转换,显卡和显示器也能处理 10 bit 或 fp16;真正容易断掉的,是 UI framework 到窗口系统之间那一段。
一个窗口想显示 HDR,至少要同时满足三件事:render target 能保存超出 0 到 1 的值;compositor 知道这些数值采用什么 primaries 和 transfer function;应用写进去的内容与 surface 声明完全一致。只做到其中一两项,得到的往往是整体发灰、过暗、偏色,或者高光直接被截成白色。
本文记录的是一次给 AvaloniaUI 补上 WCG/HDR 输出链路的实现。重点放在 Wayland,因为这里既要和 EGL driver 协商 buffer,又要和 compositor 协商 color description。Windows 和 Web 的原理相同,只是平台接口更短,会放在最后说明。