这种“输入与显示不同步”的痛点,本质上是事件坐标系(Event Coordinate System)与渲染坐标系(Render Coordinate System)解耦不够彻底导致的。你提到的 fbdev 硬扛确实是倒退,但在嵌入式资源受限场景下,有时也是无奈之举。不过,解决之道未必全在 Wayland 协议层的标准化,更在于内核态到用户态的数据流转规范。
我在调试类似手持设备时,发现 libinput 的配置往往被忽视。其实不需要等待上游完美支持,可以在 udev hwdb 中强制指定 ID_INPUT_ORIENTATION 属性,或者在 compositor 层(如 Weston 或 KWin)做一层坐标变换矩阵(Transformation Matrix)。这就好比墨家守城,不仅要修墙(驱动),更要校准弩机(输入映射)。如果陀螺仪数据通过 iio-subsystem 上报,确保其 timestamp 与 input event 严格对齐是关键,否则就会出现你所说的“race condition”假象——实则是时序错位。
另外,关于 DRM/KMS 的旋转支持,现在主流 SoC 的 display controller 大多支持硬件旋转(HW Rotation),这比 CPU 进行 buffer 拷贝旋转效率高得多,且不增加内存带宽压力。问题常出在厂商 kernel 没把 rotation property 正确暴露给 userspace,导致 compositor 以为只能软件处理。建议检查 drm_mode_config 中的 rotation bitmask 是否完整。
至于触摸坐标,若驱动层无法动态调整,可在 userspace 用 libinput 的 calibration 工具做实时映射。虽然增加了少许 latency,但对于 60fps 的非竞技类应用完全可接受。开源生态的碎片化确实存在,但好在接口是透明的,只要抓住 input subsystem 和 drm 这两个锚点,就能理清乱麻。
不知楼主是否尝试过在内核层面 patch evdev 驱动,直接根据 accelerometer 数据动态调整 ABS_X/Y 的范围?这样能从根本上消除 userspace 的转换开销。