功能描述
镜像/ 固定角度旋转
Flip/Rotation0 子模块可以进行水平镜像、垂直镜像、0/90/180/270 度固定角度旋转。水平镜像、 垂直镜像和固定角度旋转,单独开启,也可以同时开启。同时开启的时候,水平镜像和垂直镜像在固定 角度旋转功能前生效。
任意角度旋转
Rotation1子模块可以对图像进行任意角度旋转,任意角度旋转只支持RGB格式不支持YUV格式,以图像 左上角为原点,原图的旋转中心在(m, n)目标图的旋转中心在(c, d),如下图所示:

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

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

格式化输出
FMT子模块是格式化输出模块, 对接收到的像素按照像素格式的排列要求写入memory。
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
图 4. 矩形填充 -
位块搬移(Bit BLT/ Stretch BLT):把内存中源图像的一块矩形区域,搬移到目标图像中的一块矩形区域中,在进行位块搬移 过程中,源图和目标图可以同时进行alpha blending/CK操作。
-
原图的矩形区域搬移到目标图的矩形区域中不进行缩放(Bit BLT),如下图所示:
图 5. 位图搬移 -
原图的矩形区域搬移到目标图的矩形区域中同时进行放大或者缩小(Stretch BLT),如下图所示:
图 6. 位图搬移同时缩放
-
-
性能: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)
要素 | 说明 |
---|---|
Task | GE(Graphics Engine) 可以执行的最小任务单元,比如一次 blit 操作、一次矩形填充。 Task 由多个 CMD Group 组成: |
Batch | 软件控制 GE 的最小单位,是一系列命令的集合,可以包含一个或者多个Task。 |
Command Queue | 对 Batch 进行管理的命令队列,硬件通过 Command Queue 来读取控制命令。 |
不采用 Command Queue:GE 每个task 结束都要触发一次中断。
采用 Command Queue:GE 可以完成多个 Task 后, 才触发一次中断,减少系统调度开销。
命令队列采用 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 没有回绕
图 8. Ring buf无回绕 -
Case 1:CMD Ring Buffer 有回绕
图 9. 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 |

-
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: 由group cmd 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步进寄存器 |
-
如果CMD 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 -
-
如果 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 -
-
如果CMD 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、DST和OUT地址需要一致。
-
Scan order 只在 scaler、rot0、rot1关闭的情况下开启,并且不 可以开启Dither。
-
不开启任意角度旋转支持最小size为:1x1(单位为pixel)。
-
开启任意角度旋转支持最小size为:4x4(单位为pixel)。
-
支持最大size为:4096x4096(单位为pixel)。
-
颜色填充模式/渐变填充模式下,不可以开启scaler、rot0、rot1。
-
配置cmd queue的 ring buffer的起始地址和总长度需要128 bytes对齐。
-
任意角度旋转只支持alpha blending,不支持color key。
-
不支持YUV格式