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