RK3588 VOP图层分配介绍

RK3588 VOP图层分配介绍

RK3588图层介绍

RK3588有8个图层,分别是Custer 0/1/2/3 和Esmart 0/1/2/3,两种图层的能力不一样,具体如下:

  • Custer
  1. 分辨率:最大分辨率包括两种合并集群和单集群,分别为7680x4320和4096x4320。
  2. 数据格式:支持多种数据格式,包括RGBA8888/RGB888/RGB565/RGBA1010102/YUV420(8,10bit)/YUV422(8,10bit)。
  3. 图像支持:支持虚拟宽度、活动偏移、显示偏移、Y镜像、X镜像、旋转90度/270度等。
  4. 集群线缓冲模式:支持三种模式,包括1x4096宽度的模式、2x2048宽度的模式和1x2048宽度的AFBCD旋转层模式。
  5. 集群支持的功能包括:支持高斯滤波、缩放、色彩空间转换等。
  • Esmart
  1. 分辨率:支持分辨率分别为7680x4320和4096x4320。
  2. 数据格式:数据格式包括RGB、YUV、YUYV等,支持多种颜色深度8BPP。
  3. 图像支持: 支持虚拟宽度、活动偏移、显示偏移、Y镜像、颜色交换、YUV剪切等图像功能。
  4. 集群线缓冲模式:支持多区域显示,每个区域最大支持一个像素点,最多支持4个区域。
  5. 支持缩放功能,包括缩放率和缩放模式,支持缩小和放大,缩放率范围为1/8~1,缩放模式包括最近邻插值、双线性插值和三线性插值。
  6. 支持YUV到RGB和RGB到YUV的转换,支持多种色彩空间。

图层分配策略

VOP2 采用统一显示架构,各个独立的 Video Port 共享 VOP 内部的所有图层资源,而且这些图层需要排他性的使用,即某个图层在同一时刻只能为其中一个 Video Port 所独占。

为了充分合理的使用所有图层资源,我们会根据当前产品 dts 配置的接口类型和数量在 U-Boot 中生成了一种默认的图层分配策略,如果有些产品没有开 U-Boot logo 显示或者对图层使用有特殊的需求,可以参考下面的写法在 dts 根据需求自行指定图层分配策略:

rockchip,plane-mask:指定分配给该 VP 的图层 ID 掩码集合,图层 ID 定义在 dt-bindings/display/rockchip_vop.h 中。

rockchip,primary-plane:指定 primary 图层,当前 VP 的 primary 图层一定是 rockchip,plane-mask 中的一个,我们一般选用 Smart 或者 Esmart 图层。

图层分配的基本原则是:把所有图层(rk3568 有 6 个图层,rk3588 有 8 个图层)平均分配给各个使用的 VP,不使用的 VP 一般不分配图层。由于 VOP 内部不同类型(Cluster,Esmart,Smart)的图层,性能,限制不同,一般推荐各种类型的图层平均搭配分配。

如下是一个 RK3568 上的典型图层分配参考, RK3568 VOP 一共有 6 个图层(2 Cluster + 2 Esmart + 2 Smart),该配置支持三屏异显。一般,我们尽量给使用场景最多的屏幕(主屏) 对应的 VP 分配三个以上的图层(在该应用案例下是 VP1),其他接口尽量分配不少于两个图层。

#include <dt-bindings/display/rockchip_vop.h>        // 图层 ID 定义头文件

&vp0 {
	rockchip,plane-mask = <(1 << ROCKCHIP_VOP2_CLUSTER1 | 1 << ROCKCHIP_VOP2_SMART1)>;
	rockchip,primary-plane = <ROCKCHIP_VOP2_SMART1>;
};

&vp1 {
	rockchip,plane-mask = <(1 << ROCKCHIP_VOP2_CLUSTER0 | 1 << ROCKCHIP_VOP2_ESMART0 | 1 << ROCKCHIP_VOP2_SMART0)>;
	rockchip,primary-plane = <ROCKCHIP_VOP2_SMART0>;
};

&vp2 {
	rockchip,plane-mask = <(1 << ROCKCHIP_VOP2_ESMART1)>;
	rockchip,primary-plane = <ROCKCHIP_VOP2_ESMART1>;
};

配置生效后,系统启动的时候可以从 U-Boot 和 Linux kernel 的启动 log 中看到对应的 plane mask 解析信息。

