From e3ddf10d79505d7f8cdf813526f288d15165e6a4 Mon Sep 17 00:00:00 2001 From: ssdfasd <2156608475@qq.com> Date: Fri, 27 Mar 2026 22:13:17 +0800 Subject: [PATCH] Split Vulkan backend-specific unit tests --- tests/RHI/CMakeLists.txt | 2 + tests/RHI/Vulkan/CMakeLists.txt | 8 ++++ tests/RHI/Vulkan/TEST_SPEC.md | 45 +++++++++++++++++++ tests/RHI/Vulkan/unit/CMakeLists.txt | 38 ++++++++++++++++ .../unit/test_backend_specific.cpp} | 8 ++-- tests/RHI/unit/CMakeLists.txt | 1 - tests/TEST_SPEC.md | 13 +++--- 7 files changed, 105 insertions(+), 10 deletions(-) create mode 100644 tests/RHI/Vulkan/CMakeLists.txt create mode 100644 tests/RHI/Vulkan/TEST_SPEC.md create mode 100644 tests/RHI/Vulkan/unit/CMakeLists.txt rename tests/RHI/{unit/test_vulkan_graphics.cpp => Vulkan/unit/test_backend_specific.cpp} (99%) diff --git a/tests/RHI/CMakeLists.txt b/tests/RHI/CMakeLists.txt index 0495f978..b33e861e 100644 --- a/tests/RHI/CMakeLists.txt +++ b/tests/RHI/CMakeLists.txt @@ -7,6 +7,7 @@ set(CMAKE_CXX_STANDARD_REQUIRED ON) add_subdirectory(D3D12) add_subdirectory(OpenGL) +add_subdirectory(Vulkan) add_subdirectory(unit) add_subdirectory(integration) @@ -34,6 +35,7 @@ add_custom_target(rhi_backend_unit_tests DEPENDS rhi_d3d12_tests rhi_opengl_tests + rhi_vulkan_tests ) add_custom_target(rhi_backend_integration_tests diff --git a/tests/RHI/Vulkan/CMakeLists.txt b/tests/RHI/Vulkan/CMakeLists.txt new file mode 100644 index 00000000..e42efb92 --- /dev/null +++ b/tests/RHI/Vulkan/CMakeLists.txt @@ -0,0 +1,8 @@ +cmake_minimum_required(VERSION 3.15) + +project(rhi_vulkan_tests) + +set(CMAKE_CXX_STANDARD 17) +set(CMAKE_CXX_STANDARD_REQUIRED ON) + +add_subdirectory(unit) diff --git a/tests/RHI/Vulkan/TEST_SPEC.md b/tests/RHI/Vulkan/TEST_SPEC.md new file mode 100644 index 00000000..e723b52b --- /dev/null +++ b/tests/RHI/Vulkan/TEST_SPEC.md @@ -0,0 +1,45 @@ +# Vulkan 测试专项规范 + +本文档是 [tests/TEST_SPEC.md](../TEST_SPEC.md) 在 Vulkan 后端上的补充入口,描述当前已经落地的 Vulkan 专项测试树。 + +## 1. 当前结构 + +```text +tests/RHI/Vulkan/ +|- CMakeLists.txt +|- TEST_SPEC.md +\- unit/ + |- CMakeLists.txt + \- test_backend_specific.cpp +``` + +## 2. 当前目标 + +| 类别 | target | +| --- | --- | +| Vulkan 后端单元测试 | `rhi_vulkan_tests` | + +## 3. 当前覆盖 + +`rhi_vulkan_tests` 当前覆盖 Vulkan 后端专属语义,包括: + +- RenderPass / Framebuffer clear 到真实 Vulkan 纹理后的像素结果验证 +- `CopyResource` 纹理复制后的像素回读验证 +- SPIR-V / GLSL 两条 shader 创建路径 +- 基于 GLSL 的 graphics pipeline 创建 +- UAV 视图创建与 compute dispatch 写纹理链路 + +这些测试允许直接依赖 Vulkan 具体类型、原生句柄和 Vulkan API;这类断言不应再回流到 `tests/RHI/unit/`。 + +## 4. 分层约束 + +- `tests/RHI/unit/` 继续只承载 RHI 抽象层统一语义测试。 +- `tests/RHI/Vulkan/unit/` 承载 Vulkan 专属断言、原生对象检查和需要直接调用 Vulkan API 的测试。 +- 如果后续增加 Vulkan 后端集成测试,应在 `tests/RHI/Vulkan/integration/` 下单独建树,而不是继续堆进 generic abstraction suite。 + +## 5. 推荐执行方式 + +```bash +cmake --build build --config Debug --target rhi_vulkan_tests +build\tests\RHI\Vulkan\unit\Debug\rhi_vulkan_tests.exe --gtest_brief=1 +``` diff --git a/tests/RHI/Vulkan/unit/CMakeLists.txt b/tests/RHI/Vulkan/unit/CMakeLists.txt new file mode 100644 index 00000000..edbab08d --- /dev/null +++ b/tests/RHI/Vulkan/unit/CMakeLists.txt @@ -0,0 +1,38 @@ +cmake_minimum_required(VERSION 3.15) + +get_filename_component(PROJECT_ROOT_DIR ${CMAKE_CURRENT_SOURCE_DIR}/../../../.. ABSOLUTE) + +find_package(GTest REQUIRED) + +if(NOT TARGET Vulkan::Vulkan) + find_package(Vulkan REQUIRED) +endif() + +set(TEST_SOURCES + test_backend_specific.cpp +) + +add_executable(rhi_vulkan_tests ${TEST_SOURCES}) + +target_compile_definitions(rhi_vulkan_tests PRIVATE + XCENGINE_SUPPORT_VULKAN +) + +target_link_libraries(rhi_vulkan_tests PRIVATE + d3d12 + dxgi + d3dcompiler + opengl32 + XCEngine + GTest::gtest + GTest::gtest_main + Vulkan::Vulkan +) + +target_include_directories(rhi_vulkan_tests PRIVATE + ${PROJECT_ROOT_DIR}/engine/include + ${PROJECT_ROOT_DIR}/engine/src +) + +include(GoogleTest) +gtest_discover_tests(rhi_vulkan_tests) diff --git a/tests/RHI/unit/test_vulkan_graphics.cpp b/tests/RHI/Vulkan/unit/test_backend_specific.cpp similarity index 99% rename from tests/RHI/unit/test_vulkan_graphics.cpp rename to tests/RHI/Vulkan/unit/test_backend_specific.cpp index 71d6621c..240a4ce8 100644 --- a/tests/RHI/unit/test_vulkan_graphics.cpp +++ b/tests/RHI/Vulkan/unit/test_backend_specific.cpp @@ -36,7 +36,9 @@ std::wstring ResolveShaderPath(const wchar_t* relativePath) { const DWORD length = GetModuleFileNameW(nullptr, exePath, MAX_PATH); std::filesystem::path rootPath = length > 0 ? std::filesystem::path(exePath).parent_path() : std::filesystem::current_path(); - for (int i = 0; i < 5; ++i) { + while (!rootPath.empty() && + !(std::filesystem::exists(rootPath / "tests" / "RHI") && + std::filesystem::exists(rootPath / "engine" / "include" / "XCEngine"))) { rootPath = rootPath.parent_path(); } return (rootPath / relativePath).wstring(); @@ -503,7 +505,7 @@ void main() { ShaderCompileDesc shaderDesc = {}; shaderDesc.sourceLanguage = ShaderLanguage::GLSL; - shaderDesc.profile = L"vs_4_50"; + shaderDesc.profile = L"vs"; shaderDesc.source.assign(vertexSource, vertexSource + std::strlen(vertexSource)); RHIShader* shader = m_device->CreateShader(shaderDesc); @@ -519,7 +521,7 @@ TEST_F(VulkanGraphicsFixture, CreateShaderFromGlslFileProducesValidVertexShader) ShaderCompileDesc shaderDesc = {}; shaderDesc.fileName = ResolveShaderPath(L"tests/RHI/integration/triangle/Res/Shader/triangle_vulkan.vert"); shaderDesc.entryPoint = L"main"; - shaderDesc.profile = L"vs_4_50"; + shaderDesc.profile = L"vs"; RHIShader* shader = m_device->CreateShader(shaderDesc); ASSERT_NE(shader, nullptr); diff --git a/tests/RHI/unit/CMakeLists.txt b/tests/RHI/unit/CMakeLists.txt index 7acb8b4b..0beead3c 100644 --- a/tests/RHI/unit/CMakeLists.txt +++ b/tests/RHI/unit/CMakeLists.txt @@ -26,7 +26,6 @@ set(TEST_SOURCES test_capabilities.cpp test_views.cpp test_screenshot.cpp - test_vulkan_graphics.cpp ${CMAKE_SOURCE_DIR}/tests/opengl/package/src/glad.c ) diff --git a/tests/TEST_SPEC.md b/tests/TEST_SPEC.md index 97b614a1..0fb4b160 100644 --- a/tests/TEST_SPEC.md +++ b/tests/TEST_SPEC.md @@ -112,14 +112,14 @@ RHI 当前分为四层测试: | 抽象层集成测试 | `tests/RHI/integration/` / `rhi_integration_*` | 用同一套 RHI 抽象代码驱动三后端完成真实渲染并做 GT 图比对 | | D3D12 后端测试 | `tests/RHI/D3D12/` | 验证 D3D12 封装本身 | | OpenGL 后端测试 | `tests/RHI/OpenGL/` | 验证 OpenGL 封装本身 | +| Vulkan 后端测试 | `tests/RHI/Vulkan/` | 验证 Vulkan 封装本身 | 补充说明: -- Vulkan 目前没有独立的 `tests/RHI/Vulkan/` 子树。 -- Vulkan 的后端专项覆盖当前由两部分承担: - - `rhi_unit_tests` 中的三后端参数化通用测试 - - `tests/RHI/unit/test_vulkan_graphics.cpp` 中的 Vulkan 专项测试 -- 如果未来出现明显只属于 Vulkan 的后端语义,应新增独立 Vulkan 测试树,而不是把通用抽象测试继续稀释成后端特判集合。 +- Vulkan 现在已经拥有独立的 `tests/RHI/Vulkan/` 子树。 +- `tests/RHI/unit/` 继续只保留三后端参数化的抽象层统一语义测试。 +- Vulkan 专属断言、原生句柄检查与直接依赖 Vulkan API 的测试,统一收敛到 `tests/RHI/Vulkan/unit/`。 +- Vulkan 目前尚未建立独立的后端 integration 子树;如后续需要,应在 `tests/RHI/Vulkan/integration/` 下继续扩展,而不是再回流到 abstraction suite。 设计边界: @@ -146,6 +146,7 @@ RHI 当前分为四层测试: | --- | --- | | D3D12 后端单元测试 | `rhi_d3d12_tests` | | OpenGL 后端单元测试 | `rhi_opengl_tests` | +| Vulkan 后端单元测试 | `rhi_vulkan_tests` | | D3D12 后端集成测试 | `d3d12_minimal_test` `d3d12_triangle_test` `d3d12_quad_test` `d3d12_sphere_test` | | OpenGL 后端集成测试 | `opengl_minimal_test` `opengl_triangle_test` `opengl_quad_test` `opengl_sphere_test` | @@ -251,7 +252,7 @@ build\tests\RHI\integration\backpack\Debug\rhi_integration_backpack.exe --gtest_ 仍需继续完善: -- 为 Vulkan 增加独立的后端测试树 +- 为 Vulkan 增加后端 integration 测试树 - 把仍然合理存在的后端专属断言与 skip 场景继续收敛 - 补充 `resize / swapchain 重建 / 长时间 soak / 多线程录制 / validation layer 负例` 等更工程化的测试 - 保持文档、CMake target 与实际测试状态同步