Files
XCEngine/docs/api/rhi/d3d12/d3d12-pipeline-state.md

124 lines
3.2 KiB
Markdown

# D3D12PipelineState
DirectX 12 管线状态对象的 D3D12 实现,封装了 `ID3D12PipelineState`
## 头文件
```cpp
#include <XCEngine/RHI/D3D12/D3D12PipelineState.h>
```
## 继承关系
```
RHIPipelineState (interface)
└── D3D12PipelineState (implementation)
```
## 公共成员函数
### 构造函数与析构函数
#### `D3D12PipelineState()`
默认构造函数。
#### `~D3D12PipelineState() override`
析构函数,确保调用 `Shutdown()`
### 初始化
#### `bool Initialize(ID3D12Device* device, const D3D12_GRAPHICS_PIPELINE_STATE_DESC& desc)`
使用 D3D12 PSO 描述初始化。
- `device`: D3D12 设备
- `desc`: 完整的图形管线状态描述
- 返回: 初始化是否成功
#### `void Shutdown() override`
释放 PSO 资源。
### 原生接口
#### `ID3D12PipelineState* GetPipelineState() const`
获取底层 `ID3D12PipelineState` 指针。
#### `void* GetNativeHandle() override`
返回原生句柄。
#### `PipelineType GetType() const override`
返回 `PipelineType::Graphics`
### 绑定
#### `void Bind() override`
绑定 PSO 到命令列表。
#### `void Unbind() override`
解绑 PSO。
### 静态辅助函数
#### `static D3D12_GRAPHICS_PIPELINE_STATE_DESC CreateDesc(...)`
创建完整的 PSO 描述。
参数:
- `ID3D12RootSignature* rootSignature`: 根签名
- `const D3D12_SHADER_BYTECODE& vs`: 顶点着色器
- `const D3D12_SHADER_BYTECODE& ps`: 像素着色器
- `const D3D12_SHADER_BYTECODE& gs`: 几何着色器(可选)
- `uint32_t inputElementCount`: 输入元素数量
- `const D3D12_INPUT_ELEMENT_DESC* inputElements`: 输入元素数组
#### `static D3D12_INPUT_ELEMENT_DESC CreateInputElement(...)`
创建输入元素描述,有两个重载:
-`alignedByteOffset` 参数
- 自动计算 `alignedByteOffset` 参数
参数:
- `semanticName`: 语义名称 (e.g., "POSITION", "TEXCOORD")
- `semanticIndex`: 语义索引
- `format`: 格式
- `inputSlot`: 输入槽
- `alignedByteOffset`: 对齐偏移(可选)
## 内部成员
| 成员 | 类型 | 描述 |
|------|------|------|
| `m_pipelineState` | `ComPtr<ID3D12PipelineState>` | D3D12 PSO 对象 |
## 使用示例
```cpp
// Define input layout
D3D12_INPUT_ELEMENT_DESC inputElements[] = {
D3D12PipelineState::CreateInputElement("POSITION", 0, Format::R32G32B32A32_Float, 0),
D3D12PipelineState::CreateInputElement("TEXCOORD", 0, Format::R32G32_Float, 1),
};
// Create PSO description
D3D12_GRAPHICS_PIPELINE_STATE_DESC psoDesc = {};
psoDesc.pRootSignature = rootSignature->GetRootSignature();
psoDesc.VS = vertexShader.GetD3D12Bytecode();
psoDesc.PS = pixelShader.GetD3D12Bytecode();
psoDesc.InputLayout = { inputElements, 2 };
psoDesc.RasterizerState = ...;
psoDesc.BlendState = ...;
psoDesc.DepthStencilState = ...;
psoDesc.SampleMask = UINT_MAX;
psoDesc.PrimitiveTopologyType = D3D12_PRIMITIVE_TOPOLOGY_TYPE_TRIANGLE;
psoDesc.NumRenderTargets = 1;
psoDesc.RTVFormats[0] = DXGI_FORMAT_R8G8B8A8_UNORM;
psoDesc.DSVFormat = DXGI_FORMAT_D24_UNORM_S8_UINT;
psoDesc.SampleDesc.Count = 1;
D3D12PipelineState pso;
pso.Initialize(device->GetDevice(), psoDesc);
pso.Bind();
```
## 备注
- PSO 一旦创建不可修改,只能重新创建
- PSO 创建开销大,应缓存复用
- `ID3D12PipelineState` 是不可变对象,切换开销比 OpenGL 小