- 创建 tests/Input 目录和 CMakeLists.txt - 添加 28 个测试用例覆盖: - InputManager: Singleton, Initialize/Shutdown, 按键状态, 鼠标, 轴, 按钮 - InputAxis: 默认构造, 正负键, SetValue - InputEvent: KeyEvent, MouseButtonEvent, MouseMoveEvent, MouseWheelEvent, TextInputEvent
6.4 KiB
RHI 抽象层测试遗留问题报告
测试概述
RHI 抽象层单元测试通过 RHI_BACKEND 环境变量选择后端(D3D12/OpenGL),一次编译后可测试两个后端的抽象接口一致性。
# 运行测试
RHI_BACKEND=D3D12 ./rhi_unit_tests.exe
RHI_BACKEND=OpenGL ./rhi_unit_tests.exe
测试结果汇总
| 后端 | 通过 | 失败 | 总计 |
|---|---|---|---|
| D3D12 | 21 | 48 | 69 |
| OpenGL | 未测试 | - | - |
问题清单
1. D3D12CommandQueue::CreateCommandQueue 未实现
严重程度: 高
接口: RHIDevice::CreateCommandQueue
现象: 返回 nullptr
位置: engine/src/RHI/D3D12/D3D12Device.cpp:288
RHICommandQueue* D3D12Device::CreateCommandQueue(const CommandQueueDesc& desc) {
return nullptr; // 未实现
}
影响测试:
CommandQueue_ExecuteCommandListsCommandQueue_SignalWaitFenceCommandQueue_GetCompletedValueCommandQueue_WaitForIdleCommandQueue_GetTypeCommandQueue_GetTimestampFrequencyDevice_CreateCommandQueue_ReturnsValid
2. D3D12CommandList::CreateCommandList 未实现
严重程度: 高
接口: RHIDevice::CreateCommandList
现象: 返回 nullptr
位置: engine/src/RHI/D3D12/D3D12Device.cpp:300
D3D12CommandList* D3D12Device::CreateCommandListImpl(const CommandListDesc& desc) {
return nullptr; // 未实现
}
影响测试:
CommandList_Reset_CloseCommandList_SetPrimitiveTopologyCommandList_SetViewportCommandList_SetViewportsCommandList_SetScissorRectCommandList_DrawCommandList_DrawIndexedCommandList_ClearRenderTargetCommandList_SetDepthStencilStateCommandList_SetBlendStateCommandList_SetStencilRefCommandList_TransitionBarrierDevice_CreateCommandList_ReturnsValid
3. Texture 枚举值不匹配
严重程度: 高
接口: RHIDevice::CreateTexture
现象: 返回 nullptr
位置: engine/src/RHI/D3D12/D3D12Device.cpp:220
原因: RHI TextureType 枚举值与 D3D12 D3D12_RESOURCE_DIMENSION 枚举值不匹配
| RHI TextureType | 值 | D3D12 D3D12_RESOURCE_DIMENSION | 值 |
|---|---|---|---|
| Texture1D | 0 | D3D12_RESOURCE_DIMENSION_BUFFER | 0 |
| Texture2D | 1 | D3D12_RESOURCE_DIMENSION_TEXTURE1D | 1 |
| Texture2DArray | 2 | D3D12_RESOURCE_DIMENSION_TEXTURE2D | 2 |
| Texture3D | 3 | D3D12_RESOURCE_DIMENSION_TEXTURE3D | 3 |
| TextureCube | 4 | D3D12_RESOURCE_DIMENSION_TEXTURECUBE | 4 |
| TextureCubeArray | 5 | (无对应) | - |
影响测试:
Texture_Create_Texture2DTexture_Create_Texture3DTexture_StateManagementTexture_NamingTexture_GetNativeHandleDevice_CreateTexture_ReturnsValid
4. Shader 编译返回 nullptr
严重程度: 中
接口: RHIDevice::CompileShader
现象: 返回 nullptr
可能原因:
- Shader 编译参数不正确
- 需要有效的 shader 源码或文件路径
影响测试:
Shader_Compile_FromSourceShader_GetTypeShader_IsValidShader_Bind_UnbindShader_SetIntShader_SetFloatShader_SetVec3Shader_SetVec4Shader_SetMat4Shader_GetNativeHandle
5. SwapChain 需要窗口句柄
严重程度: 中
接口: RHIDevice::CreateSwapChain
现象: 返回 nullptr
原因: RHIDeviceDesc 需要有效的 windowHandle
影响测试:
SwapChain_CreateSwapChain_GetCurrentBackBufferIndexSwapChain_GetCurrentBackBufferSwapChain_ResizeSwapChain_FullscreenStateSwapChain_ShouldClose
6. Buffer::Map 对某些类型返回 nullptr
严重程度: 中
接口: RHIBuffer::Map
现象: D3D12 Constant Buffer 类型可能无法 Map
位置: tests/RHI/unit/test_buffer.cpp:16
RHIBuffer* buffer = GetDevice()->CreateBuffer(desc); // desc.bufferType = Vertex
void* data = buffer->Map(); // 返回 nullptr
影响测试:
Buffer_Map_UnmapBuffer_SetData
7. RHICapabilities 未填充
严重程度: 低
接口: RHIDevice::GetCapabilities
现象: 所有 capability 值为 0
位置: engine/src/RHI/D3D12/D3D12Device.cpp
影响测试:
Device_GetCapabilities_ReturnsValid- 断言caps.maxRenderTargets >= 1等
8. RHIDeviceInfo 未填充
严重程度: 低
接口: RHIDevice::GetDeviceInfo
现象: vendor 和 renderer 字符串为空
位置: engine/src/RHI/D3D12/D3D12Device.cpp:QueryAdapterInfo
影响测试:
Device_GetDeviceInfo_ReturnsValid
9. Fence::IsSignaled 逻辑问题
严重程度: 低
接口: RHIFence::IsSignaled
现象: 初始值应该为 false,但返回 true
位置: tests/RHI/unit/test_fence.cpp:80
影响测试:
Fence_IsSignaled
10. Sampler::GetNativeHandle 返回 nullptr
严重程度: 低
接口: RHISampler::GetNativeHandle
现象: 返回 nullptr 但 Sampler 创建成功
位置: engine/src/RHI/D3D12/D3D12Sampler.cpp 或 engine/src/RHI/OpenGL/OpenGLSampler.cpp
影响测试:
Sampler_GetNativeHandle
优先级建议
P0 - 必须修复
- D3D12CommandQueue::CreateCommandQueue 实现
- D3D12CommandList::CreateCommandList 实现
- Texture 枚举值对齐
P1 - 应该修复
- Shader 编译逻辑
- SwapChain 窗口支持
P2 - 可以修复
- Buffer Map 行为确认
- Capabilities/DeviceInfo 填充
- Fence::IsSignaled 逻辑
- Sampler::GetNativeHandle
测试文件位置
tests/RHI/unit/
├── fixtures/RHITestFixture.h/.cpp # 测试框架
├── test_device.cpp # 设备相关测试
├── test_buffer.cpp # Buffer 相关测试
├── test_texture.cpp # Texture 相关测试
├── test_swap_chain.cpp # SwapChain 相关测试
├── test_command_list.cpp # CommandList 相关测试
├── test_command_queue.cpp # CommandQueue 相关测试
├── test_shader.cpp # Shader 相关测试
├── test_fence.cpp # Fence 相关测试
└── test_sampler.cpp # Sampler 相关测试
运行测试
# 编译
cmake --build build --config Debug
# D3D12 后端测试
RHI_BACKEND=D3D12 ./build/tests/RHI/unit/Debug/rhi_unit_tests.exe
# OpenGL 后端测试
RHI_BACKEND=OpenGL ./build/tests/RHI/unit/Debug/rhi_unit_tests.exe