一、RK3588 上到底有几颗 RGA 核?
直接给结论:一颗 RGA2-Enhance + 两颗独立的 RGA3。 这一点可以通过板子上的调试节点直接确认。在 RK3588 上执行:
bash
sudo cat /sys/kernel/debug/rkrga/hardware
输出如下:
yaml
===================================
rga3, core 1: version: 3.0.76831
input range: 68x2 ~ 8176x8176
output range: 68x2 ~ 8128x8128
scale limit: 1/8 ~ 8
byte_stride_align: 16
max_byte_stride: 32768
csc: RGB2YUV 0xf YUV2RGB 0xf
feature: 0x4
mmu: RK_IOMMU
-----------------------------------
rga3, core 2: version: 3.0.76831
input range: 68x2 ~ 8176x8176
output range: 68x2 ~ 8128x8128
scale limit: 1/8 ~ 8
byte_stride_align: 16
max_byte_stride: 32768
csc: RGB2YUV 0xf YUV2RGB 0xf
feature: 0x4
mmu: RK_IOMMU
-----------------------------------
rga2, core 4: version: 3.2.63318
input range: 2x2 ~ 8192x8192
output range: 2x2 ~ 4096x4096
scale limit: 1/16 ~ 16
byte_stride_align: 4
max_byte_stride: 32768
csc: RGB2YUV 0x3 YUV2RGB 0x7
feature: 0x205f
mmu: RGA_MMU
-----------------------------------
三颗核各自独立,理论上最多可以并行执行 3 个 RGA 任务。如果并行数量超过 3 个,多余的任务会进入等待队列,直到有核心空闲。
二、两颗核的能力差异(核心表格)
| 对比项 | RGA2-Enhance | RGA3 |
|---|---|---|
| 输入范围 | 2×2 ~ 8192×8192 | 68×2 ~ 8176×8176 |
| 输出范围 | 2×2 ~ 4096×4096 | 68×2 ~ 8128×8128 |
| 缩放倍率 | 1/16 ~ 16 | 1/8 ~ 8 |
| Pixels/Cycle | 2 | 3(bypass)/ 2(scale) |
| IOMMU 位数 | 32bit | 40bit |
| 寻址能力 | 仅 0~4G 内存 | 可访问 32G DDR |
| 10bit YUV 输出 | 不支持 | 支持 |
| 8×8 tile / FBCD | 不支持 | 支持 |
| BT.2020 色域 | 不支持 | 支持 |
| 完全 planar 格式(三平面) | 支持 | 不支持 |
| Color Fill | 支持 | 不支持 |
| ROP 光栅运算 | 支持 | 不支持 |
数据来源:RGA3 的能力描述来自内核补丁;RGA2 与 RGA3 的规格参数来自 librga 官方文档中的设计指标表。
三、这张表怎么读?三个最关键的差异
3.1 输出分辨率:RGA2 到 4K,RGA3 到 8K
RGA2 的输出上限是 4096×4096,也就是标准的 4K 级别。RGA3 的输出上限是 8128×8128(官方有时写作 (8192-64)×(8192-64)),接近 8K。
实践推论 :如果你的场景需要输出超过 4096 宽或高的图像------比如 8K 片源解码后缩放到 5K 或 6K 上屏,或者大屏拼接------只有 RGA3 能做,RGA2 做不了。
3.2 缩放倍率:RGA2 反而更强
这是最反直觉的一点。RGA3 虽然"更新",但它的缩放倍率范围反而是 1/8 ~ 8 ,而 RGA2 是 1/16 ~ 16。
内核补丁的讨论中明确指出了这一点,有开发者还特意注释说"对于缩放,RGA3 在这方面更弱"。
实践推论 :如果你的场景需要超过 8 倍的缩放(比如 16 倍缩小,或者 10 倍放大),只有 RGA2 能做。
3.3 内存寻址:4G 限制的根源
RGA2 的 IOMMU 是 32bit ,意味着它只能访问 0~4G 物理内存空间 。RGA3 的 IOMMU 是 40bit,可以访问高达 32G 的 DDR。
官方文档里有一条明确的注记:RGA 的寻址能力和 IOMMU 的 bit 位数是相关联的,搭载 32bit IOMMU 的 RGA 实际物理地址寻址能力仅支持 0~4G 的内存空间。
实践推论:这是 RK3588 上最隐蔽的坑。如果你的板子有 8G 内存,而某个任务被分配到了 RGA2 核,但 buffer 的物理地址在 4G 以上,任务就会失败。具体行为和解决方案,会在后面的性能章节展开,现在先记住这个点。
四、功能矩阵:哪些能做,哪些不能
RGA3 独有的能力
- 10bit YUV 输出格式:HDR、10bit HEVC 源的处理需要
- 8×8 tile 和 FBCD 输入输出:压缩格式直通
- BT.2020 色域转换:RGA2 只支持 BT.601 和 BT.709
RGA2 独有的能力
- 完全 planar 格式(三平面):RGA3 明确不支持三平面格式
- Color Fill:颜色填充功能是 RGA2 特有的
- ROP 光栅运算:AND/OR/XOR 等光栅操作只有 RGA2 支持
两者都支持的基础能力
- 旋转 90/180/270 度
- X/Y 镜像翻转
- 裁剪 Crop
- Alpha blend
- Color Key
五、官方的对齐约束:取最严标准
因为 RK3588 上同时搭载 RGA2 和 RGA3,而两者的对齐要求不同,librga 做了一个设计决策:按最严格的对齐要求进行约束。
官方文档原文:
当芯片平台搭载多版本硬件时,为了保证硬件利用率,librga 会按最严格的对齐要求进行约束。
具体来说,RGA2 的 byte_stride_align 是 4,RGA3 的 byte_stride_align 是 16。librga 在 RK3588 上会统一按 16 对齐校验。
5.1 RGA2 的对齐要求
| 格式 | 对齐要求 |
|---|---|
| RGBA/BGRA/ARGB/ABGR/RGBX/BGRX/XRGB/XBGR 8888 | width stride 无对齐要求 |
| RGBA_4444 / BGRA_4444 / ARGB_4444 / ABGR_4444 / RGBA_5551 / BGRA_5551 / ARGB_5551 / ABGR_5551 / RGB_565 / BGR_565 | width stride 须 2 对齐 |
| YUYV_422 / VYUY_422 / UYVY_422 / VYUY_422 / YUVY_420 / VYUY_420 / UYVY_420 / VYUY_420 | width stride 须 2 对齐,x_offset、y_offset、width、height、height stride 均须 2 对齐 |
| RGB_888 / BGR_888 / A8 | width stride 须 4 对齐 |
| YCbCr/YCrCb 420 SP / 422 SP / 444 SP / 420 P / 422 P / 400 / Y4 / Y8 | width stride 须 4 对齐,x_offset、y_offset、width、height、height stride 均须 2 对齐 |
| YCbCr/YCrCb 420 SP 10B / 422 SP 10B | width stride 须 16 对齐,x_offset、y_offset、width、height、height stride 均须 2 对齐 |
5.2 RGA3 的对齐要求
| 格式 | 对齐要求 |
|---|---|
| RGBA/BGRA/ARGB/ABGR/RGBX/BGRX/XRGB/XBGR 8888 | width stride 须 4 对齐 |
| RGB_565 / BGR_565 | width stride 须 8 对齐 |
| YUYV_422 / YVYU_422 / UYVY_422 / VYUY_422 | width stride 须 8 对齐,x_offset、y_offset、width、height、height stride 均须 2 对齐 |
| RGB_888 / BGR_888 | width stride 须 16 对齐 |
| YCbCr/YCrCb 420 SP / 422 SP | width stride 须 16 对齐,x_offset、y_offset、width、height、height stride 均须 2 对齐 |
| YCbCr/YCrCb 420 SP 10B / 422 SP 10B | width stride 须 64 对齐,x_offset、y_offset、width、height、height stride 均须 2 对齐 |
| FBC mode | 除上述格式对齐要求外,width stride、height stride 须 16 对齐 |
| TILE 8×8 mode | 除上述格式对齐要求外,width、height 须 8 对齐,输入通道 width stride、height stride 须 16 对齐 |
这个对齐约束是后面 80% 的"花屏/失败"问题的根源,第三篇会专门展开。
六、本篇小结
第一,RK3588 上有三颗 RGA 核:1 颗 RGA2-Enhance + 2 颗独立的 RGA3。 理论上最多并行 3 个任务。
第二,三颗核能力不同。 RGA3 支持 8K 输出、40bit 寻址、10bit YUV、BT.2020;RGA2 支持更大的缩放倍率(1/16~16)、planar 格式、Color Fill、ROP。
第三,最关键的两个差异:输出超过 4096 只有 RGA3 能做;缩放超过 8 倍只有 RGA2 能做。
第四,4G 内存限制的根源在 RGA2 的 32bit IOMMU。 8G 内存的板子上,如果 buffer 落在 4G 以上,RGA2 会失败。
第五,librga 在 RK3588 上按最严的对齐要求(RGA3 的 16 对齐)校验。 具体到各格式,RGA2 和 RGA3 的要求不一样,写代码时要注意区分:比如 NV12,RGA2 的 width stride 只要求 4 对齐,但 RGA3 要求 16 对齐;10bit NV12,RGA2 要求 16 对齐,RGA3 要求 64 对齐。同时 YUV 族的 x_offset、y_offset、width、height、height stride 均须 2 对齐。