Edit online

功能描述

镜像/ 固定角度旋转

Flip/Rotation0 子模块可以进行水平镜像、垂直镜像、0/90/180/270 度固定角度旋转。水平镜像、 垂直镜像和固定角度旋转,单独开启,也可以同时开启。同时开启的时候,水平镜像和垂直镜像在固定 角度旋转功能前生效。

任意角度旋转

Rotation1 子模块可以对图像进行任意角度旋转,任意角度旋转只支持 RGB 格式不支持 YUV 格式,以图像 左上角为原点,原图的旋转中心在(m, n)目标图的旋转中心在(c, d),如下图所示:

../images/ge_function_rot1.png
1. 旋转示意图

由原图到目标图的旋转变换矩阵为:

../images/ge_function_rot1_1.png
2. 旋转公式

图像缩放

Scaler0 子模块支持对 RGB/YUV 格式图像进行缩放,支持缩放倍数范围为 1/16 ~ 16。Scaler0 支持 6x4 taps 16 phases 多相位滤波算法。 Scaler0 有两个独立的 channel,当对 RGB 格式进行缩放操作的时候,需要配置 Scaler0 的 channel0 参数。 当为 YUV 格式的时候,Y 通道需要设置 channel0 参数,U 和 V 通道需要设置 channel1 参数。 当 scaler0 控制寄存器选择的是内置滤波系数,不需要软件设置滤波系数表。当 scaler0 控制寄存器选择的是查表, 则需要软件设置滤波系数表,channel0 和 channel1 有独立的滤波系数表,并且水平滤波系数和垂直滤波系数 需要单独设置,总共对应 4 组滤波系数。水平滤波为 6 taps,滤波系数为 6x16 共 96 个。通过大小为 48 的 32bits 寄存器组来设置,每个系数为 14bits 有符号数, 寄存器低 16bits 和高 16bits 各存储一个系数, 例如 phase0 和 phase1 占用一个 32bits 寄存器,phase0 在[0:13],phase1 在[16:29]。 先存储 tap0 的 phase0, phase1,依次到 phase15,然后再存储 tap1, tap2,tap3,tap4,tap5。

../images/ge_function_scale_coef0.png
3. 水平系数排列

垂直滤波为 4 taps,滤波系数为 4x16 共 64 个。通过大小为 32 的 32bits 寄存器组来设置,每个系数为 14bits 有符号数, 寄存器低 16bits 和高 16bits 各存储一个系数,例如 phase0 和 phase1 占用一个 32bits 寄存器,phase0 在[0:13], phase1 在[16:29]。先存储 tap0 的 phase0,phase1,依次到 phase15,然后再存储 tap1, tap2,tap3。

../images/ge_function_scale_coef1.png
4. 垂直系数排列

颜色空间转换(CSC0 和 CSC1)

CSC0 和 CSC1 子模块都是 YUV 转 RGB,颜色空间转换模块,格式转换公式如下:

R = Coef0 * Y + Coef1 * U + Coef2 * V + Coef3;
G = Coef4 * Y + Coef5 * U + Coef6 * V + Coef7;
B = Coef8 * Y + Coef9 * U + Coef10 * V + Coef11;
系数定点化:
COEF0 = coef0 * 1024  // COEF0 为 13bits 有符号整数
COEF1 = coef1 * 1024  // COEF1 为 13bits 有符号整数
COEF2 = coef2 * 1024  // COEF2 为 13bits 有符号整数
COEF3 = coef3 * 16    // COEF3 为 14bits 有符号整数

COEF4~ COEF7 和 COEF8~ COEF11 计算方式和 COEF0~ COEF3 一样:

R = (((COEF0 * Y + COEF1 * U + COEF2 * V + 32) >> 6) + COEF3 + 8) >> 4;
G = (((COEF4 * Y + COEF5 * U + COEF6 * V + 32) >> 6) + COEF7 + 8) >> 4;
B = (((COEF7 * Y + COEF9 * U + COEF10 * V + 32) >> 6) + COEF11 + 8) >> 4;

