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

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 小