9.2.2. 功能描述
9.2.2.1. 镜像/固定角度旋转
Flip/Rotation0子模块可以进行水平镜像、垂直镜像、0/90/180/270度固定角度旋转。水平镜像、 垂直镜像和固定角度旋转,单独开启,也可以同时开启。同时开启的时候,水平镜像和垂直镜像在固定 角度旋转功能前生效。
9.2.2.2. 任意角度旋转
Rotation1子模块可以对图像进行任意角度旋转,任意角度旋转只支持RGB格式不支持YUV格式,以图像 左上角为原点,原图的旋转中心在(m, n)目标图的旋转中心在(c, d),如下图所示:
由原图到目标图的旋转变换矩阵为:
9.2.2.3. 图像缩放
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。
垂直滤波为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。
9.2.2.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;
9.2.2.5. 颜色空间转换(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;
9.2.2.6. Porter/Duff Alpha Blending
Alpha Blending/CK子模块支持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 |
9.2.2.7. 误差扩散Dither
Dither子模块支持输入ARGB8888或者RGB888格式,输出ARGB4444、RGB565、ARGB1555,当像素格式从高位宽, 转化为低位宽的时候,打开Dither功能,可以使图像渐变区域更平滑。误差扩散算法采用Sierra Lite algorithm, X为当前像素,当前像素的量化误差扩散到相邻的像素,Sierra Lite algorithm误差扩散模板如下图所示:
9.2.2.8. 格式化输出
FMT子模块是格式化输出模块, 比如ARGB8888格式只有一个plane,NV12格式有2个plane, YUV420p有 三个plane。FMT子模块对接收到的像素按照像素格式的排列要求写入memory。
9.2.2.9. 2D加速操作
9.2.2.9.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
9.2.2.9.2. 位块搬移(Bit BLT/ Stretch BLT)
位块搬移是指把内存中源图像的一块矩形区域,搬移到目标图像中的一块矩形区域中,在进行位块搬移 过程中,源图和目标图可以同时进行alpha blending/CK操作。
(1) 原图的矩形区域搬移到目标图的矩形区域中不进行缩放(Bit BLT),如下图所示:
(2)原图的矩形区域搬移到目标图的矩形区域中同时进行放大或者缩小(Stretch BLT),如下图所示:
9.2.2.9.3. 性能
GE的最高工作频率为200MHz,开启不同功能的性能如下表所示:
序号 |
2D加速操作 |
性能(关闭Rotation1) |
性能(开启Rotation1) |
---|---|---|---|
0 |
Fill Rectanle |
1 pixel/cycle |
N/A |
1 |
Blit |
1 pixel/cycle |
0.6 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的实际带宽量来计算实际帧率
9.2.2.10. 命令队列(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没有回绕
Case 1:CMD Ring Buffer有回绕
9.2.2.10.1. Task格式
Task由多个 CMD Group组成
9.2.2.10.2. 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寄存器 |
SRC_SURFACE_ADDR1 |
0x024 |
SRC地址1寄存器 |
SRC_SURFACE_ADDR2 |
0x028 |
SRC地址2寄存器 |
- |
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 |
3. 如果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 |
9.2.2.11. 限制条件
任意角度旋转不支持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。
配置cmd queue的 ring buffer的起始地址和总长度需要128 bytes对齐。
任意角度旋转只支持alpha blending,不支持color key。