AC707NGPU
📎 原始文档:https://www.kdocs.cn/l/cl029LtB92Je
目录
01 GPU 功能简介
Introduction to GPU Functions
![]() 02 | GPU 驱动接口 GPU driver interface |
|---|---|
![]() 03 | GPU 驱动管理 GPU driver management |
04
GPU 驱动移植
GPU driver porting
01 GPU 功能简介
Introduction to GPU Functions
- 基于指令链表,减少CPU开销,渲染性能 1pixel/cycle;
- 高密度指令集,减少内存开销;
- 支持仿射变换(2D) 、透视变换(2. 5D),采用变换矩阵进行控制;
- 支持多种颜色格式输入( 19种) /输出( 6种) ;
- 支持多种压缩方式,可灵活选择大小优先/性能优先;
- 支持多种混合模式,灵活处理前景、背景透明度计算;
- 支持颜色格式大小端(bpp<8 or RGB565)或 RED-BULE交换;
- 支持mask、线性渐变填充、纹理裁剪等功能;
- 支持非连续数据(采用mmu tab表)输入;
- 支持直接从SRAM/ PSRAM、 NORFLASH存储介质读取数据;
- 支持GPU断点指令功能,允许在GPU任务链运行中中断、恢复;
- 支持colorkey、 dither 拓展功能等 … …
01 GPU 功能简介
Introduction to GPU Functions
Ø MASK 不支持变换,线性渐变填充只有透视变换。
| 功能 | 定义 |
|---|---|
| 纯色填充 | GPU_FILL |
| 纯色填充+MASK | GPU_FILL_MASK |
| 纯色填充+仿射变换 | GPU_FILL_AFFINE |
| 纯色填充+透视变换 | GPU_FILL_PERSPECTIVE |
| 线性渐变填充 | GPU_LINEGRAD |
| 线性渐变填充+透视变换 | GPU_LINEGRAD_PERSPECTIVE |
| 纹理填充 | GPU_TEXTURE |
| 纹理填充+MASK | GPU_TEXTURE_MASK |
| 纹理填充+仿射变换 | GPU_TEXTURE_AFFINE |
| 纹理填充+透视变换 | GPU_TEXTURE_PERSPECTIVE |
01 GPU 功能简介
Introduction to GPU Functions
Ø GPU 支持的输入颜色格式
| ARGB8888 | L8 |
|---|---|
| ARGB8565 | L4 |
| ARGB1555 | L2 |
| ARGB4444 | L1 |
| RGB888 | A8 |
| RGB565 | A4 |
| YUV422_BT601 | A2 |
| YUV422_BT709 | A1 |
| AL88 | |
| AL44 | |
| AL22 |
01 GPU 功能简介
Introduction to GPU Functions
Ø GPU 颜色表查找格式,需通过颜色表进行扩展
| ARGB8888 | L8 |
|---|---|
| ARGB8565 | L4 |
| ARGB1555 | L2 |
| ARGB4444 | L1 |
| RGB888 | A8 |
| RGB565 | A4 |
| YUV422_BT601 | A2 |
| YUV422_BT709 | A1 |
| AL88 | |
| AL44 | |
| AL22 |
01 GPU 功能简介
Introduction to GPU Functions
Ø GPU 颜色表格式
| ARGB8888 | L8 |
|---|---|
| ARGB8565 | L4 |
| ARGB1555 | L2 |
| ARGB4444 | L1 |
| RGB888 | A8 |
| RGB565 | A4 |
| YUV422_BT601 | A2 |
| YUV422_BT709 | A1 |
| AL88 | |
| AL44 | |
| AL22 |
01 GPU 功能简介
Introduction to GPU Functions
Ø MASK 功能支持的颜色格式
| ARGB8888 | L8 |
|---|---|
| ARGB8565 | L4 |
| ARGB1555 | L2 |
| ARGB4444 | L1 |
| RGB888 | A8 |
| RGB565 | A4 |
| YUV422_BT601 | A2 |
| YUV422_BT709 | A1 |
| AL88 | |
| AL44 | |
| AL22 |
01 GPU 功能简介
Introduction to GPU Functions
Ø GPU 输出支持的颜色格式

