1. 项目概述
最近完成了将cix p1芯片适配到OpenHarmony 6.0r版本的工作,并成功实现了Vulkan图形API的对接,同时提供了完整的Vulkan SDK工具链。这个项目对于想要在OpenHarmony系统上使用Vulkan进行图形开发的开发者来说,提供了完整的解决方案。
项目已经开源在Gitee和GitHub平台:
- Gitee地址:https://gitee.com/cix_oh/cix_p1_oh
- GitHub地址:https://github.com/lbkg/cix_p1_oh
2. 环境准备与编译步骤
2.1 基础环境搭建
首先需要准备OpenHarmony 6.0r的源码环境:
bash复制repo init -u https://gitcode.com/openharmony/manifest -b refs/tags/OpenHarmony-v6.0-Release --no-repo-verify
repo sync -c
repo forall -c 'git lfs pull'
注意:repo sync过程可能需要较长时间,取决于网络状况。建议使用稳定的网络连接,必要时可以配置repo镜像源加速下载。
2.2 项目环境配置
bash复制# 搭建环境,/root/OpenHarmony/cixin/temp是oh源码目录
bash ./cix_env.sh /root/OpenHarmony/cixin/temp
# 进入源码目录打补丁
bash ./cix_patch/patch.sh
# 安装依赖
./build/build_scripts/env_setup.sh
source ~/.bashrc
2.3 Vulkan SDK集成
bash复制# 下载OpenHarmony 6.0r vulkansdk
git clone -b 6.0_tag https://gitee.com/cix_oh/oh_vulkansdk.git device/soc/cix/sky1/resources/vulkansdk/oh_vulkansdk
2.4 完整编译
bash复制rm -rf out && ./build.sh --product-name sky1_evb --ccache
3. Vulkan对接实现细节
3.1 GPU驱动支持
cix p1芯片使用的Mali GPU驱动库libmail.so已经同时提供了OpenGL和Vulkan的支持。这是Vulkan能够在系统上运行的基础。

3.2 Vulkan配置文件
为了让Vulkan Loader能够正确识别和使用Mali驱动,需要创建相应的json配置文件:
json复制{
"file_format_version": "1.0.0",
"ICD": {
"library_path": "libmali.so",
"api_version": "1.3.0"
}
}
这个配置文件需要放置在系统特定的目录下,通常是/usr/share/vulkan/icd.d/。
3.3 Vulkan测试样例
OpenHarmony中提供了Vulkan的测试样例,可以用来验证Vulkan功能是否正常工作:
https://gitcode.com/openharmony/applications_app_samples/tree/OpenHarmony-v6.0-Release/code/BasicFeature/Native/NdkVulkan
4. OpenHarmony 6.0r适配过程
4.1 内核升级
由于cix p1芯片已经适配了OpenHarmony公版6.6内核,升级到6.0r版本的第一步就是升级OpenHarmony社区内核。然后下载6.0r代码,修改board和vendor相关配置。
4.2 Vendor仓库修改
vendor仓库需要做以下关键修改:
-
vendor/cix/sky1_evb/config.json中各个子系统需要更新为6.0r rk3568相同的配置,特别注意:build_selinux和build_seccomp设置为falsedevice_stack_size设置为8388608(musl的栈大小)
-
其他需要更新的配置文件:
vendor/cix/sky1_evb/preinstall-configvendor/cix/sky1_evb/resourceschedulevendor/cix/sky1_evb/security_configvendor/cix/sky1_evb/updater_configvendor/cix/sky1_evb/window_config
提示:这些配置文件的更新可以参考rk3568的6.0r版本配置,然后根据cix p1芯片的特性进行适当修改。
4.3 编译系统调整
build仓库的修改主要是为了确保系统能够编译通过并正常启动。这部分工作需要根据具体的编译错误进行调整,通常包括:
- 依赖库的版本调整
- 编译选项的修改
- 系统组件的适配
5. Vulkan SDK工具链实现
5.1 SDK组件
Vulkan SDK包含多个重要组件:
- glslang:GLSL着色器编译器
- vulkan-headers:Vulkan头文件
- vulkan-loader:Vulkan加载器
- vulkan-validationlayers:验证层
- vulkan-tools:工具集
- shaderc:着色器编译器
5.2 交叉编译方法
在OpenHarmony环境下交叉编译Vulkan SDK:
bash复制cd device/soc/cix/sky1/resources/vulkansdk
./vulkansdk_ohos.sh --maxjobs all
5.3 库文件处理
由于OpenHarmony和交叉编译的Vulkan SDK都提供了libvulkan.so和libvulkan_swapchain.so库,需要进行隔离处理:
- 将OpenHarmony的libvulkan.so重命名为libvulkan_oh.so
- 将OpenHarmony的libvulkan_swapchain.so重命名为libvulkan_swapchain_oh.so
这样可以避免库文件冲突,确保系统能够正确加载所需的Vulkan实现。
6. 常见问题与解决方案
6.1 编译错误处理
在编译过程中可能会遇到各种错误,以下是一些常见问题及解决方法:
-
依赖缺失:
- 确保所有依赖库都已正确安装
- 检查环境变量设置是否正确
-
符号冲突:
- 检查是否有重复定义的符号
- 确认库文件版本是否兼容
-
内存不足:
- 增加swap空间
- 使用ccache加速编译
6.2 Vulkan运行时问题
-
Vulkan设备未找到:
- 检查GPU驱动是否正确安装
- 确认icd配置文件位置和内容正确
-
验证层错误:
- 确保验证层库文件路径正确
- 检查验证层版本是否匹配
-
着色器编译失败:
- 检查GLSL版本是否支持
- 确认glslang版本兼容性
7. 性能优化建议
7.1 GPU利用率优化
- 使用适当的队列家族
- 合理设置内存类型
- 优化资源绑定方式
7.2 渲染管线优化
- 减少管线状态切换
- 使用管线缓存
- 优化描述符集布局
7.3 内存管理
- 使用内存池
- 合理分配内存类型
- 避免频繁的内存分配/释放
8. 实际应用案例
8.1 深度学习推理加速
Vulkan可以用于加速深度学习推理过程,通过GPU加速大幅提升计算性能。具体实现可以参考项目中的相关示例。
8.2 图形渲染应用
基于Vulkan可以开发高性能的图形渲染应用,如3D游戏、AR/VR应用等。OpenHarmony的多窗口特性与Vulkan结合可以实现丰富的图形界面效果。
8.3 计算任务加速
除了图形渲染,Vulkan的计算管线还可以用于通用计算任务,如图像处理、视频编解码等计算密集型任务。
9. 相关资源
- 此芯p1开发板使用OpenHarmony时llama.cpp不同优化速度对比(GPU vs CPU)
- 以此芯p1芯片为例研究OpenHarmony上GPU (Vulkan) 加速在深度学习推理中的价值
- 开源!移植此芯p1芯片驱动到OpenHarmony社区内核上
- cix p1芯片OpenHarmony社区内核版本从6.6.89升级到6.6.101
- 开源!!!cix p1 芯片OpenHarmony社区公版6.6.101适配AMD显卡
- cix p1芯片OpenHarmony标准系统烧录方法
10. 开发建议
- 调试工具:充分利用Vulkan的调试工具和验证层,可以在开发早期发现潜在问题。
- 性能分析:使用Vulkan的性能分析工具定位性能瓶颈。
- 代码组织:合理组织Vulkan相关代码,便于维护和扩展。
- 错误处理:实现完善的错误处理机制,确保程序稳定性。
- 资源管理:注意Vulkan资源的生命周期管理,避免内存泄漏。