Rockchip UBOOT DRM driver version: v1.0.1
VOP have 3 active VP
vp0 have layer nr:2[1 5 ], primary plane: 5
vp1 have layer nr:3[0 2 4 ], primary plane: 4
vp2 have layer nr:1[3 ], primary plane: 3
Using display timing dts
dsi@fe060000:  detailed mode clock 132000 kHz, flags[8000000a]
    H: 1080 1095 1097 1127
    V: 1920 1935 1937 1952
bus_format: 100e
VOP update mode to: 1080x1920p0, type: MIPI0 for VP1
VOP VP1 enable Smart0[654x270->654x270@213x825] fmt[2] addr[0x7df04000]
final DSI-Link bandwidth: 876 Mbps x 4
disp info 0, type:11, id:0
xfer: num: 2, addr: 0x50
xfer: num: 2, addr: 0x50
[2.314574] panel-simple-dsi fe060000.dsi.0: Specify missing connector_type
[2.315764] rockchip-vop2 : [drm:vop2_bind] vp0 assign plane mask: 0x22, primary plane phy id: 5
[2.315807] rockchip-vop2 : [drm:vop2_bind] vp1 assign plane mask: 0x15, primary plane phy id: 4
[2.315828] rockchip-vop2 : [drm:vop2_bind] vp2 assign plane mask: 0x8, primary plane phy id: 3
[2.316713] rockchip-drm display-subsystem: bound fe040000.vop (ops vop2_component_ops)
[2.317966] rockchip-drm display-subsystem: bound fe0c0000.edp (ops rockchip_dp_component_ops)
[2.318378] dwhdmi-rockchip : Detected HDMI TX controller v2.11a with HDCP (DWC HDMI 2.0 TX PHY)
[2.319625] dwhdmi-rockchip : registered DesignWare HDMI I2C bus driver
[2.321857] rockchip-drm display-subsystem: bound fe0a0000.hdmi (ops dw_hdmi_rockchip_ops)
[2.322069] rockchip-drm display-subsystem: bound fe060000.dsi (ops dw_mipi_dsi_rockchip_ops)

RK3566 图层分配策略

RK3566 IC 实现上有主图层和镜像图层的区别,即镜像图层 Cluster1 只能从主图层 Cluster0 对应的地址取数,同理 Esmart1/Smart1 只能从 Esmart0/Smart0 对应的地址取数,所以我们需要保证主图层被优先使用。正常产品的 U-Boot 显示驱动中会根据显示接口的类型设置好 plane-mask 属性,如果有些产品没有开 U-Boot logo 显示,可以在 dts 中按以下规则配置:

  1. 只有一个屏显示,可以使用如下配置:
#include <dt-bindings/display/rockchip_vop.h>	//图层 ID 定义头文件

&vpx {	//x 取决于使用的 vp id,如 vp0
	rockchip,plane-mask = <(1 << ROCKCHIP_VOP2_CLUSTER0 | 1 << ROCKCHIP_VOP2_ESMART0 | 1 << ROCKCHIP_VOP2_SMART0 | 1 << ROCKCHIP_VOP2_CLUSTER1 | 1 << ROCKCHIP_VOP2_ESMART1 | 1 << ROCKCHIP_VOP2_SMART1)>;
	rockchip,primary-plane = <ROCKCHIP_VOP2_SMART0>;
};
  1. 有两个屏显示【RK3566 目前只有 android 产品支持双显,且要求两个屏刷新帧率一致】,那我们让不支持热插拔设备(即始终连接显示的通路)使用主图层,另一个通路使用镜像图层:
#include <dt-bindings/display/rockchip_vop.h>	//图层 ID 定义头文件

&vpx {	//x 取决于使用的 vp id,如 vp0
	rockchip,plane-mask = <(1 << ROCKCHIP_VOP2_CLUSTER0 | 1 << ROCKCHIP_VOP2_ESMART0 | 1 << ROCKCHIP_VOP2_SMART0)>;
	rockchip,primary-plane = <ROCKCHIP_VOP2_SMART0>;
};	//单显或者双显时不支持热插拔的主显示设备使用主图层

&vpx {	//x 取决于使用的 vp id,如 vp1
	rockchip,plane-mask = <(1 << ROCKCHIP_VOP2_CLUSTER1 | 1 << ROCKCHIP_VOP2_ESMART1 | 1 << ROCKCHIP_VOP2_SMART1)>;
	rockchip,primary-plane = <ROCKCHIP_VOP2_SMART1>;
};

