4k输出分为两种,屏输出3840*2160@60,一种是1920x1080分辨率的UI(拉伸到3840*2160),一种是点对点的3840*2160的UI,两种都支持60fps,但会出现DDR带宽不足的问题,会出现[drm:vop_isr] ERROR POST_BUF_EMPTY irq err这种错误,随之屏幕就会出现绿条纹的闪烁画面。这里是讲60fps情况下,因为30fps是正常的。
根据官方文档《RK3399_Android7.1_Software_Development_Guide》中的《9.7 DDR 带宽导致屏闪问题 Flicker issue caused by DDR bandwidth》解决,
1、先把dmc的频率调到最高,测试无效。
2、关闭负载变频,ddr频率拉到最大,测试无效。
3、vop-pn-msch-readlatency = <
0 0x20
4 0x20
>;
这个官方解释:vop-pn-msch-readlatency 这个参数指定了两列数据,第一列为 UI 的层数,第二列为 vop
获取 ddr 使用权限的延时,这个值越小,表示越容易获取访问权限,值为 0 表示默认值(默认值为
0x80),如果出现闪屏问题,建议将值改为 0x20,这个值不建议随意修改,并且这个值如果改动
可能会影响性能。目前默认的值,只会在 UI 为 4 层的场景下,将 vop 的 ddr read lantency 改为
0x20,也就是在 4 层场景下提升 vop 对 ddr 访问的时效性,从而让 vop 更快的获取到数据。
测试1080P下UI 有效,播放4K视频没问题。3840*2160 点对点UI播放4k视频没问题,但下拉菜单会出现绿条纹。也会出现带宽问题。
解决方案:
不采取官方文档的修改,关闭负载变频,将DDR频率拉到856M.
1、hardware\rockchip\libgralloc\Android.mk
ifneq ($(filter rk3399 rk3399pro, $(strip $(TARGET_BOARD_PLATFORM))), )
USE_AFBC_LAYER = 0 //改为0
ifeq ($(strip $(TARGET_BOARD_PLATFORM_PRODUCT)),box)
USE_AFBC_LAYER = 0
endif
2、device\rockchip\rk3399\device.mk
vendor.hwc.compose_policy=0 //改为GPU合成,默认是6,HWC合成
测试反馈:
3840*2160 UI @60fps 下的测试4K视频,HWC合成的优点对高码率的视频播放更流畅,但对DDR带宽要求更高,经测试H265码率大于50000kbps的视频播放会卡顿,小于50000kbps码率的视频播放正常,可以满足需求。