GFX Demo 使用说明¶
1. 功能场景介绍¶
1.1 程序概述¶
本示例演示如何使用 GFX(Graphic Engine)模块进行图形处理,通过 Framebuffer 将图形显示到屏幕上。Demo 支持 TTL、MIPI、HDMI 三种显示接口,并自动适配不同分辨率的显示区域。
1.2 主要特性¶
- 多显示接口支持:兼容 TTL、MIPI、HDMI 三种显示接口,自动检测并调整显示区域
- 双缓冲支持:支持单缓冲和双缓冲模式,双缓冲模式可避免画面撕裂
- 硬件加速:利用 GFX 硬件加速进行图形绘制,性能优越
- 旋转演示:支持 0°、90°、180°、270° 旋转,展示硬件旋转能力
- 图案绘制:使用渐变色直线绘制,展示 MI_GFX_DrawLine API
- DISP 集成:DISP 模块持续输出 YUV420 数据作为背景
- 显示区域自适应:
- HDMI(1920×1080):使用 ¼ 屏幕(480×540)以减少 GFX 硬件负担
- MIPI/TTL(小分辨率):使用 ½ 屏幕进行最佳显示
1.3 Demo 场景¶
| 场景 | 命令索引 | 功能描述 | 输入文件 |
|---|---|---|---|
| 场景1 | 0 | GFX 旋转功能演示 | 480x800.rgb (BGRA8888) |
| 场景2 | 1 | GFX 图案绘制演示 | 无(程序生成渐变图案) |
2. 编译环境说明¶
2.1 编译环境设置¶
在项目根目录下设置 arm64 编译环境:
export PATH=/tools/toolchain/aarch64-unknown-linux-gcc-12.4.0-glibc-2.37-gnu/bin:$PATH
export CROSS_COMPILE=aarch64-unknown-linux-gnu-12.4.0-
export ARCH=arm64
cd project
make linux-comake_mhera.emmc.glibc-12.4.0-arm64-ext4.d3.4096.fccsp16_lpddr4x_defconfig
如果选用2GB的ddr,defconfig可以使用 linux-comake_mhera.emmc.glibc-12.4.0-arm64-ext4.d3.2048.fccsp16_lpddr4x_defconfig
2.2 编译命令¶
# 编译整个 project
cd project
make clean;make image -j16
# 编译 GFX demo
cd sdk/verify/sample_code
make source/<chip>/gfx/gfx_demo
2.3 编译产物¶
sgs_demo_gfx可执行文件位于sample_code/out/arm64/app目录下
3. 运行环境说明¶
3.1 硬件要求¶
- 已连接显示屏(TTL、MIPI 或 HDMI)
- Framebuffer 驱动已加载
- 如使用 HDMI,需确保硬件支持 1080P@60Hz 输出
注意!Comake PI D3不支持TTL
具体连接可参考下图

