9.2.2. 功能描述

9.2.2.1. 镜像/固定角度旋转

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

9.2.2.2. 任意角度旋转

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

../../../_images/ge_function_rot1.png

图 9.4 旋转示意图

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

../../../_images/ge_function_rot1_1.png

图 9.5 旋转公式

9.2.2.3. 图像缩放

Scaler0子模块支持对RGB格式图像进行缩放,支持缩放倍数范围为 1/16 ~ 16。

9.2.2.4. 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.5. 误差扩散Dither

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

../../../_images/ge_function_dither.png

图 9.6 误差扩散模板

9.2.2.6. 格式化输出

FMT子模块是格式化输出模块, 对接收到的像素按照像素格式的排列要求写入memory。

9.2.2.7. 2D加速操作

9.2.2.7.1. 矩形填充(Fill Rectangle)

矩形填充是指定内存中的一块矩形区域,然后向矩形区域填充固定颜色,如下图所示:

../../../_images/ge_function_fill.png

图 9.7 矩形填充

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.7.2. 位块搬移(Bit BLT/ Stretch BLT)

位块搬移是指把内存中源图像的一块矩形区域,搬移到目标图像中的一块矩形区域中,在进行位块搬移 过程中,源图和目标图可以同时进行alpha blending/CK操作。

(1) 原图的矩形区域搬移到目标图的矩形区域中不进行缩放(Bit BLT),如下图所示:

../../../_images/ge_function_blit.png

图 9.8 位图搬移

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

../../../_images/ge_function_stretchblit.png

图 9.9 位图搬移同时缩放

9.2.2.7.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的实际带宽量来计算实际帧率

9.2.2.8. 命令队列(Command Queue)

Task: GE(Graphics Engine) 可以执行的最小任务单元,比如说一次 blit操作、一次矩形填充
Batch:软件控制GE的最小单位,是一系列命令的集合,可以包含一个或者多个Task
Command Queue:对Batch进行管理的命令队列,硬件通过Command Queue来读取控制命令

不采用Command Queue,GE每个task结束都要触发一次中断,而采用Command Queue,GE可以完成多个Task后, 才触发一次中断,减少系统调度开销。命令队列采用ring buffer方式实现:

../../../_images/ge_function_cmdq_0.png

图 9.10 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

Case 0:CMD Ring Buffer没有回绕

../../../_images/ge_function_cmdq_1.png

图 9.11 Ring buf无回绕

Case 1:CMD Ring Buffer有回绕

../../../_images/ge_function_cmdq_2.png

图 9.12 Ring buf有回绕

9.2.2.8.1. Task格式

Task由多个 CMD Group组成

../../../_images/ge_function_task_0.png

图 9.13 Task格式

9.2.2.8.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

../../../_images/ge_function_task_1.png

图 9.14 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: 由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步进寄存器

  1. 如果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

  1. 如果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.9. 限制条件

  • 任意角度旋转不支持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格式