From 174a0e16ffd529f5ea19badb3aac1c85302f0adb Mon Sep 17 00:00:00 2001 From: shegangbin Date: Mon, 27 Nov 2023 12:53:10 +0800 Subject: [PATCH] oat and readme Signed-off-by: shegangbin --- OAT.xml | 29 ++++++++++++ README.OpenSource | 11 +++++ README_OpenHarmony.md | 44 ++++++++++++++++++ ...an-validationlayers_architecture_in_OH.png | Bin 0 -> 9348 bytes ...vulkan-validationlayers_load_way_in_OH.png | Bin 0 -> 13873 bytes 5 files changed, 84 insertions(+) create mode 100644 OAT.xml create mode 100644 README.OpenSource create mode 100644 README_OpenHarmony.md create mode 100644 imgs/vulkan-validationlayers_architecture_in_OH.png create mode 100644 imgs/vulkan-validationlayers_load_way_in_OH.png diff --git a/OAT.xml b/OAT.xml new file mode 100644 index 000000000..76137c9f2 --- /dev/null +++ b/OAT.xml @@ -0,0 +1,29 @@ + + + + + + LICENSE.txt + + + + + + + \ No newline at end of file diff --git a/README.OpenSource b/README.OpenSource new file mode 100644 index 000000000..f35c2dd96 --- /dev/null +++ b/README.OpenSource @@ -0,0 +1,11 @@ +[ + { + "Name": "Vulkan-ValidationLayers", + "License": "Apache-2.0", + "License File": "LICENSE", + "Version Number": "v1.3.231", + "Owner": "liuzhiyuan31@huawei.com", + "Upstream URL": "https://github.com/KhronosGroup/Vulkan-ValidationLayers.git", + "Description": "This project provides Vulkan validation layers that can be enabled to assist development by enabling developers to verify their applications correct use of the Vulkan API." + } +] \ No newline at end of file diff --git a/README_OpenHarmony.md b/README_OpenHarmony.md new file mode 100644 index 000000000..6d1a334d5 --- /dev/null +++ b/README_OpenHarmony.md @@ -0,0 +1,44 @@ +# Vulkan-ValidationLayers + +本仓库包含开源软件Vulkan-ValidationLayers,为OpenHarmony提供了Vulkan验证层,大部分Vulkan API都不会进行错误检查,因为执行这些错误检查会降低性能,Vulkan验证层可以在应用程序开发期间为开发者提供一些错误检查,帮助开发者正确使用Vulkan API。 + +## Vulkan-ValidationLayers的实现方式 + +Vulkan-ValidationLayers被实现为一个Vulkan Layer,由Vulkan-Loader加载并使用,Vulkan-Loader的功能请参考[Vulkan-Loader](https://gitee.com/openharmony/third_party_vulkan-loader/blob/master/README_OpenHarmony.md)。 + +![vulkan-validationlayers_architecture_in_OH](imgs/vulkan-validationlayers_architecture_in_OH.png) + + +## Vulkan-Loader加载验证层的方式 + +Vulkan-ValidationLayers在系统目录下会提供一个json配置文件`VkLayer_khronos_validation.json`和一个so文件`libVkLayer_khronos_validation.so`。 + +Vulkan-Loader扫描指定目录下的json配置文件,解析出so的位置并加载对应的so文件。 + +![vulkan-validationlayers_load_way_in_OH](imgs/vulkan-validationlayers_load_way_in_OH.png) + + +## 构建指导 + +适配OpenHarmony平台的编译脚本请见:[build-openharmony/BUILD.gn](build-openharmony/BUILD.gn) + +由于graphic_2d模块的编译脚本中包含了Vulkan-ValidationLayers(详见:[bundle.json](https://gitee.com/openharmony/graphic_graphic_2d/blob/master/bundle.json)),所以编译graphic_2d模块可以将Vulkan-ValidationLayers同时编译出来,以rk3568平台为例,编译命令: + +```shell +./build.sh --product-name rk3568 --ccache --build-target graphic_2d +``` + +也可以单独编译Vulkan-ValidationLayers: + +```shell +./build.sh --product-name rk3568 --ccache --build-target VkLayer_khronos_validation +``` + +编译完成后会在`out/rk3568/graphic/graphic_2d`目录下生成`libVkLayer_khronos_validation.so` + + +## License + +Apache License 2.0 + +见 [LICENSE](LICENSE.txt). \ No newline at end of file diff --git a/imgs/vulkan-validationlayers_architecture_in_OH.png b/imgs/vulkan-validationlayers_architecture_in_OH.png new file mode 100644 index 0000000000000000000000000000000000000000..c32d6be35785db3beb749edfa3daef7926e5a526 GIT binary patch literal 9348 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