6.6 KiB
RHIDevice
命名空间: XCEngine::RHI
类型: class (abstract)
头文件: XCEngine/RHI/RHIDevice.h
描述: 抽象图形设备接口,负责设备初始化、能力查询,并作为大多数 RHI 对象的统一创建中心。
角色概述
RHIDevice 是当前 RHI 抽象层的中心对象。它不像某些引擎那样把资源工厂、提交器、能力查询器分拆成多套接口,而是采用一种更集中的“设备即工厂”设计:
- 初始化后端上下文或 native device
- 持有能力信息和设备信息
- 创建资源对象、命令对象、pipeline 对象和 descriptor 对象
- 提供必要的 native handle 泄露口
这和原生图形 API 的心智模型比较接近,也符合很多商业引擎底层渲染后端的设计习惯。好处是统一、直接,代价是接口面比较大。
生命周期
初始化
Initialize(const RHIDeviceDesc&) 是创建后的第一步。当前 RHIDeviceDesc 只暴露了三个设备级开关:
enableDebugLayerenableGPUValidationadapterIndex
这说明当前设备初始化配置还比较克制,没有把所有平台差异都堆进入口参数里。
关闭
Shutdown() 负责销毁设备级状态。按当前测试习惯,调用方应在删除设备之前显式调用它,而不是只依赖析构函数。
查询
初始化成功后,调用方通常会继续读取:
其中 GetNativeDevice() 明确是一个“打破抽象边界”的出口,供后端专用逻辑或调试逻辑使用。
它负责创建什么
当前接口覆盖了 RHI 里绝大多数对象类别。
资源与展示
CreateTexture() 还有一个带 initialData 和 rowPitch 的重载,允许直接创建并上传初始数据。
执行与同步
shader 与管线
render pass 与 framebuffer
descriptor 与资源视图
- CreateDescriptorPool
- CreateDescriptorSet
- CreateVertexBufferView
- CreateIndexBufferView
- CreateRenderTargetView
- CreateDepthStencilView
- CreateShaderResourceView
- CreateUnorderedAccessView
从接口形状就能看出,当前 RHIDevice 同时承担了资源创建器、视图工厂、descriptor 工厂和 pipeline 工厂的职责。
所有权约定
这是这页最关键的现实语义。
当前 RHIDevice 的所有创建接口都返回裸指针。按 tests/RHI/unit/test_device.cpp、test_command_list.cpp 等现有测试来看,推荐使用方式是:
- 通过
RHIDevice创建对象。 - 使用对象执行初始化、录制或资源操作。
- 结束前调用对象自己的
Shutdown()。 - 最后
delete。
这同样适用于 buffer、texture、queue、command list、fence、sampler、render pass、framebuffer、descriptor pool、descriptor set、resource view 等对象。
如果带着现代 RAII 预期来使用这层接口,很容易误判释放责任。当前文档必须把这一点写死。
当前设计理解
从架构方向看,RHIDevice 的定位是合理的:
- 抽象层统一把后端对象创建集中到设备上,方便 renderer 只依赖一套入口。
- 设备负责暴露能力信息,便于上层在初始化阶段建立 feature branch。
- 资源视图和 descriptor 也由设备创建,符合 D3D12 / Vulkan 风格资源管理直觉。
但从当前实现成熟度看,也要认识到几个边界:
- 还没有单独的内存分配器 / residency / heap 管理抽象。
- 资源创建描述符虽然统一,但很多字段仍是
uint32_t承载枚举值,而不是更强类型的 API。 GetNativeDevice()表明上层仍可能在必要时下钻到后端实现。
这说明当前阶段的目标更偏“稳定支撑后端实现和测试”,而不是已经完成最终抽象收敛。
测试中体现出的真实用法
现有测试提供了比模板文档更可靠的使用线索:
- 创建设备后先
Initialize()。 - 查询
GetCapabilities()和GetDeviceInfo()。 - 创建
Buffer、Texture、Fence、CommandQueue、CommandList、Sampler等对象。 - 对每个对象做基本验证后
Shutdown()并delete。
这说明 RHIDevice 当前不仅是概念入口,而且已经是单元测试和集成测试里的真实生产入口。
公共方法
- Initialize - 初始化设备。
- Shutdown - 关闭设备并释放设备级状态。
- CreateBuffer
- CreateTexture
- CreateSwapChain
- CreateCommandList
- CreateCommandQueue
- CreateShader
- CreatePipelineState
- CreatePipelineLayout
- CreateFence
- CreateSampler
- CreateRenderPass
- CreateFramebuffer
- CreateDescriptorPool
- CreateDescriptorSet
- CreateVertexBufferView
- CreateIndexBufferView
- CreateRenderTargetView
- CreateDepthStencilView
- CreateShaderResourceView
- CreateUnorderedAccessView
- GetCapabilities
- GetDeviceInfo
- GetNativeDevice