If(R>255) R =255; else if (R<0) R = 0;
If(G>255) G =255; else if (G<0) G = 0;
If(B>255) B =255; else if (B<0) B = 0;

颜色空间转换 (CSC2)

CSC2 子模块是 RGB 转 YUV 颜色空间转换模块,格式转换公式如下:

Y = Coef0 * R + Coef1 * G + Coef2 * B+ Coef3;
U = Coef4 * R + Coef5 * G + Coef6 * B+ Coef7;
V = Coef8 * R + Coef9 * G + Coef10 * B+ Coef11;

系数定点化:

COEF0 = coef0 * 256  // COEF0 为 11bits 有符号整数
COEF1 = coef1 * 256  // COEF1 为 11bits 有符号整数
COEF2 = coef2 * 256  // COEF2 为 11bits 有符号整数
COEF3 = coef3        // COEF2 为 11bits 有符号整数

COEF4~ COEF7 和 COEF8~ COEF11 计算方式和 COEF0~ COEF3 一样

Y = (COEF0 * R + COEF1 * G + COEF2 * B + 128) >> 8 + COEF3;
U =( COEF4 * R + COEF5 * G + COEF6 * B + 128) >> 8 + COEF7;
V = (COEF8 * R + COEF9 * G + COEF10 * B + 128) >> 8 + COEF11;

If(Y>255) Y =255; else if (Y<0) Y = 0;
If(U>255) U =255; else if (U<0) U = 0;
If(V>255) V =255; else if (V<0) V = 0;

Porter/Duff Alpha Blending

pixel = (source * fs + destination * fd),
sa = source alpha,
da = destination alpha
序号 Blending 模式 fs fd
0 NONE(默认) sa 1-sa
1 CLEAR 0 0
2 SRC 1 0
3 DST 0 1
4 SRC_OVER 1 1-sa
5 DST_OVER 1-da 1
6 SRC_IN da 0
7 DST_IN 0 sa
8 SRC_OUT 1-da 0
9 DST_OUT 0 1-sa
10 SRC_ATOP da 1-sa
11 DST_ATOP 1-da sa
12 XOR 1-da 1-sa
13 ADD 1 1

误差扩散 Dither

Dither 子模块支持输入 ARGB8888 或者 RGB888 格式,输出 ARGB4444、RGB565、ARGB1555,当像素格式从高位宽, 转化为低位宽的时候,打开 Dither 功能,可以使图像渐变区域更平滑。误差扩散算法采用 algorithm, X 为当前像素,当前像素的量化误差扩散到相邻的像素,Sierra Lite algorithm 误差扩散模板如下图所示:

../images/ge_function_dither1.png
5. 误差扩散模板

格式化输出

FMT 子模块是格式化输出模块, 比如 ARGB8888 格式只有一个 plane,NV12 格式有 2 个 plane, YUV420p 有 三个 plane。FMT 子模块对接收到的像素按照像素格式的排列要求写入 memory。

