跳转至

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

./sgs_demo_gfx <cmd_index> <disp_type> <buffer_mode>

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 旋转功能演示

运行命令

./sgs_demo_gfx 0 2 1

正常运行现象

  • 控制台输出 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 图案绘制演示

运行命令

./sgs_demo_gfx 1 2 1

正常运行现象

  • 控制台输出 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,程序会:

  1. 设置绘制线程退出标志
  2. 等待绘制线程结束
  3. 等待刷新线程结束(双缓冲模式)
  4. 反初始化 DISP 模块
  5. 关闭 GFX 设备
  6. 退出系统