Files
XCEngine/docs/api/XCEngine/RHI/RHIDevice/RHIDevice.md

121 lines
5.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.
# RHIDevice
**命名空间**: `XCEngine::RHI`
**类型**: `class (abstract)`
**头文件**: `XCEngine/RHI/RHIDevice.h`
**描述**: `RHI` 设备抽象,负责初始化后端、暴露能力信息,并作为绝大多数资源、命令与管线对象的统一创建入口。
## 角色概述
`RHIDevice` 在当前架构里承担的是“设备即工厂”的职责。渲染器不需要分别依赖 buffer 工厂、texture 工厂、pipeline 工厂和 descriptor 工厂,而是统一通过一个设备对象创建后端资源。这种做法和很多商业级引擎底层渲染架构一致,优点是上层入口集中、后端差异被压缩在实现层,代价是 `RHIDevice` 接口面会比较大。
## 为什么这样设计
- 上层渲染代码只需要依赖一套 `RHI` 入口,不必按后端分叉创建流程。
- `BufferDesc``TextureDesc``GraphicsPipelineDesc` 这些描述结构可以直接作为跨后端契约。
- 同一个创建请求可以在不同后端走不同实现细节,例如直接 CPU 写入、上传缓冲复制、延迟编译或立即创建。
这和 Unity SRP、Unreal RHI 一类设计的核心思路一致:高层描述保持统一,真正的后端差异放在设备和资源实现里消化。
## 生命周期
### 初始化
`Initialize(const RHIDeviceDesc&)` 负责建立后端上下文并填充能力与设备信息。当前设备描述主要控制调试层、GPU 验证和适配器选择,说明引擎仍然把设备创建视为底层、工程化的初始化步骤,而不是面向最终用户的复杂配置界面。
### 关闭
`Shutdown()` 负责释放设备级状态。当前 `RHI` 仍然以显式 `Shutdown()` 为主,而不是完全依赖析构自动回收,因此调用方应把“显式关闭后再销毁对象”视为标准用法。
## 缓冲创建模型
`CreateBuffer` 现在有两种形态,且它们表达的是两种不同层级的需求:
```cpp
virtual RHIBuffer* CreateBuffer(const BufferDesc& desc) = 0;
virtual RHIBuffer* CreateBuffer(
const BufferDesc& desc,
const void* initialData,
size_t initialDataSize,
ResourceStates finalState = ResourceStates::GenericRead);
```
### 基础重载
`CreateBuffer(const BufferDesc&)` 只负责创建资源本体,不附带初始化数据。具体放在哪种堆、初始状态是什么、后端如何实现,都由具体设备类决定。
### 带初始数据的重载
这个重载是最近补进来的便捷契约,目的是让上层可以用一条调用完成“创建 + 上传初始内容 + 进入目标状态”。基类默认实现会:
1.`initialData == nullptr` 或大小为 `0` 时退化到基础重载。
2. 拒绝 `initialDataSize > desc.size` 的非法输入。
3. 先创建基础缓冲。
4. 对前半段调用 `SetData(initialData, initialDataSize)`
5. 如果 `desc.size` 更大,则把剩余区间补零。
6. 最后把资源状态设置为 `finalState`
这个默认实现强调的是统一语义,而不是最优性能。它适合小型静态数据、启动期资源或测试代码,不适合高频流式上传。
## 后端差异
- `D3D12Device` 对带初始数据的 `CreateBuffer` 做了专门重写,会显式创建上传缓冲、录制拷贝命令并做状态转换。
- 其他后端当前只需要满足统一契约,不一定都实现了同等级别的上传路径优化。
这正是抽象层的价值所在:上层只说“我要一个带初始内容的缓冲”,至于后端是 CPU 直写、上传队列复制还是暂时退化实现,都留给设备实现层。
## 所有权与使用约定
当前 `RHI` 仍然大量返回裸指针,调用方负责:
1. 在使用结束前调用对象自己的 `Shutdown()`
2. 在确认资源不再被引用后显式 `delete`
因此文档和代码都不应把这层接口描述成“天然 RAII 安全”的现代封装。它更接近商业引擎底层后端常见的显式生命周期模型。
## 公开方法
- [Initialize](Initialize.md)
- [Shutdown](Shutdown.md)
- [CreateBuffer](CreateBuffer.md)
- [CreateTexture](CreateTexture.md)
- [CreateSwapChain](CreateSwapChain.md)
- [CreateCommandList](CreateCommandList.md)
- [CreateCommandQueue](CreateCommandQueue.md)
- [CreateShader](CreateShader.md)
- [CreatePipelineState](CreatePipelineState.md)
- [CreatePipelineLayout](CreatePipelineLayout.md)
- [CreateFence](CreateFence.md)
- [CreateSampler](CreateSampler.md)
- [CreateRenderPass](CreateRenderPass.md)
- [CreateFramebuffer](CreateFramebuffer.md)
- [CreateDescriptorPool](CreateDescriptorPool.md)
- [CreateDescriptorSet](CreateDescriptorSet.md)
- [CreateVertexBufferView](CreateVertexBufferView.md)
- [CreateIndexBufferView](CreateIndexBufferView.md)
- [CreateRenderTargetView](CreateRenderTargetView.md)
- [CreateDepthStencilView](CreateDepthStencilView.md)
- [CreateShaderResourceView](CreateShaderResourceView.md)
- [CreateUnorderedAccessView](CreateUnorderedAccessView.md)
- [GetCapabilities](GetCapabilities.md)
- [GetDeviceInfo](GetDeviceInfo.md)
- [GetNativeDevice](GetNativeDevice.md)
## 相关指南
- [Devices, Queues, Command Lists, And Resource Creation](../../../_guides/RHI/Devices-Queues-CommandLists-And-Resource-Creation.md)
## 相关文档
- [当前模块](../RHI.md)
- [RHIBuffer](../RHIBuffer/RHIBuffer.md)
- [RHIFactory](../RHIFactory/RHIFactory.md)
- [RHICommandQueue](../RHICommandQueue/RHICommandQueue.md)
- [RHICommandList](../RHICommandList/RHICommandList.md)
- [RHICapabilities](../RHICapabilities/RHICapabilities.md)
- [RHITypes](../RHITypes/RHITypes.md)
- [API 总索引](../../../main.md)