3.2 KiB
3.2 KiB
D3D12PipelineState
DirectX 12 管线状态对象的 D3D12 实现,封装了 ID3D12PipelineState。
头文件
#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 对象 |
使用示例
// 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 小