Split Vulkan backend-specific unit tests

This commit is contained in:
2026-03-27 22:13:17 +08:00
parent c7ef9191e4
commit e3ddf10d79
7 changed files with 105 additions and 10 deletions

View File

@@ -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

View File

@@ -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)

View File

@@ -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
```

View File

@@ -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)

View File

@@ -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);

View File

@@ -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
)

View File

@@ -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 与实际测试状态同步