RK3588 硬件鼠标模式 —— 鼠标叠加层、光标闪烁问题
参考链接
https://github.com/radxa/kernel/pull/50 https://github.com/radxa/kernel/pull/50/changes/373865a9e5ca2d007ef7057d0ea2349d5f8245de https://forum.radxa.com/t/flickering-cursor/13398/14
问题
3588 Ubuntu Gnome系统,基于Ubuntu-Base构建,加入libmali等显卡库,使能了桌面加速。但光标有个问题,一般情况下正常,如果点击应用打开,变为加载的旋转图标,这个加载过程中会闪烁。
分析
使用的是软件鼠标,也就是光标变化时触发局部重绘。软件光标是靠桌面环境(比如 Xorg 或 Wayland)直接把鼠标的图案画在主帧缓冲区 (Framebuffer) 里,也就是和桌面背景、应用程序画在同一张图上。桌面的显卡相关配置不对,就可能有这个问题。如果使用硬件光标,则是利用显示控制器(比如 RK3588 里的 VOP2)中一个独立的硬件图层 (Overlay Plane) 来显示鼠标的。移动鼠标,主屏幕上的画面根本不需要重绘。
如何使用硬件光标模式
设备树中修改图层,指定图层为cursor层
diff --git a/kernel/arch/arm64/boot/dts/rockchip/rk3588-evb.dtsi b/kernel/arch/arm64/boot/dts/rockchip/rk3588-evb.dtsi
index e5214182f..0c7e34ec9 100755
--- a/kernel/arch/arm64/boot/dts/rockchip/rk3588-evb.dtsi
+++ b/kernel/arch/arm64/boot/dts/rockchip/rk3588-evb.dtsi
@@ -1208,19 +1208,23 @@
&vp0 {
rockchip,plane-mask = <(1 << ROCKCHIP_VOP2_CLUSTER0 | 1 << ROCKCHIP_VOP2_ESMART0)>;
rockchip,primary-plane = <ROCKCHIP_VOP2_ESMART0>;
+ cursor-win-id = <ROCKCHIP_VOP2_CLUSTER0>;
};
&vp1 {
rockchip,plane-mask = <(1 << ROCKCHIP_VOP2_CLUSTER1 | 1 << ROCKCHIP_VOP2_ESMART1)>;
rockchip,primary-plane = <ROCKCHIP_VOP2_ESMART1>;
+ cursor-win-id = <ROCKCHIP_VOP2_CLUSTER1>;
};
&vp2 {
rockchip,plane-mask = <(1 << ROCKCHIP_VOP2_CLUSTER2 | 1 << ROCKCHIP_VOP2_ESMART2)>;
rockchip,primary-plane = <ROCKCHIP_VOP2_ESMART2>;
+ cursor-win-id = <ROCKCHIP_VOP2_CLUSTER2>;
};
&vp3 {
rockchip,plane-mask = <(1 << ROCKCHIP_VOP2_CLUSTER3 | 1 << ROCKCHIP_VOP2_ESMART3)>;
rockchip,primary-plane = <ROCKCHIP_VOP2_ESMART3>;
+ cursor-win-id = <ROCKCHIP_VOP2_CLUSTER3>;
};
这种修改方式有一定的问题,在单个屏幕上正常,但是光标在多个屏幕跨屏后光标会消失,根据官方文档是需要安装SDK中的libdrm-cursor包。
这就等于在物理层面定死了规矩:CLUSTER0 从今往后就是 type=2 的专属光标层。桌面管理器拿到这个标准的独立硬件通道后,鼠标就会变得极致丝滑,完全不和主桌面抢夺渲染资源。当然,代价是当前屏幕会少一个用于视频硬解的 Overlay 叠加层。
修改后验证
- 查看图层,参考《05.2 Ubuntu 开发指南\DRM 图层查看 —— modetest\DRM 图层查看 —— modetest.md》
- 硬件鼠标相关参考《Rockchip_Developer_Guide_Debian_CN.pdf》9.11 Debian中怎么确认硬件⿏标图层有⽤起来
留下评论