170 lines
5.0 KiB
Markdown
170 lines
5.0 KiB
Markdown
|
|
# 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()` 可以模拟设备移除场景用于测试
|