RGA(二)——RK3588 的核拓扑与能力差异

一、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 对齐。

相关推荐
水饺编程7 小时前
第2章:Linux 基础,rm 命令
linux·c语言·汇编
雪落漂泊7 小时前
Linux基础开发工具(三)gcc/g++与make/makefile篇
linux·运维·服务器
爱吃辣椒的小豆豆7 小时前
Linux-sshd-实战-白名单与跳板机
linux·运维·服务器
气质、小青年!7 小时前
进程1学习
linux·学习
blueSatchel7 小时前
framebuffer注册源码解读
linux·嵌入式
2401_862880828 小时前
嵌入式Linux系统移植与驱动开发完整指南
linux·c语言·驱动开发
坤坤子吖8 小时前
Linux 线程同步与互斥——互斥锁
linux·服务器·c++·笔记·学习
TDTC_XQ8 小时前
Linux网络编程accept的讲解
linux·服务器·c++
Python自动化直播8 小时前
自动化笔记:素材管理、命名、轮换的几条土办法
linux·运维·数据库
FlightYe8 小时前
音视频修炼之容器与协议(一):MP4和MOV的box剖析
android·linux·c++·ffmpeg·音视频