3.9. sample_gpu_3d 使用说明

X53D GPU 支持以下标准 API:

  • EGL

  • OpenGLES

  • Vulkan

  • OpenCL

其中, EGL 作为中间层 API,提供底层硬件交互支持。因此,针对以下三种 API 提供相应示例代码:

  1. OpenGLES 示例

  2. Vulkan 示例

  3. OpenCL 示例

根据具体需求选择对应的 API 示例进行参考使用。

3.9.1. OpenGL ES

3.9.1.1. sample_bezier

功能概述

功能描述:sample_bezier 使用 3D GPU 画一条贝塞尔曲线,并图片保存文件

软件架构说明

sample_bezier 支持两种渲染模式:

  • Onscreen 模式(默认):通过 DRM + GBM 在 HDMI 显示器呈现 EGL surface。

  • Offscreen 模式:通过 fbdev 虚拟 framebuffer 离屏渲染,无需物理显示器。

 framwork_bezier

代码位置目录结构
  • 代码位置 app/samples/platform_samples/sample_gpu_3d/gles/sample_bezier

  • 目录结构

sample_bezier/
├── common
│   ├── bmp.c
│   ├── bmp.h
│   ├── vdk_common.c
│   └── vdk_common.h
└── sample_bezier
    ├── bezier.c
    └── Makefile
API 流程说明
整体流程

 sample_bezier_data_flow

vdk_init

vdk_init属于 libVDK.so函数,对 EGL 接口封装,完成没有桌面系统时,基于 DRM+GBM 或 fbdev 实现 EGL 上下文初始化。具体使用哪条路径程序启动设置VDK_PLATFORM 环境变量决定:

  • Onscreen 模式:VDK_PLATFORM=gbm

  • Offscreen 模式:VDK_PLATFORM=fbdev,同时设置 VIV_EGL_PLATFORM=fbdevVFB_ENABLE=1

 sample_bezier_vdk_init_data_flow

编译部署

编译
  • 进入 sample_bezier 目录,执行 make 编译

  • 输出成果物是 sample_bezier 源码目录bezier

  • 详细程序编译方式查阅 编译方法 章节

程序部署
  1. 目录 sample_bezier传到开发板 /userdata 目录

  2. 进入 sample_bezier 运行 chmod +x bezier 命令程序赋予执行权限

运行

sample_bezier 默认走 Onscreen 模式(DRM + GBM),需要通过 HDMI 接入显示面板。如使用显示面板开发板,可通过 -o/--offscreen 选项切换到 Offscreen 模式 fbdev 离屏渲染,产物 bezier.bmp 与 Onscreen 模式一致。

程序参数选项说明
选项 说明
-o, --offscreen 离屏渲染模式,通过 fbdev 渲染(无需物理显示面板)。若指定,则通过 GBM 渲染(需要接入显示面板)
-h, --help 打印帮助信息退出
程序运行方法

Onscreen 模式(默认,需 HDMI 显示面板)

加载驱动:

modprobe panel-jc-050hd134
modprobe galcore
modprobe vio_n2d
modprobe lontium_lt8618
modprobe vs-x5-syscon-bridge
modprobe vs_drm

通过 HDMI 接口接入显示器,并执行程序:

执行命令:
./bezier

运行日志:

Render mode: onscreen (gbm)

Offscreen 模式(-o,无显示面板场景)

执行命令:
./bezier -o

运行日志:

Render mode: offscreen (fbdev)
运行效果

效果说明:
当前目录下,会生成如下 bmp 格式图像文件: bezier.bmp,文件红色线条一条贝塞尔曲线。Onscreen 与 Offscreen 两种模式生成bezier.bmp 内容一致。

 效果

3.9.2. OpenCL

3.9.2.1. sample_matrix_multiply

功能概述

功能描述:sample_matrix_multiply 完成分别利用 3D GPU 和 CPU 进行相同矩阵运行,并打印两者耗时

软件架构说明

 framwork_matrix_mulpi

代码位置目录结构
  • 代码位置 app/samples/platform_samples/sample_gpu_3d/cl/sample_matrix_multiply

  • 目录结构

└── sample_matrix_multiply
    ├── Makefile
    └── matrix_multiply.c
API 流程说明
整体流程

 sample_matrix_mulpti_data_flow

matirc_mult_opencl

函数 matirc_mult_opencl 使用 GPU 完成 矩阵乘法运算,流程如下(对应整体流程黄色背景部分)

 sample_matrix_mulpti_opencl_data_flow

编译部署

编译
  • 进入 sample_matrix_multiply 目录,执行 make 编译

  • 输出成果物是 sample_matrix_multiply 源码目录matrix_multiply

  • 详细程序编译方式查阅 编译方法 章节

程序部署
  1. 目录 sample_matrix_multiply传到开发板 /userdata 目录

  2. 进入 sample_matrix_multiply 运行 chmod +x matrix_multiply 命令程序赋予执行权限

运行

程序运行方法

执行可执行程序:./matrix_multiply

程序参数选项说明

运行效果

执行命令: ./matrix_multiply 运行日志:

./matrix_multiply
CPU execution time: 19.133549 seconds
OpenCL execution time: 0.792543 seconds
Matrices are identical!

效果说明 执行相同矩阵乘法运算:

  1. CPU 耗时: 19.133549 seconds

  2. GPU 耗时: 0.792543 seconds

耗时可以看出矩阵乘法运算时, GPU 比 CPU 有高得性能