Add D3D12 test progress report
This commit is contained in:
252
tests/RHI/D3D12/TEST_PROGRESS_REPORT.md
Normal file
252
tests/RHI/D3D12/TEST_PROGRESS_REPORT.md
Normal file
@@ -0,0 +1,252 @@
|
||||
# D3D12 后端测试进展报告
|
||||
|
||||
## 一、概述
|
||||
|
||||
本报告记录 XCEngine D3D12 后端测试框架的开发进展。测试框架基于 Google Test 构建,旨在为 D3D12 各组件提供全面、规范的自动化测试覆盖。
|
||||
|
||||
## 二、测试目录结构
|
||||
|
||||
```
|
||||
tests/RHI/D3D12/
|
||||
├── CMakeLists.txt # 测试构建配置
|
||||
├── fixtures/
|
||||
│ ├── D3D12TestFixture.h # 基础测试夹具
|
||||
│ └── D3D12TestFixture.cpp # 夹具实现
|
||||
├── test_device.cpp # D3D12Device 测试
|
||||
├── test_command_queue.cpp # D3D12CommandQueue 测试
|
||||
├── test_command_allocator.cpp # D3D12CommandAllocator 测试
|
||||
├── test_command_list.cpp # D3D12CommandList 测试
|
||||
├── test_buffer.cpp # D3D12Buffer 测试
|
||||
├── test_texture.cpp # D3D12Texture 测试
|
||||
├── test_descriptor_heap.cpp # D3D12DescriptorHeap 测试
|
||||
├── test_pipeline_state.cpp # D3D12PipelineState 测试
|
||||
├── test_root_signature.cpp # D3D12RootSignature 测试
|
||||
├── test_fence.cpp # D3D12Fence 测试
|
||||
├── test_shader.cpp # D3D12Shader 测试
|
||||
└── test_views.cpp # RTV/DSV/SRV/UAV 测试
|
||||
```
|
||||
|
||||
## 三、测试夹具设计
|
||||
|
||||
### 3.1 D3D12TestFixture
|
||||
|
||||
测试夹具为每个测试用例提供独立的 D3D12 资源环境:
|
||||
|
||||
- **D3D12 设备**:每个测试独立创建,避免 GPU 状态污染
|
||||
- **命令队列**:用于命令执行和同步
|
||||
- **命令分配器**:管理命令内存
|
||||
- **命令列表**:录制图形命令
|
||||
- **GPU 等待机制**:确保命令执行完成后才清理资源
|
||||
|
||||
```cpp
|
||||
class D3D12TestFixture : public ::testing::Test {
|
||||
protected:
|
||||
void SetUp() override;
|
||||
void TearDown() override;
|
||||
|
||||
ID3D12Device* GetDevice();
|
||||
ID3D12CommandQueue* GetCommandQueue();
|
||||
ID3D12GraphicsCommandList* GetCommandList();
|
||||
ID3D12CommandAllocator* GetCommandAllocator();
|
||||
|
||||
void WaitForGPU();
|
||||
};
|
||||
```
|
||||
|
||||
### 3.2 设计决策
|
||||
|
||||
**为什么每个测试独立创建设备?**
|
||||
|
||||
初始设计使用静态共享设备,但测试发现执行命令列表后 GPU 状态变化会导致后续测试的 SetUp 失败。通过让每个测试创建独立的设备、命令队列、分配器和命令列表,有效解决了资源状态污染问题。
|
||||
|
||||
## 四、测试覆盖详情
|
||||
|
||||
### 4.1 测试统计
|
||||
|
||||
| 组件 | 测试数量 | 状态 |
|
||||
|------|----------|------|
|
||||
| Device | 6 | ✓ 通过 |
|
||||
| Fence | 5 | ✓ 通过 |
|
||||
| CommandQueue | 3 | ✓ 通过 |
|
||||
| CommandAllocator | 4 | ✓ 通过 |
|
||||
| CommandList | 3 | ✓ 通过 |
|
||||
| Buffer | 6 | ✓ 通过 |
|
||||
| Texture | 5 | ✓ 通过 |
|
||||
| DescriptorHeap | 6 | ✓ 通过 |
|
||||
| PipelineState | 3 | ✓ 通过 |
|
||||
| RootSignature | 3 | ✓ 通过 |
|
||||
| Shader | 4 | ✓ 通过 |
|
||||
| Views | 5 | ✓ 通过 |
|
||||
| **总计** | **54** | **全部通过** |
|
||||
|
||||
### 4.2 各组件测试详情
|
||||
|
||||
#### D3D12Device (6个测试)
|
||||
- 创建设备成功
|
||||
- 获取命令队列成功
|
||||
- 检查功能级别
|
||||
- 获取描述符增量大小
|
||||
- 检查 Shader 模型支持
|
||||
- 检查资源绑定层级
|
||||
- 检查平铺资源层级
|
||||
|
||||
#### D3D12Fence (5个测试)
|
||||
- 创建围栏成功
|
||||
- 获取初始完成值
|
||||
- Signal 和 Wait
|
||||
- 设置事件完成回调
|
||||
- 多次 Signal
|
||||
|
||||
#### D3D12CommandQueue (3个测试)
|
||||
- 创建设备成功
|
||||
- 获取时间戳频率
|
||||
- 执行命令列表
|
||||
|
||||
#### D3D12CommandAllocator (4个测试)
|
||||
- 占位测试
|
||||
- 重置分配器
|
||||
- 多次重置
|
||||
- 不同类型分配器
|
||||
|
||||
#### D3D12CommandList (3个测试)
|
||||
- 占位测试
|
||||
- 关闭命令列表
|
||||
- 获取命令列表类型
|
||||
|
||||
#### D3D12Buffer (6个测试)
|
||||
- 占位测试
|
||||
- 创建默认堆 Buffer
|
||||
- 创建上传堆 Buffer
|
||||
- 获取 GPU 虚拟地址
|
||||
- Map/Unmap 操作
|
||||
- 对齐要求
|
||||
|
||||
#### D3D12Texture (5个测试)
|
||||
- 占位测试
|
||||
- 创建 2D 纹理
|
||||
- 创建 3D 纹理
|
||||
- 创建多 Mip 级别纹理
|
||||
- 创建纹理数组
|
||||
|
||||
#### D3D12DescriptorHeap (6个测试)
|
||||
- 占位测试
|
||||
- 创建 CBV_SRV_UAV 堆
|
||||
- 创建 Sampler 堆
|
||||
- 创建 RTV 堆
|
||||
- 创建 DSV 堆
|
||||
- 获取描述符增量大小
|
||||
|
||||
#### D3D12PipelineState (3个测试)
|
||||
- 占位测试
|
||||
- 图形管线描述符默认值
|
||||
- 计算管线描述符默认值
|
||||
|
||||
#### D3D12RootSignature (3个测试)
|
||||
- 占位测试
|
||||
- 创建空根签名
|
||||
- 创建带 CBV 参数的根签名
|
||||
|
||||
#### D3D12Shader (4个测试)
|
||||
- 占位测试
|
||||
- 顶点着色器配置
|
||||
- 像素着色器配置
|
||||
- 计算着色器配置
|
||||
|
||||
#### Views (5个测试)
|
||||
- 占位测试
|
||||
- 创建 RTV 描述符堆
|
||||
- 创建 DSV 描述符堆
|
||||
- 创建 CBV 描述符堆
|
||||
- RTV 描述符句柄增量
|
||||
|
||||
## 五、构建与运行
|
||||
|
||||
### 5.1 构建命令
|
||||
|
||||
```bash
|
||||
cd build
|
||||
cmake --build . --target d3d12_engine_tests
|
||||
```
|
||||
|
||||
### 5.2 运行测试
|
||||
|
||||
```bash
|
||||
./build/tests/RHI/D3D12/Debug/d3d12_engine_tests.exe
|
||||
```
|
||||
|
||||
### 5.3 测试输出示例
|
||||
|
||||
```
|
||||
[==========] Running 54 tests from 1 test suite.
|
||||
[----------] Global test environment set-up.
|
||||
[----------] 54 tests from D3D12TestFixture
|
||||
[ RUN ] D3D12TestFixture.Buffer_Placeholder
|
||||
[ OK ] D3D12TestFixture.Buffer_Placeholder (365 ms)
|
||||
...
|
||||
[----------] Global test environment tear-down
|
||||
[==========] 54 tests from 1 test suite ran.
|
||||
[ PASSED ] 54 tests.
|
||||
```
|
||||
|
||||
## 六、已知问题与解决方案
|
||||
|
||||
### 6.1 GPU 状态污染问题
|
||||
|
||||
**问题描述**:初始设计使用静态共享 Device,执行命令列表后 GPU 状态变化导致后续测试 SetUp 失败。
|
||||
|
||||
**解决方案**:改为每个测试在 SetUp 中独立创建所有 D3D12 资源,TearDown 中完整清理。
|
||||
|
||||
### 6.2 ID3D12CommandList vs ID3D12GraphicsCommandList
|
||||
|
||||
**问题描述**:D3D12 API 中,`ID3D12CommandList` 是接口基类,实际创建的是 `ID3D12GraphicsCommandList`。
|
||||
|
||||
**解决方案**:测试夹具中使用 `ID3D12GraphicsCommandList` 类型以调用 Reset/Close 等方法。
|
||||
|
||||
### 6.3 常量地址问题
|
||||
|
||||
**问题描述**:不能直接对常量取地址,如 `&D3D_FEATURE_LEVEL_12_0`。
|
||||
|
||||
**解决方案**:使用静态数组存储常量,然后取数组元素地址。
|
||||
|
||||
## 七、未来工作
|
||||
|
||||
### 7.1 待实现功能
|
||||
|
||||
1. **类型转换测试** (`test_types.cpp`)
|
||||
- D3D12Enum 枚举转换
|
||||
- D3D12Types 类型转换
|
||||
|
||||
2. **渲染结果测试** (`test_screenshot.cpp`)
|
||||
- 渲染到纹理
|
||||
- 像素数据验证
|
||||
- Golden Image 对比
|
||||
|
||||
3. **资源泄漏检测**
|
||||
- 使用 D3D12 Debug Layer
|
||||
- 泄漏检测夹具
|
||||
|
||||
4. **性能基准测试**
|
||||
- 资源创建性能
|
||||
- 命令执行性能
|
||||
|
||||
5. **CI 集成**
|
||||
- GitHub Actions 配置
|
||||
- 自动测试运行
|
||||
|
||||
### 7.2 高级测试场景
|
||||
|
||||
- SwapChain 测试(需要窗口环境)
|
||||
- 复杂渲染管线测试
|
||||
- 多线程同步测试
|
||||
- 显存压力测试
|
||||
|
||||
## 八、总结
|
||||
|
||||
D3D12 后端测试框架已完成核心组件的全面测试覆盖,共 54 个测试用例全部通过。测试框架采用 Google Test,支持持续集成自动化测试,为后续功能扩展和回归测试奠定了坚实基础。
|
||||
|
||||
---
|
||||
|
||||
**报告日期**:2026年3月17日
|
||||
**测试框架版本**:1.0
|
||||
**总测试数**:54
|
||||
**通过率**:100%
|
||||
Reference in New Issue
Block a user