2D 加速操作

  1. 矩形填充(Fill Rectangle):指定内存中的一块矩形区域,然后向矩形区域填充固定颜色,如下图所示:

    Output Image Addr 为要矩形填充图像的基地址,坐标(x_offset,y_offset)为填充区域相对于基 地址的坐标偏移,由软件计算出坐标(x_offset,y_offset)地址 addr 配置给硬件,计算方法如下:

    bpp: 每个像素占用的字节(Bytes Per Pixel)
    addr = output_image_addr + output_image_stride * y_offset  +  x_offset * bpp
    ../images/ge_function_fill1.png
    6. 矩形填充
  2. 位块搬移(Bit BLT/ Stretch BLT):把内存中源图像的一块矩形区域,搬移到目标图像中的一块矩形区域中,在进行位块搬移 过程中,源图和目标图可以同时进行 alpha blending/CK 操作。
    1. 原图的矩形区域搬移到目标图的矩形区域中不进行缩放(Bit BLT),如下图所示:

      ../images/ge_function_blit1.png
      7. 位图搬移
    2. 原图的矩形区域搬移到目标图的矩形区域中同时进行放大或者缩小(Stretch BLT),如下图所示:

      ../images/ge_function_stretchblit1.png
      8. 位图搬移同时缩放
  3. 性能:GE 的最高工作频率为 150MHz,开启不同功能的性能如下表所示。
    序号 2D 加速操作 性能(关闭 Rotation1) 性能(开启 Rotation1)
    0 Fill Rectanle 1 pixel/cycle N/A
    1 Blit 0.95 pixel/cycle 0.45 pixel/cycle
    2 Stretch BLT 0.7 pixel/cycle N/A
    • 设 mclk(单位为 Hz)为 GE 的工作时钟,GE 的性能为 P (单位为 pixel/ cycle),则每秒钟可以处理的像素个数为:pixel_num = mclk * P

    • 每一帧处理的像素个数:frame_pixel = width * height,(当使用功能 Stretch BLT 的时候,选择输入或者输出中最大图片进行计算)

    • GE 可以处理的最大帧率(frame per second)为:fps = pixel_num / frame_pixel

    • 当受到系统实际带宽限制的时候,可以用分配给 GE 的实际带宽量来计算实际帧率

命令队列 (Command Queue)

命令队列 (Command Queue) 涉及以下几个关键要素:
要素 说明
Task GE(Graphics Engine) 可以执行的最小任务单元,比如一次 blit 操作、一次矩形填充。

Task 由多个 CMD Group 组成:

../images/ge_function_task_01.png

Batch 软件控制 GE 的最小单位,是一系列命令的集合,可以包含一个或者多个 Task。
Command Queue 对 Batch 进行管理的命令队列,硬件通过 Command Queue 来读取控制命令。

不采用 Command Queue:GE 每个 task 结束都要触发一次中断。

采用 Command Queue:GE 可以完成多个 Task 后, 才触发一次中断,减少系统调度开销。

命令队列采用 ring buffer 方式实现。

../images/ge_function_cmdq_01.png
9. Ring buf
  • 软件以 Batch 为单位向 CMD Ring Buffer 中写入控制命令,当控制命令写到 CMD Ring Buffer 尾部没有空间时,写地址跳到 CMD Ring Buffer 起始地址。完成此过程需要配给硬件的信息:
    • CMD Buf Start Address:CMD Ring Buffer 的起始地址

    • CMD Buf End Address: CMD Ring Buffer 的结束地址

    • CMD Buf Address Offset:硬件读取 CMD 的地址相对于 CMD Buf Start Address 的偏移

    • CMD Buf Valid Length: 硬件读取命令的有效长度。 假设有效长度 length,当硬件读取长度为 length0 ( length0 < length ) 的命令,此时 CMD 的读地址大于 CMD Buffer End Address, 硬件会切换 CMD 读地址到 CMD Buffer Start Address,继续读取长度为 length1 的命令, 此时有效长度 length 由 length0 和 length1 两部分组成,length = length0 + length1
      1. Case 0:CMD Ring Buffer 没有回绕

        ../images/ge_function_cmdq_11.png
        10. Ring buf 无回绕
      2. Case 1:CMD Ring Buffer 有回绕

        ../images/ge_function_cmdq_21.png
        11. Ring buf 有回绕

CMD Group 格式

每个 CMD Group 都由 group header 和多个 CMD 共同组成。通过 CMD Group 的方式把设置的命令和 GE 的寄存器建立起映射关系:

group header 4 bytes(little-endian)
CMD 0 4 bytes
…… ……
CMD N 4 bytes
../images/ge_function_task_11.png
12. Group 格式
如图所示:
  • task end:当此标记为 1,表示此 Group 为当前 Task 的最后一个 Group

  • group cmd length:当前 Group 命令的总长度,单位为 byte,由于长度为 4 的倍数,低位 2bits 固定为 0

  • group cmd offset:当前 Group 设置的命令,相对于 GE 寄存器的基地址的偏移,单位为 byte,由于 offset 为 4 的倍数,低位 2bits 固定为 0

  • CMD 0 ~ N: 由 length 和 group cmd offset 指定的 GE 寄存器的配置

