Files
XCEngine/engine/src/RHI/D3D12/D3D12PipelineState.cpp

82 lines
2.6 KiB
C++
Raw Normal View History

#include "XCEngine/RHI/D3D12/D3D12PipelineState.h"
namespace XCEngine {
namespace RHI {
D3D12PipelineState::D3D12PipelineState() {
}
D3D12PipelineState::~D3D12PipelineState() {
Shutdown();
}
bool D3D12PipelineState::Initialize(ID3D12Device* device, const D3D12_GRAPHICS_PIPELINE_STATE_DESC& desc) {
HRESULT hResult = device->CreateGraphicsPipelineState(&desc, IID_PPV_ARGS(&m_pipelineState));
if (FAILED(hResult)) {
return false;
}
return true;
}
void D3D12PipelineState::Shutdown() {
m_pipelineState.Reset();
}
D3D12_GRAPHICS_PIPELINE_STATE_DESC D3D12PipelineState::CreateDesc(
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) {
D3D12_GRAPHICS_PIPELINE_STATE_DESC desc = {};
desc.pRootSignature = rootSignature;
desc.VS = vs;
desc.PS = ps;
desc.GS = gs;
desc.InputLayout.NumElements = inputElementCount;
desc.InputLayout.pInputElementDescs = inputElements;
desc.RTVFormats[0] = DXGI_FORMAT_R8G8B8A8_UNORM;
desc.DSVFormat = DXGI_FORMAT_D24_UNORM_S8_UINT;
desc.SampleDesc.Count = 1;
desc.SampleDesc.Quality = 0;
desc.SampleMask = 0xffffffff;
desc.NumRenderTargets = 1;
desc.PrimitiveTopologyType = D3D12_PRIMITIVE_TOPOLOGY_TYPE_TRIANGLE;
desc.RasterizerState.FillMode = D3D12_FILL_MODE_SOLID;
desc.RasterizerState.CullMode = D3D12_CULL_MODE_BACK;
desc.RasterizerState.DepthClipEnable = TRUE;
desc.DepthStencilState.DepthEnable = TRUE;
desc.DepthStencilState.DepthWriteMask = D3D12_DEPTH_WRITE_MASK_ALL;
desc.DepthStencilState.DepthFunc = D3D12_COMPARISON_FUNC_LESS_EQUAL;
return desc;
}
D3D12_INPUT_ELEMENT_DESC D3D12PipelineState::CreateInputElement(
const char* semanticName,
uint32_t semanticIndex,
Format format,
uint32_t inputSlot,
uint32_t alignedByteOffset) {
D3D12_INPUT_ELEMENT_DESC element = {};
element.SemanticName = semanticName;
element.SemanticIndex = semanticIndex;
element.Format = ToD3D12(format);
element.InputSlot = inputSlot;
element.AlignedByteOffset = alignedByteOffset;
element.InputSlotClass = D3D12_INPUT_CLASSIFICATION_PER_VERTEX_DATA;
element.InstanceDataStepRate = 0;
return element;
}
D3D12_INPUT_ELEMENT_DESC D3D12PipelineState::CreateInputElement(
const char* semanticName,
uint32_t semanticIndex,
Format format,
uint32_t inputSlot) {
return CreateInputElement(semanticName, semanticIndex, format, inputSlot, D3D12_APPEND_ALIGNED_ELEMENT);
}
} // namespace RHI
} // namespace XCEngine