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

261 lines
6.4 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# RHI 抽象层测试遗留问题报告
## 测试概述
RHI 抽象层单元测试通过 `RHI_BACKEND` 环境变量选择后端D3D12/OpenGL一次编译后可测试两个后端的抽象接口一致性。
```bash
# 运行测试
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`
```cpp
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`
```cpp
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`
```cpp
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`
**现象**: `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 - 必须修复
1. D3D12CommandQueue::CreateCommandQueue 实现
2. D3D12CommandList::CreateCommandList 实现
3. Texture 枚举值对齐
### P1 - 应该修复
4. Shader 编译逻辑
5. SwapChain 窗口支持
### P2 - 可以修复
6. Buffer Map 行为确认
7. Capabilities/DeviceInfo 填充
8. Fence::IsSignaled 逻辑
9. 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 相关测试
```
---
## 运行测试
```bash
# 编译
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
```