Files
XCEngine/docs/api/rhi/d3d12/d3d12-device.md

170 lines
5.0 KiB
Markdown
Raw Normal View History

# D3D12Device
DirectX 12 设备的 D3D12 实现,是引擎的 RHI 抽象层 `RHIDevice` 接口的具体实现。
## 头文件
```cpp
#include <XCEngine/RHI/D3D12/D3D12Device.h>
```
## 类概览
`D3D12Device` 封装了 DirectX 12 的 `ID3D12Device``IDXGIFactory4`,负责创建和管理所有 RHI 资源。
## 公共成员函数
### 初始化与销毁
#### `bool Initialize(const RHIDeviceDesc& desc)`
初始化 D3D12 设备,包括创建 DXGI Factory 和 D3D12 Device。
- `desc`: 设备描述符,包含调试层配置等
- 返回: 初始化是否成功
#### `void Shutdown()`
关闭并释放所有 D3D12 资源。
### 设备信息
#### `ID3D12Device* GetDevice() const`
获取底层 `ID3D12Device` 指针。
#### `IDXGIFactory4* GetFactory() const`
获取底层 `IDXGIFactory4` 指针。
#### `const AdapterInfo& GetAdapterInfo() const`
获取当前 GPU 适配器信息,包含:
- `description`: 适配器描述
- `dedicatedVideoMemory`: 专用显存
- `dedicatedSystemMemory`: 专用系统内存
- `sharedSystemMemory`: 共享系统内存
- `vendorId` / `deviceId`: 供应商和设备 ID
- `isSoftware`: 是否为软件适配器
#### `std::vector<AdapterInfo> EnumerateAdapters()`
枚举系统中所有可用的 GPU 适配器。
### 功能查询
#### `UINT GetDescriptorHandleIncrementSize(DescriptorHeapType type) const`
获取指定类型描述符堆的增量大小。
- `type`: 堆类型 (CBV_SRV_UAV, Sampler, RTV, DSV)
#### `bool CheckFeatureSupport(D3D12_FEATURE feature, void* featureSupportData, uint32_t featureSupportDataSize)`
查询设备支持的特定功能。
#### `const RHICapabilities& GetCapabilities() const`
获取设备功能支持信息。
#### `const RHIDeviceInfo& GetDeviceInfo() const`
获取设备详细信息。
### 设备状态
#### `bool IsDeviceRemoved() const`
检测设备是否被移除(通常因驱动崩溃)。
### 资源创建
#### `RHIBuffer* CreateBuffer(const BufferDesc& desc)` {#buffer}
创建 D3D12 缓冲区。
#### `RHITexture* CreateTexture(const TextureDesc& desc)` {#texture}
创建 D3D12 纹理。
#### `RHISwapChain* CreateSwapChain(const SwapChainDesc& desc)` {#swapchain}
创建 D3D12 交换链。
#### `RHICommandList* CreateCommandList(const CommandListDesc& desc)` {#cmdlist}
创建 D3D12 命令列表。
#### `RHICommandQueue* CreateCommandQueue(const CommandQueueDesc& desc)` {#cmdqueue}
创建 D3D12 命令队列。
#### `RHIShader* CompileShader(const ShaderCompileDesc& desc)` {#shader}
编译着色器。
#### `RHIPipelineState* CreatePipelineState(const PipelineStateDesc& desc)` {#pso}
创建管线状态对象。
#### `RHIFence* CreateFence(const FenceDesc& desc)` {#fence}
创建栅栏同步对象。
#### `RHISampler* CreateSampler(const SamplerDesc& desc)` {#sampler}
创建采样器。
### 内部实现创建
#### `D3D12CommandQueue* CreateCommandQueueImpl(const CommandQueueDesc& desc)`
创建 `D3D12CommandQueue` 实例。
#### `D3D12CommandList* CreateCommandListImpl(const CommandListDesc& desc)`
创建 `D3D12CommandList` 实例。
#### `D3D12CommandAllocator* CreateCommandAllocator(const CommandAllocatorDesc& desc)`
创建 `D3D12CommandAllocator`
#### `D3D12DescriptorHeap* CreateDescriptorHeap(const DescriptorHeapDesc& desc)`
创建 `D3D12DescriptorHeap`
#### `D3D12QueryHeap* CreateQueryHeap(const QueryHeapDesc& desc)`
创建 `D3D12QueryHeap`
#### `D3D12RootSignature* CreateRootSignature(const RootSignatureDesc& desc)`
创建 `D3D12RootSignature`
### 视图创建
#### `D3D12RenderTargetView* CreateRenderTargetView(D3D12Buffer* resource, const RenderTargetViewDesc& desc)`
创建渲染目标视图。
#### `D3D12DepthStencilView* CreateDepthStencilView(D3D12Buffer* resource, const DepthStencilViewDesc& desc)`
创建深度模板视图。
#### `D3D12ShaderResourceView* CreateShaderResourceView(D3D12Buffer* resource, const ShaderResourceViewDesc& desc)`
创建着色器资源视图。
#### `D3D12UnorderedAccessView* CreateUnorderedAccessView(D3D12Buffer* resource, const UnorderedAccessViewDesc& desc)`
创建无序访问视图。
#### `D3D12ConstantBufferView* CreateConstantBufferView(D3D12Buffer* resource, const ConstantBufferViewDesc& desc)`
创建常量缓冲区视图。
## 使用示例
```cpp
#include <XCEngine/RHI/D3D12/D3D12Device.h>
using namespace XCEngine::RHI;
D3D12Device device;
RHIDeviceDesc desc;
desc.enableDebugLayer = true;
if (device.Initialize(desc)) {
auto& caps = device.GetCapabilities();
auto& info = device.GetAdapterInfo();
// Create resources
BufferDesc vertexBufferDesc;
vertexBufferDesc.size = 1024;
vertexBufferDesc.type = BufferType::Vertex;
RHIBuffer* vb = device.CreateBuffer(vertexBufferDesc);
device.Shutdown();
}
```
## 继承关系
```
RHIDevice (interface)
└── D3D12Device (implementation)
```
## 备注
- D3D12Device 是引擎中最重要的 D3D12 对象,所有其他 D3D12 资源都依赖它创建
- 设备移除Device Removed通常由驱动超时或硬件问题导致
- 使用 `SetDeviceRemoved()` 可以模拟设备移除场景用于测试