Files
XCEngine/tests/RHI/TEST_ISSUES.md
ssdfasd cf9229fc21 test: 添加 Input 模块单元测试
- 创建 tests/Input 目录和 CMakeLists.txt
- 添加 28 个测试用例覆盖:
  - InputManager: Singleton, Initialize/Shutdown, 按键状态, 鼠标, 轴, 按钮
  - InputAxis: 默认构造, 正负键, SetValue
  - InputEvent: KeyEvent, MouseButtonEvent, MouseMoveEvent, MouseWheelEvent, TextInputEvent
2026-03-22 16:22:13 +08:00

6.4 KiB
Raw Blame History

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_ExecuteCommandLists
  • CommandQueue_SignalWaitFence
  • CommandQueue_GetCompletedValue
  • CommandQueue_WaitForIdle
  • CommandQueue_GetType
  • CommandQueue_GetTimestampFrequency
  • Device_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_Close
  • CommandList_SetPrimitiveTopology
  • CommandList_SetViewport
  • CommandList_SetViewports
  • CommandList_SetScissorRect
  • CommandList_Draw
  • CommandList_DrawIndexed
  • CommandList_ClearRenderTarget
  • CommandList_SetDepthStencilState
  • CommandList_SetBlendState
  • CommandList_SetStencilRef
  • CommandList_TransitionBarrier
  • Device_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_Texture2D
  • Texture_Create_Texture3D
  • Texture_StateManagement
  • Texture_Naming
  • Texture_GetNativeHandle
  • Device_CreateTexture_ReturnsValid

4. Shader 编译返回 nullptr

严重程度: 中
接口: RHIDevice::CompileShader
现象: 返回 nullptr
可能原因:

  • Shader 编译参数不正确
  • 需要有效的 shader 源码或文件路径

影响测试:

  • Shader_Compile_FromSource
  • Shader_GetType
  • Shader_IsValid
  • Shader_Bind_Unbind
  • Shader_SetInt
  • Shader_SetFloat
  • Shader_SetVec3
  • Shader_SetVec4
  • Shader_SetMat4
  • Shader_GetNativeHandle

5. SwapChain 需要窗口句柄

严重程度: 中
接口: RHIDevice::CreateSwapChain
现象: 返回 nullptr
原因: RHIDeviceDesc 需要有效的 windowHandle

影响测试:

  • SwapChain_Create
  • SwapChain_GetCurrentBackBufferIndex
  • SwapChain_GetCurrentBackBuffer
  • SwapChain_Resize
  • SwapChain_FullscreenState
  • SwapChain_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_Unmap
  • Buffer_SetData

7. RHICapabilities 未填充

严重程度: 低
接口: RHIDevice::GetCapabilities
现象: 所有 capability 值为 0
位置: engine/src/RHI/D3D12/D3D12Device.cpp

影响测试:

  • Device_GetCapabilities_ReturnsValid - 断言 caps.maxRenderTargets >= 1

8. RHIDeviceInfo 未填充

严重程度: 低
接口: RHIDevice::GetDeviceInfo
现象: vendorrenderer 字符串为空
位置: 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.cppengine/src/RHI/OpenGL/OpenGLSampler.cpp

影响测试:

  • Sampler_GetNativeHandle

优先级建议

P0 - 必须修复

  1. D3D12CommandQueue::CreateCommandQueue 实现
  2. D3D12CommandList::CreateCommandList 实现
  3. Texture 枚举值对齐

P1 - 应该修复

  1. Shader 编译逻辑
  2. SwapChain 窗口支持

P2 - 可以修复

  1. Buffer Map 行为确认
  2. Capabilities/DeviceInfo 填充
  3. Fence::IsSignaled 逻辑
  4. 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