注意:PANEL与MIPI线接入板端的时候,金属面朝上,蓝色朝下
3.2 软件要求¶
- Framebuffer 设备
/dev/fb0存在 - DISP 模块驱动已加载
- GFX 模块驱动已加载
- Framebuffer 内存足够支持双缓冲(如果使用双缓冲模式)
双缓冲内存要求:
- 单缓冲:
xres_virtual * yres * bytes_per_pixel -
双缓冲:
xres_virtual * yres * 2 * bytes_per_pixel如果
Vinfo.yres_virtual / Vinfo.yres < 2,双缓冲刷新线程会报错提示。
3.3 网络环境¶
本 Demo 不需要网络环境。
3.4 资源文件¶
运行时需要模型文件支持,文件需要按照如下目录放置:
sgs_demo_gfx # 板端可执行文件
resource # 资源文件存放公共根目录
input/ # 输入文件目录
├── 480x800.rgb # 480x800 BGRA8888 格式图片
└── YUV420SP_320_240.yuv # 320x240 NV12 格式图片(DISP背景)
资源文件说明:
480x800.rgb:480×800 分辨率的 BGRA8888 格式图片,用于旋转演示YUV420SP_320_240.yuv:320×240 分辨率的 NV12 格式图片,用于 DISP 背景显示
注意:确保所有资源文件完整且格式正确,否则可能导致读取失败或显示异常。
3.5 屏参配置¶
在项目对应板型的配置文件中(如 project/board/<chip>/<board_model>/config/config_fb.json)将 disp_path 参数修改为使用的屏参配置
4. 运行说明¶
4.1 程序部署¶
将编译生成的可执行文件 sgs_demo_gfx 拷贝到板端或者 NFS/CIFS 挂载目录下,并修改权限为 777。
将资源文件拷贝到 sgs_demo_gfx 同级目录,如下:
sgs_demo_gfx # gfx demo 可执行文件
resource # 资源文件存放目录
input/ # 输入文件目录
├── 480x800.rgb # 480x800 BGRA8888 格式图片
└── YUV420SP_320_240.yuv # 320x240 NV12 格式图片(DISP背景)
4.2 运行 demo¶
4.3 命令行参数说明¶
| 参数 | 说明 | 取值范围 |
|---|---|---|
| cmd_index | Demo 场景选择 | 0=旋转演示,1=图案绘制 |
| disp_type | 显示屏类型 | 0=TTL,1=MIPI,2=HDMI |
| buffer_mode | Framebuffer 模式 | 0=单缓冲,1=双缓冲 |
参数详细说明:
-
cmd_index:
- 0:执行 GFX 旋转功能演示。读取 480x800.rgb 文件,依次进行 0°、90°、180°、270° 旋转显示
- 1:执行 GFX 图案绘制演示。绘制绿-蓝-红渐变图案
-
disp_type:根据实际连接的屏幕类型选择
- 0:TTL 并行接口屏幕(小分辨率,如 480×800)
- 1:MIPI DSI 串行接口屏幕(小分辨率,如 480×800 或 720×1280)
- 2:HDMI 接口(** 1920×1080@60Hz**,大分辨率)
-
buffer_mode:
- 0:单缓冲模式,直接在显示缓冲区绘制
- 1:双缓冲模式,使用后台缓冲区绘制,然后切换显示(推荐)
5. 运行结果说明¶
5.1 正常运行状态¶
程序启动后,会在终端显示初始化信息,包括 Framebuffer 信息、DISP 初始化信息、显示接口类型和配置信息。同时屏幕上会显示相应的图形内容。
5.2 各功能场景运行结果¶
5.2.1 场景1:GFX 旋转功能演示¶
运行命令:
正常运行现象:
- 控制台输出 Framebuffer 信息
- 控制台输出 DISP 初始化信息
- 控制台输出显示接口类型和配置信息
- 屏幕显示 480x800 的图片
- 每隔 2 秒图片旋转一次(0° -> 90° -> 180° -> 270° -> 0°...)
显示效果:
- HDMI 模式:图片显示在屏幕左上角的 ¼ 区域(480×540),保持纵横比适配
- MIPI/TTL 模式:图片居中显示在屏幕左半部分(½ 屏幕)
- 旋转时自动调整显示位置以保持居中
- 支持缩放以适应屏幕尺寸
HDMI 模式(1920×1080)输出示例:
[Display Interface] HDMI mode (1080P@60Hz standard timing)
[Display Configuration] Interface=2 (TTL=0, MIPI=1, HDMI=2), SyncMode=16 (USER=0, 1080P60=16)
Framebuffer info:
...
[Rotate] Display mode: HDMI (high resolution detected)
[Rotate] Target area: 1/4 screen (480x540) to reduce GFX hardware load
[Rotate] Framebuffer resolution: 1920x1080, Virtual: 1920x4320
[Rotate] Source image: 480x800 BGRA8888, Target crop area: 480x540
[Rotate] Successfully loaded RGB file: resource/input/480x800.rgb (480x800, stride=1920)
[Rotate] Attempting rotation 0: src(480x800) -> dst(1920x1080), dstRect(0,135,480x540)
...
DISP init success
GFX init success
Rotation demo started, press Ctrl+C to quit
Displaying rotation 0 degrees...
Displaying rotation 90 degrees...
Displaying rotation 180 degrees...
Displaying rotation 270 degrees...
...
5.2.2 场景2:GFX 图案绘制演示¶
运行命令:
正常运行现象:
- 控制台输出 Framebuffer 信息
- 控制台输出 DISP 初始化信息
- 控制台输出显示接口类型和配置信息
- 屏幕显示绿-蓝-红渐变图案
- 图案从左到右逐列绘制
显示效果:
- 屏幕上半部分显示绿色到蓝色渐变
- 屏幕下半部分显示蓝色到红色渐变
- 绘制完成后清屏,重新开始绘制
Framebuffer 信息输出示例:
Fixed screen info:
id: FB0
smem_start: 0x597b8000
smem_len: 33177600
...
Variable screen info:
xres: 1920
yres: 1080
xres_virtual: 1920
yres_virtual: 4320
yoffset: 1080
bits_per_pixel: 32
...
MIPI 模式(720×1280)输出示例:
[Display Interface] MIPI mode (user-defined timing)
[Display Configuration] Interface=1 (TTL=0, MIPI=1, HDMI=2), SyncMode=0 (USER=0, 1080P60=16)
Framebuffer info:
...
[Rotate] Display mode: MIPI/TTL (standard resolution)
[Rotate] Target area: 1/2 screen (360x1280) for optimal display
...
5.3 常见问题¶
5.3.1 打开 Framebuffer 失败¶
错误信息:Error: cannot open framebuffer device
可能原因:
- Framebuffer 驱动未加载
- /dev/fb0 设备不存在
解决方法:
- 检查内核配置是否启用 Framebuffer
- 检查屏参配置是否正确
5.3.2 双缓冲不可用¶
错误信息:double buffer cannot be used because of insufficient memory!!
可能原因:
- Framebuffer 内存不足
yres_virtual配置不正确
解决方法:
- 使用单缓冲模式运行
- 检查屏参配置中的 Framebuffer 大小设置
注意事项:双缓冲模式需要 Framebuffer 内存至少为单缓冲的 2 倍。如果 yres_virtual < yres * 2,双缓冲刷新线程会报错提示。
5.3.3 资源文件读取失败¶
错误信息:read ./resource/input/480x800.rgb fail
可能原因:
- 资源文件不存在
- 路径不正确
- 文件权限不足
解决方法:
- 确保资源目录结构正确
- 检查文件权限
- 使用
chmod命令修改文件权限
注意事项:
- 资源文件必须放在运行目录的
./resource/input/下 - 480x800.rgb 必须是 BGRA8888 格式
- YUV420SP_320_240.yuv 必须是 NV12 格式
5.3.4 MI_GFX_DrawLine 失败¶
错误信息:MI_GFX_DrawLine fail!
可能原因:
- GFX 设备未正确初始化
- 内存分配失败
- 参数设置错误
解决方法:
- 检查 MI_SYS 和 MI_GFX 初始化返回值
- 确认内存资源充足
- 验证参数设置
5.3.5 旋转显示异常¶
可能原因:
- 目标矩形计算错误
- 剪裁矩形设置不正确
- 坐标越界
解决方法:
- 检查显示区域计算逻辑
- 确认剪裁矩形在目标区域内
- 验证坐标值
5.3.6 屏参配置注意事项¶
- 运行前必须在项目对应板型的配置文件中配置正确的屏参
- 确保
disp_path参数与实际使用的屏幕类型匹配 - 根据实际连接的屏幕类型选择正确的 disp_type 参数(0=TTL, 1=MIPI, 2=HDMI)
- HDMI 输出需要确保硬件支持 1080P@60Hz
- 不同接口的显示区域会自动适配,无需手动调整代码
5.3.7 性能注意事项¶
- 双缓冲模式可以避免画面撕裂
- 旋转操作使用硬件加速,性能较高
- 图案绘制使用逐列绘制,速度较慢
- HDMI 模式使用较小显示区域以减少 GFX 硬件负担
- 旋转是基于 GFX 硬件加速实现的,HDMI 模式下,90°/270° 旋转时可能会有轻微性能影响(已通过缩小显示区域优化)
5.3.8 GFX 与 DISP 同步说明¶
- DISP 输入端口持续接收 YUV 数据用于背景显示
- GFX 绘制内容叠加在 DISP 视频层之上的 GOP 层
5.3.9 程序退出¶
按 Ctrl+C 键退出 Demo,程序会:
- 设置绘制线程退出标志
- 等待绘制线程结束
- 等待刷新线程结束(双缓冲模式)
- 反初始化 DISP 模块
- 关闭 GFX 设备
- 退出系统