| ARGB8888 | L8 |
|---|---|
| ARGB8565 | L4 |
| ARGB1555 | L2 |
| ARGB4444 | L1 |
| RGB888 | A8 |
| RGB565 | A4 |
| YUV422_BT601 | A2 |
| YUV422_BT709 | A1 |
| AL88 | |
| AL44 | |
| AL22 |
01 GPU 功能简介
Introduction to GPU Functions
| 混合模式定义 | 计算公式 |
|---|---|
| GPU_BLEND_SRC | a_out = a_fgc_out = c_fg |
| GPU_BLEND_SRC_OVER | a_out = a_fg + ( 1 - a_fg) * a_bgc_out = c_fg + ( 1 - a_fg) * c_bg |
| GPU_BLEND_DST_OUT | a_out = ( 1 - a_fg) * a_bgc_out = ( 1 - a_fg) * c_bg |
| GPU_BLEND_DST_IN | a_out = a_fg * a_bgc_out = a_fg * c_bg |
| GPU_BLEND_MAX | a_out = MAX( a_fg , a_bg)c_out = c_bg |
| GPU_BLEND_DST_OVER | a_out = ( 1 - a_bg) * a_fg + a_bgc_out = ( 1 - a_bg) * c_fg + c_bg |
| GPU_BLEND_SRC_OUT | a_out = ( 1 - a_bg) * a_fgc_out = ( 1 - a_bg) * c_fg |
| GPU_BLEND_SRC_IN | a_out = a_bg * a_fgc_out = a_bg * c_fg |
注: fg:前景; bg:后景; out:输出; a: alpha; c: color; src前景; dst 后景;
02 GPU 驱动接口
GPU driver interface
注意:GPU 驱动API分两层,本节介绍直接配置GPU寄存器的底层接口,一般情况下
不直接调用本层接口,下节《 GPU 驱动管理》介绍GPU驱动管理层接口。
Ø 在未了解接口功能与逻辑前提下,禁止底层驱动API与驱动管理层API混用!
02
GPU 驱动接口
GPU driver interface
DBI模块为707n系列芯片硬件推屏模块,驱动设计与701n类似,不同点在于:
- 开始推屏时,用 lcd_set_draw_area 设置本次推屏的整个区域即可,无需每次推屏都设置推屏区域;2. 分块推屏时,第一块使用 lcd_draw_kistart 接口启动,之后使用 lcd_draw_continue 接口续传。
Ø 可参考 gpu_task. c 推屏逻辑, lcd_xxx 前缀API的调用。
02
GPU 驱动接口
GPU driver interface
gp不同值不jlgp
转换源格中,
// 杰理UI工具数据格式定义
enum {
PIXEL_FMT_ARGB8888 ,PIXEL_FMT_ARGB8565 ,PIXEL_FMT_ARGB1555 ,PIXEL_FMT_ARGB4444 ,PIXEL_FMT_RGB888 ,PIXEL_FMT_RGB565 ,PIXEL_FMT_AL88 ,PIXEL_FMT_AL44 ,PIXEL_FMT_AL22 ,PIXEL_FMT_L8 ,PIXEL_FMT_L4 ,PIXEL_FMT_L2 ,PIXEL_FMT_L1 ,PIXEL_FMT_A8 ,PIXEL_FMT_A4 ,PIXEL_FMT_A2 ,PIXEL_FMT_A1 ,PIXEL_FMT_JPEG ,
PIXEL_FMT_GIF ,} ;
// 杰理GPU数据格式定义
typedef enum {GPU_FORMAT_ARGB8888=0x00 ,GPU_FORMAT_ARGB8565=0x01 , //out
GPU_FORMAT_ARGB1555=0x02 ,GPU_FORMAT_ARGB4444=0x03 ,GPU_FORMAT_RGB888=0x04 ,GPU_FORMAT_RGB565=0x05 , //out
GPU_FORMAT_YUV422_BT601=0x06 ,GPU_FORMAT_YUV422_BT709=0x07 ,GPU_FORMAT_AL88=0x08 ,GPU_FORMAT_AL44=0x10 ,GPU_FORMAT_AL22=0x11 ,GPU_FORMAT_L8=0x12 ,GPU_FORMAT_L4=0x13 ,GPU_FORMAT_L2=0x14 ,
GPU_FORMAT_L1=0x15 ,
GPU_FORMAT_A8=0x16 , //outGPU_FORMAT_A4=0x17 , //out ,GPU_FORMAT_A2=0x18 , //out ,GPU_FORMAT_A1=0x19 , //out ,} GPU_format_t;
02
GPU 驱动接口
GPU driver interface
jlgpu_driver. h 是GPU驱动底层API ,包含两套驱动代码,其中:
Ø gpu_xxx 前缀的API使用时内部自动生成一条GPU任务链,但该任务链仅支持创建和执行,不支持搜索、修改等功能,若UI框架为串行执行,或UI框架每次调度GPU都必须等GPU执行完毕时可用此接口;
Ø gpu_task_xxx 前缀的API仅对GPU任务单元进行操作,需外部管理GPU任务链等内容。
02
GPU 驱动接口
GPU driver interface
jlgpu_driver. h 是GPU驱动底层API ,包含两套驱动代码,其中:
Ø gpu_xxx 前缀的API使用时内部自动生成一条GPU任务链,但该任务链仅支持创建和执行,不支持搜索、修改等功能,若UI框架为串行执行,或UI框架每次调度GPU都必须等GPU执行完毕时可用此接口;
Ø gpu_task_xxx 前缀的API仅对GPU任务单元进行操作,需外部管理GPU任务链等内容。
02
U d i i f
02
GPU 驱动接口
GPU driver inte f
02
GPU 驱动接口
GPU driver interface
jlgpu_math. h提供一些矩阵计算接口,常用的有:
Ø gpu_matrix_set_identity 设置矩阵为单位矩阵;
Ø gpu_matrix_translate 设置矩阵平移;
Ø gpu_matrix_scale 设置矩阵缩放;
Ø gpu_matrix_rotate 设置矩阵旋转;
Ø gpu_matrix_get_boundbox 获取方框经矩阵变换后的位置大小。
02 GPU 驱动接口
GPU driver interface
- 变换矩阵遵从先缩放、后旋转、再平移的计算顺序,但矩阵计算模块是通过左乘的方式实现矩阵效果叠加的,因此在调用API进行矩阵计算时,API调用顺序应为:先平移、后旋转、再缩
放。
02 GPU 驱动接口
GPU driver interface
- 变换矩阵遵从先缩放、后旋转、再平移的计算顺序,但矩阵计算模块是通过左乘的方式实现矩阵效果叠加的,因此在调用API进行矩阵计算时,API调用顺序应为:先平移、后旋转、再缩放。
- 矩阵乘法不满足交换律,因此计算的先后顺序会影响计算结果:AB ! = BA
- 矩阵乘法满足结合率,因此不同的元素可以叠加同一个变换效果: (AB) C = A ( BC)
- 变换矩阵都是相对于0坐标点进行计算,可理解为需告诉GPU如何才能将元素移到坐标0点,因此计算平移、缩放、旋转时需有不同的注意点:
① 缩放时,因为元素本身是在坐标0点,因此缩放无需平移,只需配置缩放系数即可;
② 旋转时,需先将旋转中心移到坐标0点,再进行旋转计算,旋转计算完毕后需再将元素顶点移回坐标0点;
③ 平移时,可以理解为通过矩阵告诉GPU如何将元素移动到坐标系0点,因此平移参数为负数。
02 GPU 驱动接口
GPU driver interface
Ø 矩阵作用在空间上:
l 平移时,平移参数与目标位置相反,将元素平移到( x, y)坐标位置:
gpu_matrix_translate( matrix, -x, -y) ;
l 旋转时,旋转中心为( cx, cy) ,旋转角度为angle,需将角度转为弧度:{
gpu_matrix_translate( matrix, -cx, -cy) ;
gpu_matrix_rotate( matrix, RADIAN(angle));
gpu_matrix_translate( matrix, cx, xy) ;
}
l 缩放时,将元素宽、高都缩小到0 . 5倍,在空间角度看,是将空间放大2倍:gpu_matrix_scale( matrix, 1/ 0.5 , 1/ 0.5 ) ;
03
GPU 驱动管理
GPU driver management
jlgpu_port. h 是在 jlgpu_driver. h 基础上增加的 GPU 任务管理模块,包含:
Ø GPU 模块开关;
Ø GPU 任务操作;
Ø GPU 任务链操作;
Ø 通过 ID 操作GPU任务;
Ø GPU 多任务链管理。
03
GPU 驱动管理
GPU driver management
typedef struct gpu_mult_list {struct list_head list;pJLGPUTask Head_t head ;struct rect win_rect;
struct rect gpu_rect;
struct rect lcd_rect;u8 index;} JLGPUMultTask List_t , * pJLGPUMultTask List_t;
/* GPU task chain head structur defined /typedef struct gpu_task_head {gpu_out_params_t out_param; // GPU output instructions structure .void * gpu_task_base_adr; // First GPU task instructions address .} JLGPUTask Head_t , * pJLGPUTask Head_t;
/* GPU task unit structure defined. */typedef struct gpu_task_unit {JLGPUTask Info_t info; // GPU task information structure .u32 task_addr; // GPU task instructions address .} JLGPUTask Unit_t , * pJLGPUTask Unit_t;
03
GPU 驱动管理
GPU driver management
/* GPU task information structure defined. Cache required , resources must be saved. */typedef struct gpu_task_info {
u32 task_id; // 任务ID
u32 element_id; // 控件ID
u32 own_matrix : 1; // 矩阵是否属于自己标志(1自己申请的矩阵, 0继承的父控件矩阵)
u32 priority : 31; // 优先级
u8 *cl ut_tab ; // 颜色表
gpu_matrix_t matrix; // 当前任务的变换矩阵
pJLGPUTask Draw_t d raw_info; // custom draw
u32 enable; // GPU task enable, must 32bit
u16 image_width ;u16 image_height;u16 tab_size;u8 face;} JLGPUTask Info_t , * pJLGPUTask Info_t;
/ GPU task unit structure defined. /typedef struct gpu_task_unit {JLGPUTask Info_t info; // GPU task information structure .u32 task_addr; // GPU task instructions address .} JLGPUTask Unit_t , * pJLGPUTask Unit_t;
/ GPU task information structure defined. Cache required , resources must be saved. */
typedef struct gpu_task_info {u32 task_id; // 任务ID
u32 element_id; // 控件ID
u32 own_matrix : 1; // 矩阵是否属于自己标志(1自己申请的矩阵, 0继承的父控件矩阵)
u32 priority : 31; // 优先级
u8 *cl ut_tab ; // 颜色表
gpu_matrix_t *matrix; // 当前任务的变换矩阵
pJLGPUTask Draw_t d raw_info; // custom draw
u32 enable; // GPU task enable, must 32bit
u16 image_width ;u16 image_height;u16 tab_size;u8 face;} JLGPUTask Info_t , * pJLGPUTask Info_t;
// 自定义绘图回调
typedef structgpu_task_draw {void (*cb_func)(int id , u8 *dst_buf , struct rect *dst_r , struct rect *src_r , u8bytes_per_pixel , void * priv , void matrix ) ;void (cb_exit )(voidpriv ) ;voidpriv;intpriv_len;intdraw_id;structrecttask_r;} JLGPUTask Draw_t , * pJLGPUTask Draw_t;
03
GPU 驱动管理
GPU driver man g n
03
GPU 理
GPU
03
GPU 驱动管理
GPU driver management
x
y
UI 框架窗口
从坐标系0点开始,到屏幕宽高
x
y
GPU 绘图窗口
通过 jlgpu_get_win_rect 获取
03 GPU 驱动管理
GPU driver management
l 每条任务链可以设置一个输出区域,通过 jlgpu_set_task_list_out_buf 接口配置,设置任务链输出区域时只需配置 UI 框架的窗口,底层会自动映射到 GPU 绘图窗口。
l area 一般指父控件的绘制框定区域,使用接口jlgpu_get_task_rect 获取。如果父控件无GPU任务,则需将UI框架的父控件区域通过 jlgpu_shift_rect 映射到 GPU 绘图区域内。否则由于元素绘制区域不在父控件区域内,则无法绘制。
l draw 指元素在UI框架中的绘制区域,底层会自动根据变换矩阵等情况映射到 GPU 绘图区域内。
l crop 指元素裁剪出来的区域,需将元素放到坐标系0点进行计算
03
GPU 驱动管理
GPU driver management
GPU 任务链输出窗口
area
darw
l draw 在 area 内,正常显示
GPU 任务链输出窗口
area


darw
l draw 不在 area 内,不能显示
03
GPU 驱动管理
GPU driver management
GPU 任务链输出窗口
area
darw
l 父控件有 GPU 任务jlgpu_get_task_rect 获取 area
GPU 任务链输出窗口
area
darw
l 父控件无 GPU 任务jlgpu_shift_rect 映射 area
03
GPU 驱动管理
GPU driver management
crop_left0
crop
crop_top
crop_width
x
crop_height
(width, height)
纹理放在坐标系0点,宽高为(width, height)裁剪区域计算为:
crop = {
. left = crop_left,
.top = crop_top,
.width = crop_width,
. height = crop_height,
}
需将 crop_en 使能才能启用裁剪功能
y
03
GPU 驱动管理
GPU driver management
l get_rect_align 将纹理在控件范围内进行对齐(上、中、下,左、中、右) ;
• rect 控件区域
• img 纹理,该纹理只需设置宽高,无需设置left、 top,对齐后自动赋值
• hori_align 水平方向对齐方式
• vert_align 垂直方向对齐方式
l get_rect_cover 获取方框的重叠区域;
• a 控件区域
• b 纹理绘制区域
• c 控件与纹理重叠区域
l get_rect_crop 获取图片的裁剪区域;
• draw 纹理绘制区域
• img 纹理实际区域
• crop 纹理裁剪区域
03
GPU 驱动管理
GPU driver management
例:
一个纹理( 80x80) ,控件位置( 20 , 20 , 50 , 50) ,水平、垂直方向均选择居中对齐。此时纹理比图片大,需对纹理进行裁剪显示,计算方法为:
structrectimg , rect;
/* 先不用配置纹理left ,top,根据对齐方式自动计算 */
img.width =80;img.height =80;
// 控件位置区域
rect . left =20;
rect .top =20;
rect .width =50;rect .width =50;
// 通过对齐计算纹理应该绘制的区域
get_rect_align(&rect , & img , HORI_ALIGN_CENTER ,VERT_ALIGN_CENTER) ;
// 输出 img = { 5 , 5 , 80 , 80}
// 通过重叠区域计算纹理需绘制的区域
structrectdraw;get_rect_cover(&rect , & img , & draw) ;
// 输出 draw = { 20 , 20 , 50 , 50},赋值给 task_param . draw// 通过裁剪计算纹理裁剪区域
structrectcrop;
get_rect_crop(& draw , & img , &crop) ;
// 输出 crop = { 15 , 15 , 50 , 50},赋值给 task_param . crop
03
GPU 驱动管理
GPU driver management
task_head 0
jlgpu_create_task_list_head创建一个GPU任务链头
03
GPU 驱动管理
GPU driver management
(cmuommltlisnt组) task_head 0
jlgpu_mult_task_list_add
将任务链头添加到多任务链管理模块
03
GPU 驱动管理
GPU driver management
mult_list
(common组)
task_head 0
task_unit 0
jlgpu_update_task_by_id
创建GPU任务并添加到 head 0 任务链中
03
GPU 驱动管理
GPU driver management
mult_list
(common组)
task_head 0
task_unit 0
task_unit 1
jlgpu_update_task_by_id
创建GPU任务并添加到 head 0 任务链中
03
GPU 驱动管理
GPU driver management
mult_list
(common组)
task_head 0
task_unit 0
task_unit 1
… …

jlgpu_update_task_by_id
直到 task_head 0任务链最后一个任务
03
GPU 驱动管理
GPU driver management
mult_list
(common组)
task_head 0 task_head 1
task_unit 0
task_unit 1
… …
同样:
jlgpu_create_task_list_head创建任务链1jlgpu_mult_task_list_add
将任务链1添加到多任务管理模块
03
GPU 驱动管理
GPU driver management
mult_list
(common组)
task_head 0 task_head 1
task_unit 0 task_unit 0
task_unit 1 … …
… …
jlgpu_update_task_by_id创建GPU任务并添加到 head 1
03
GPU 驱动管理
GPU driver management
mult_list
(common组)
task_head 0 task_head 1 … …
同样方式创建第N条任务链
task_unit 0 task_unit 0
task_unit 1 … …
… …
03
GPU 驱动管理
GPU driver management
(cmuommltlisnt组) task_head 0 task_head 1 … …
task_unit 0 task_unit 0
task_unit 1 … …
… …
task_head0
mult_list
(shadow组)
task_unit 0
task_unit 1
… …
task_head
1
task_unit 0
… …

… …
UI框架和GPU双任务并行时, jlgpu_scheduler GPU调度模块负责将 common 组和 shadow 组来回切换并启动GPU合成,实现一组配置,一组合成。
04
GPU 驱动移植
GPU driver porting

04
GPU 驱动移植
GPU driver porting
voidjlgpu_scheduler_init (void*(*malloc)(int , u32 , u32) , void (free)(void , u32 , u32) , u16 lcd_width ,
| u16 lcd_height ){lcd_draw_set_callback(lcd_flush_finish_cb); | // 设置lcd推屏结束回调 |
|---|---|
| jlgpu_module_init (malloc , free , lcd_width , lcd_height ) ; | // 初始化GPU模块 |
| this->mult_list=jlgpu_mult_task_list_get_common_root(); | // 获取common组多任务管理 |
| task_create(jlgpu_task , NULL , GPU_TASK_NAME) ; | // 创建GPU任务 |
| /* 创建同步信号量 / os_sem_create(& this->gpu_sem , 1 ) ;os_sem_create(& this->lcd_te_sem , 1 ) ;os_sem_create(& this->buffer_sem , 1 ) ; / 初始化标志 / this->has_init=true; / 默认开异步刷新 */ this->redraw_mode = GPU_ASYN_REDRAW;}voidjlgpu_scheduler_free(){jlgpu_module_free(); this->has_init=false;} |
4
GP
GPU
U 驱动移植
driver porting

04
GPU 驱动移植
GPU driver porting

04
GPU 驱动移植
GPU driver porting

04 GPU 驱动移植
GPU driver porting
移植GPU驱动几个基本步骤,以下流程运行如果正常,则GPU驱动已能正常运行,之后再调整其它逻辑完善 UI 框架与 GPU 之间的调度逻辑。
- 启动GPU模块: jlgpu_module_init
- 创建GPU任务链: jlgpu_create_task_list_head
- 设置GPU任务链输出格式: jlgpu_set_task_list_out_format
- 添加GPU任务(先用GPU_FILL测试) : jlgpu_update_task_by_id
- 设置GPU任务链输出buf和输出区域: jlgpu_set_task_list_out_buf
- 执行GPU任务链: jlgpu_task_list_run
- 确认步骤5设置的buf中得到希望输出的结果,至此GPU模块已运行起来。





目录
