# sample_gpu_3d 使用说明
X53D GPU 支持以下标准 API：
- EGL
- OpenGLES
- Vulkan
- OpenCL

其中， EGL 作为中间层 API，提供了与底层硬件的交互支持。因此，针对以下三种 API 提供了相应的示例代码：
1. OpenGLES 示例
2. Vulkan 示例
3. OpenCL 示例

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

## OpenGL ES

### sample_bezier
#### 功能概述
功能描述：`sample_bezier` 使用 3D GPU 画一条贝塞尔曲线，并将图片保存到文件中

##### 软件架构说明

![ framwork_bezier ](./_static/_images/sample_gpu_3d/framwork_bezier.png)

##### 代码位置及目录结构
- 代码位置 `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 ](./_static/_images/sample_gpu_3d/sample_bezier_data_flow.png)

###### vdk_init
`vdk_init`（对应整体流程中的黄色背景部分）属于 `libVDK.so` 中的函数，对 EGL 接口的封装，完成在没有桌面系统时，基于 DRM+GBM 实现 EGL 上下文的初始化

![ sample_bezier_vdk_init_data_flow ](./_static/_images/sample_gpu_3d/sample_bezier_vdk_init_data_flow.png)

#### 编译部署
##### 编译
- 进入 sample_bezier 目录，执行 `make` 编译
- 输出成果物是 sample_bezier 源码目录下的 `bezier`
- 详细程序编译方式请查阅 [ 编译方法 ](overview.html#span-id-sample-build) 章节

##### 程序部署

1. 把目录 `sample_bezier` 上传到开发板 `/userdata` 目录下
2. 进入 `sample_bezier` 运行 `chmod +x bezier` 命令给程序赋予可执行权限

#### 运行
##### 程序运行方法

加载驱动：

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

通过 `HDMI` 接口接入显示器并执行程序：`./bezier`

##### 程序参数选项说明
无
##### 运行效果
执行命令：<br>
`./bezier`

运行日志：<br>
无

效果说明：<br>
当前目录下，会生成如下 bmp 格式的图像文件： `bezier.bmp`，文件中 红色线条是一条贝塞尔曲线

![ 效果 ](./_static/_images/sample_gpu_3d/sample_bezier_result.png)

## OpenCL
### sample_matrix_multiply
#### 功能概述
功能描述：`sample_matrix_multiply` 完成分别利用 3D GPU 和 CPU 进行相同的矩阵运行，并打印两者的耗时

##### 软件架构说明

![ framwork_matrix_mulpi ](./_static/_images/sample_gpu_3d/framwork_matrix_mulpi.png)

##### 代码位置及目录结构
- 代码位置 `app/samples/platform_samples/sample_gpu_3d/cl/sample_matrix_multiply`
- 目录结构
```
└── sample_matrix_multiply
    ├── Makefile
    └── matrix_multiply.c
```
##### API 流程说明

###### 整体流程

![ sample_matrix_mulpti_data_flow ](./_static/_images/sample_gpu_3d/sample_matrix_mulpti_data_flow.png)

###### matirc_mult_opencl

函数 `matirc_mult_opencl` 使用 GPU 完成 矩阵乘法运算，流程如下（对应整体流程中的黄色背景部分）

![ sample_matrix_mulpti_opencl_data_flow ](./_static/_images/sample_gpu_3d/sample_matrix_mulpti_opencl_data_flow.png)


#### 编译部署

##### 编译
- 进入 sample_matrix_multiply 目录，执行 `make` 编译
- 输出成果物是 sample_matrix_multiply 源码目录下的 `matrix_multiply`
- 详细程序编译方式请查阅 [ 编译方法 ](overview.html#span-id-sample-build) 章节

##### 程序部署
1. 把目录 `sample_matrix_multiply` 上传到开发板 `/userdata` 目录下
2. 进入 `sample_matrix_multiply` 运行 `chmod +x matrix_multiply` 命令给程序赋予可执行权限


#### 运行
##### 程序运行方法
执行可执行程序：`./matrix_multiply`
##### 程序参数选项说明
无
##### 运行效果
执行命令：
`./matrix_multiply`
运行日志：
```sh
./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 有更高得性能
