功能描述
- Flip/ Rotation0 子模块:可以进行水平镜像、垂直镜像、0/ 90/ 180/ 270 度固定角度旋转。
水平镜像、 垂直镜像和固定角度旋转三个功能可分别单独开启,也可同时开启。如果同时开启,水平镜像和垂直镜像旋转功能会在固定角度旋转功能之前生效。
- Rotation1 子模块:可以对图像进行任意角度旋转。任意角度旋转只支持 RGB 格式,不支持 YUV 格式。
关于详细描述,可查看任意角度旋转
- Scaler0 子模块:对特定格式的图像进行缩放。
关于图像缩放的详细说明,可查看图像缩放。
- Porter-Duff Alpha Blending:支持选择不同的叠加系数对图像进行叠加混合。
- Dither 子模块:支持输入 ARGB8888 或者 RGB888 格式,输出 ARGB4444、RGB565、ARGB1555。打开 Dither 功能,可以使图像渐变区域更平滑。
- 格式化输出 (FMT ) 子模块:对接收到的像素按照像素格式的排列要求写入 memory。
GE 使用过程中存在一定限制约束,详情可查看限制条件。
任意角度旋转

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

图像缩放
Scaler0 子模块支持对 RGB 格式图像进行缩放,支持缩放倍数范围为 1/16 ~ 16。
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 |
基本 2D 加速操作
矩形填充和位块搬移是最基本的 2D 加速操作,其操作方法以及性能如下所示:
-
矩形填充(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
图 3. 矩形填充 -
位块搬移 (Bit BLT/ Stretch BLT):把内存中源图像的一块矩形区域,搬移到目标图像中的一块矩形区域中。在位块搬移过程中,源图和目标图可以同时进行 alpha blending/CK 操作。
-
原图的矩形区域搬移到目标图的矩形区域中时不进行缩放(Bit BLT),如下图所示:
图 4. 位图搬移 -
原图的矩形区域搬移到目标图的矩形区域中同时进行放大或者缩小(Stretch BLT),如下图所示:
图 5. 位图搬移同时缩放
-
-
性能:GE 的最高工作频率为 150 MHz,开启不同功能的性能如下表所示。
序号
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 为 GE 的工作时钟,GE 的性能为 P,则每秒钟可以处理的像素个数为:pixel_num = mclk * P。
- mclk 单位:Hz
- p 单位: pixel/cycle
-
每一帧处理的像素个数 frame_pixel = width * height,当使用 Stretch BLT 功能时,计算输入或者输出中最大图片的像素个数。
-
GE 可以处理的最大帧率 frame per second (fps) = pixel_num ÷ frame_pixel。
-
当受到系统实际带宽限制时,可以用分配给 GE 的实际带宽量来计算实际帧率。
-
命令队列 (Command Queue)
命令队列 (Command Queue) 涉及以下几个关键要素:要素 |
说明 |
---|---|
Task |
GE 可以执行的最小任务单元,比如一次 blit 操作、一次矩形填充。 |
Batch |
软件控制 GE 的最小单位,是一系列命令的集合,可以包含一个或者多个 Task。 |
Command Queue |
对 Batch 进行管理的命令队列,硬件通过 Command Queue 来读取控制命令。 |
- 采用 Command Queue 时,GE 可以完成多个 Task 后, 才触发一次中断,减少系统调度开销。
不采用 Command Queue 时,GE 每个 task 结束都要触发一次中断。
- 采用 ring buffer 方式实现。

Ring Buffer 的工作流程如下:
- 软件以 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。-
Case 0:CMD Ring Buffer 没有回绕
图 7. Ring Buf fer 无回绕 -
Case 1:CMD Ring Buffer 有回绕
图 8. Ring Buf fer 有回绕
-
-
CMD Group 格式
每个 CMD Group 都由 group header 和多个 CMD 共同组成。通过 CMD Group 的方式将设置的命令和 GE 的寄存器建立起映射关系,如下表所示:
group header |
4 bytes (little-endian) |
---|---|
CMD 0 |
4 bytes |
…… |
…… |
CMD N |
4 bytes |

-
task end:标记为 1 时,表示当前 Group 为当前 Task 的最后一个 Group。
-
group cmd length:当前 Group 命令的总长度,单位为 byte。由于长度为 4 的倍数,低位 2 bits 固定为 0。
-
group cmd offset:当前 Group 设置的命令,相对于 GE 寄存器的基地址的偏移,单位为 byte。由于 offset 为 4 的倍数,低位 2 bits 固定为 0。
-
CMD 0 ~ N: 由 length 和 group cmd offset 指定的 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 步进寄存器 |
-
如果 Group 对应 GE 的 0x010、0x014、0x018 三 个寄存器,则:
-
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
-
-
如果 CMD Group 对应 GE 的 0x030、0x034、0x038、0x03C 四个寄存器:
-
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
-
-
如果 Group 对应 GE 的 0x030、0x034、0x038、0x03C 四个寄存器,并且当前 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 只在 scaler、rot0、rot1 关闭的情况下开启,并且不可以开启 Dither。
-
不开启任意角度旋转支持最小 size:1x1(单位为 pixel)。
-
开启任意角度旋转支持最小 size:4x4(单位为 pixel)。
-
支持最大 size:4096x4096(单位为 pixel)。
-
颜色填充模式/渐变填充模式下,不可以开启 scaler、rot0、rot1。
-
配置 queue 的 Ring Buffer 的起始地址和总长度需要 128 bytes 对齐。
-
任意角度旋转只支持 blending,不支持 color key。
-
不支持 YUV 格式