RK3588 VOP圖層分配介紹
RK3588圖層介紹
RK3588有8個圖層,分別是Custer 0/1/2/3 和Esmart 0/1/2/3,兩種圖層的能力不一樣,具體如下:
- Custer
- 分辨率:最大分辨率包括兩種合并集群和單集群,分別為7680x4320和4096x4320。
- 數據格式:支持多種數據格式,包括RGBA8888/RGB888/RGB565/RGBA1010102/YUV420(8,10bit)/YUV422(8,10bit)。
- 圖像支持:支持虛擬寬度、活動偏移、顯示偏移、Y鏡像、X鏡像、旋轉90度/270度等。
- 集群線緩沖模式:支持三種模式,包括1x4096寬度的模式、2x2048寬度的模式和1x2048寬度的AFBCD旋轉層模式。
- 集群支持的功能包括:支持高斯濾波、縮放、色彩空間轉換等。
- Esmart
- 分辨率:支持分辨率分別為7680x4320和4096x4320。
- 數據格式:數據格式包括RGB、YUV、YUYV等,支持多種顏色深度8BPP。
- 圖像支持: 支持虛擬寬度、活動偏移、顯示偏移、Y鏡像、顏色交換、YUV剪切等圖像功能。
- 集群線緩沖模式:支持多區域顯示,每個區域最大支持一個像素點,最多支持4個區域。
- 支持縮放功能,包括縮放率和縮放模式,支持縮小和放大,縮放率范圍為1/8~1,縮放模式包括最近鄰插值、雙線性插值和三線性插值。
- 支持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 1127V: 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 中按以下規則配置:
- 只有一個屏顯示,可以使用如下配置:
#include <dt-bindings/display/rockchip_vop.h> //圖層 ID 定義頭文件&vpx { //x 取決于使用的 vp id,如 vp0rockchip,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>;
};
- 有兩個屏顯示【RK3566 目前只有 android 產品支持雙顯,且要求兩個屏刷新幀率一致】,那我們讓不支持熱插拔設備(即始終連接顯示的通路)使用主圖層,另一個通路使用鏡像圖層:
#include <dt-bindings/display/rockchip_vop.h> //圖層 ID 定義頭文件&vpx { //x 取決于使用的 vp id,如 vp0rockchip,plane-mask = <(1 << ROCKCHIP_VOP2_CLUSTER0 | 1 << ROCKCHIP_VOP2_ESMART0 | 1 << ROCKCHIP_VOP2_SMART0)>;rockchip,primary-plane = <ROCKCHIP_VOP2_SMART0>;
}; //單顯或者雙顯時不支持熱插拔的主顯示設備使用主圖層&vpx { //x 取決于使用的 vp id,如 vp1rockchip,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 的連接關系:
- RK3528
VP | 圖層 |
---|---|
VP0 | Cluster0、Esmart0、Esmart1、Esmart2 |
VP1 | Esmart2、Esmart3 |
- RK3576
VP | 圖層 |
---|---|
VP0 | Cluster0、Cluster1、Esmart0、Esmart2 |
VP1 | Cluster0、Cluster1、Esmart1、Esmart3 |
VP2 | Esmart0、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_mode | val | 圖層數量和性能 |
---|---|---|
VOP3_ESMART_4K_4K_MODE | 1 | 注冊 cluster[4k],esmart0[4k],esmart2[4k] |
VOP3_ESMART_4K_2K_2K_MODE | 2 | 注冊 cluster[4k],esmart0[4k],esmart2[2k],esmart3[2k] |
VOP3_ESMART_2K_2K_2K_2K_MODE | 3 | 注冊 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_mode | val | 圖層數量和性能 |
---|---|---|
VOP3_ESMART_4K_4K_4K_MODE | 4 | 注冊 cluster0[4k],cluster1[4k],esmart0[4k],esmart1[4k],esmart2[4k] |
VOP3_ESMART_4K_4K_2K_2K_MODE | 5 | 注冊 cluster0[4k],cluster1[4k],esmart0[4k],esmart1[4k],esmart2[2k],esmart3[2k] |
禁止圖層遷移
某些 Linux 系統可能希望每個 crtc 上的圖層都是唯一獨占的,不在 crtc 之間做圖層遷移,可以在 vop 節點下設置 disable-win-move
打開該功能。
&vop {disable-win-move;
}