以下是 GE 部分功能寄存器的列表:

寄存器名 偏移地址 寄存器功能描述
GE_CTRL 0x000 GE 控制寄存器
GE_STATUS 0x004 GE 状态寄存器
GE_START 0x008 GE 启动寄存器
GE_RESET 0x00C GE 复位寄存器
SRC_SURFACE_CTRL 0x010 SRC 控制寄存器
SRC_SURFACE_INPUT_SIZE 0x014 SRC 输入宽高寄存器
SRC_SURFACE_STRIDE 0x018 SRC 行对齐寄存器
SRC_SURFACE_FILL_COLOER 0x01C SRC 颜色填充寄存器
SRC_SURFACE_ADDR0 0x020 SRC 地址 0 寄存器
- 0x024 -
- 0x028 -
- 0x02C -
SRC_GRADIENT_A_STEP 0x030 SRC 渐变填充 Alpha 步进寄存器
SRC_GRADIENT_R_STEP 0x034 SRC 渐变填充 Red 步进寄存器
SRC_GRADIENT_G_STEP 0x038 SRC 渐变填充 Green 步进寄存器
SRC_GRADIENT_B_STEP 0x03C SRC 渐变填充 Blue 步进寄存器
  1. 如果 Group 对应 GE 的 0x010、0x014、0x018 3 个寄存器:

    • group cmd length:0x0C

    • group cmd offset:0x10

    • task end: 0

    group header 4 bytes (little-endian) 0x0010000C
    CMD 0 4 bytes 映射为寄存器 0x010
    CMD 1 4 bytes 映射为寄存器 0x014
    CMD 2 4 bytes 映射为寄存器 0x018
  2. 如果 CMD Group 对应 GE 的 0x030、0x034、0x038、0x03C 4 个寄存器:

    • group cmd length:0x10

    • group cmd offset:0x30

    • task end: 0

    group header 4 bytes (little-endian) 0x00300010
    CMD 0 4 bytes 映射为寄存器 0x030
    CMD 1 4 bytes 映射为寄存器 0x034
    CMD 2 4 bytes 映射为寄存器 0x038
    CMD 3 4 bytes 映射为寄存器 0x03C
  3. 如果 Group 对应 GE 的 0x030、0x034、0x038、0x03C 4 个寄存器, 并且当前 Group 为当前 Task 最后一个 Group:
    • group cmd length:0x10

    • group cmd offset:0x30

    • task end: 1

    group header 4 bytes (little-endian) 0x00300011
    CMD 0 4 bytes 映射为寄存器 0x030
    CMD 1 4 bytes 映射为寄存器 0x034
    CMD 2 4 bytes 映射为寄存器 0x038
    CMD 3 4 bytes 映射为寄存器 0x03C

限制条件

  • 任意角度旋转不支持 Dither、不支持 YUV 格式、 DST 和 OUT 地址需要一致。

  • Scan order 只在 src、dst、out 都为 RGB 格式,并且 scaler、rot0、rot1 关闭的情况下开启,并且不 可以开启 Dither。

  • YUV 格式支持的最小 size 为 8x8, 最大 size 为 4096x4096(单位为 pixel)。

  • YUV 格式必须开启 scaler

  • RGB 格式不开启 scaler、不开启 rot1 的情况,支持的最小 size 为:1x1(单位为 pixel)。

  • RGB 格式不开启 scaler、开启 rot1 的情况,支持最小 size 为:4x4(单位为 pixel)。

  • RGB 格式开启 scaler 的情况,支持最小 size 为:4x4(单位为 pixel)。

  • RGB 格式支持最大 size 为:4096x4096(单位为 pixel)。

  • 颜色填充模式/渐变填充模式下,不可以开启 scaler、rot0、rot1。

  • 配置 queue 的 ring buffer 的起始地址和总长度需要 128 bytes 对齐。

  • 任意角度旋转只支持 blending,不支持 key。