把某个图层设置为鼠标层

应用如果使用 Atomic 显示接口,可以不区分图层的类型(primary, overlay, cursor), 只需要根据图层支持的格式,使用任意可以使用的图层做各种类型的显示。

但是在 Linux 系统(非 Android) 下,还有一些应用使用 legacy 的 API,这些 API 对图层类型比较在意,比如使用 primary 图层显示桌面背景,使用 overlay 图层播放视频,使用 cursor 图层显示鼠标。

Rockchip drm 驱动默认只注册 primary 图层和 overlay 图层,不注册 cursor 图层,如果一些特殊的 Linux 系统希望使用 cursor 图层,可以在 dts 中对应的 vp 节点下设置 cursor-win-id 属性,为该 VP 对应的 crtc 分配一个 cursor 图层。

&vp0 {
	cursor-win-id = <ROCKCHIP_VOP2_CLUSTER0>;
};

图层和 VP 之间的的连接关系

对于 RK356X/RK3588/RK3562 每一个图层和任意 VP 都有连接的,配置上没有特殊要求;对于 RK3528 和 RK3576 并不是每一个图层都可以连接到任意 VP 上,所以配置 VP 的 cursor 图层的时候需要选择能连接到当前 VP 的图层,以下是不同平台图层和 VP 的连接关系:

  1. RK3528
VP图层
VP0Cluster0、Esmart0、Esmart1、Esmart2
VP1Esmart2、Esmart3
  1. RK3576
VP图层
VP0Cluster0、Cluster1、Esmart0、Esmart2
VP1Cluster0、Cluster1、Esmart1、Esmart3
VP2Esmart0、Esmart1、Esmart2、Esmart3
  • 如果是 Linux 系统(buildroot,Debian 等非 Android 系统),指定 Cluster 图层为鼠标层的话,要配合 Linux SDK 提供的 libdrm-cursor 库。具体细节可参考 《Rockchip_Developer_Guide_Debian_CN.pdf》。

esmart 图层分割

RK3528 和 RK3576 几个 esmart 图层共享 linebuffer,可以根据产品形态对 linebuffer 进行分割来支持不同的图层数量和性能:

RK3528 esmart 图层分割

RK3528 平台的 esmart0/1/2/3 共享 linebuffer,默认配置为:VOP3_ESMART_4K_2K_2K_MODE,即此时除了固定的 cluster 图层,还注册 esmart0[4k],esmart2[2k],esmart3[2k],也可以根据产品需求在 dts 中做修改,如要改成 2 个支持 4k 的图层,可以按以下配置:

&vop {
	esmart_lb_mode = /bits/ 8 <1>;
};

配置说明:

esmart_lb_modeval图层数量和性能
VOP3_ESMART_4K_4K_MODE1注册 cluster[4k],esmart0[4k],esmart2[4k]
VOP3_ESMART_4K_2K_2K_MODE2注册 cluster[4k],esmart0[4k],esmart2[2k],esmart3[2k]
VOP3_ESMART_2K_2K_2K_2K_MODE3注册 cluster[4k],esmart0[2k],esmart1[2k],esmart2[2k],esmart3[2k]

RK3576 esmart 图层分割

RK3576 平台除了 Cluster0/1[4k] 和 esmart0/1[4k] 是固定的配置之外,esmart2[2k] 和 esmart3[2k] 也是共享 linebuffer 的设计,默认配置是 2 个 2k 的图层,如要改成 1 个支持 4k 的图层,可以按以下配置:

&vop {
	esmart_lb_mode = /bits/ 8 <4>;
};

配置说明:

esmart_lb_modeval图层数量和性能
VOP3_ESMART_4K_4K_4K_MODE4注册 cluster0[4k],cluster1[4k],esmart0[4k],esmart1[4k],esmart2[4k]
VOP3_ESMART_4K_4K_2K_2K_MODE5注册 cluster0[4k],cluster1[4k],esmart0[4k],esmart1[4k],esmart2[2k],esmart3[2k]

禁止图层迁移

某些 Linux 系统可能希望每个 crtc 上的图层都是唯一独占的,不在 crtc 之间做图层迁移,可以在 vop 节点下设置 disable-win-move 打开该功能。

&vop {
        disable-win-move;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

loitawu

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值