Files
XCEngine/docs/api/XCEngine/RHI/RHIDevice/RHIDevice.md
2026-03-29 01:36:53 +08:00

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 只暴露了三个设备级开关:

  • enableDebugLayer
  • enableGPUValidation
  • adapterIndex

这说明当前设备初始化配置还比较克制,没有把所有平台差异都堆进入口参数里。

关闭

Shutdown() 负责销毁设备级状态。按当前测试习惯,调用方应在删除设备之前显式调用它,而不是只依赖析构函数。

查询

初始化成功后,调用方通常会继续读取:

其中 GetNativeDevice() 明确是一个“打破抽象边界”的出口,供后端专用逻辑或调试逻辑使用。

它负责创建什么

当前接口覆盖了 RHI 里绝大多数对象类别。

资源与展示

CreateTexture() 还有一个带 initialDatarowPitch 的重载,允许直接创建并上传初始数据。

执行与同步

shader 与管线

render pass 与 framebuffer

descriptor 与资源视图

从接口形状就能看出,当前 RHIDevice 同时承担了资源创建器、视图工厂、descriptor 工厂和 pipeline 工厂的职责。

所有权约定

这是这页最关键的现实语义。

当前 RHIDevice 的所有创建接口都返回裸指针。按 tests/RHI/unit/test_device.cpptest_command_list.cpp 等现有测试来看,推荐使用方式是:

  1. 通过 RHIDevice 创建对象。
  2. 使用对象执行初始化、录制或资源操作。
  3. 结束前调用对象自己的 Shutdown()
  4. 最后 delete

这同样适用于 buffertexturequeuecommand listfencesamplerrender passframebufferdescriptor pooldescriptor setresource view 等对象。

如果带着现代 RAII 预期来使用这层接口,很容易误判释放责任。当前文档必须把这一点写死。

当前设计理解

从架构方向看,RHIDevice 的定位是合理的:

  • 抽象层统一把后端对象创建集中到设备上,方便 renderer 只依赖一套入口。
  • 设备负责暴露能力信息,便于上层在初始化阶段建立 feature branch。
  • 资源视图和 descriptor 也由设备创建,符合 D3D12 / Vulkan 风格资源管理直觉。

但从当前实现成熟度看,也要认识到几个边界:

  • 还没有单独的内存分配器 / residency / heap 管理抽象。
  • 资源创建描述符虽然统一,但很多字段仍是 uint32_t 承载枚举值,而不是更强类型的 API。
  • GetNativeDevice() 表明上层仍可能在必要时下钻到后端实现。

这说明当前阶段的目标更偏“稳定支撑后端实现和测试”,而不是已经完成最终抽象收敛。

测试中体现出的真实用法

现有测试提供了比模板文档更可靠的使用线索:

  • 创建设备后先 Initialize()
  • 查询 GetCapabilities()GetDeviceInfo()
  • 创建 BufferTextureFenceCommandQueueCommandListSampler 等对象。
  • 对每个对象做基本验证后 Shutdown()delete

这说明 RHIDevice 当前不仅是概念入口,而且已经是单元测试和集成测试里的真实生产入口。

公共方法

相关指南

相关文档