diff --git a/engine/CMakeLists.txt b/engine/CMakeLists.txt index 8274bdcd..42719b05 100644 --- a/engine/CMakeLists.txt +++ b/engine/CMakeLists.txt @@ -95,8 +95,6 @@ add_library(XCEngine STATIC include/XCEngine/RHI/D3D12/D3D12Shader.h include/XCEngine/RHI/D3D12/D3D12Texture.h include/XCEngine/RHI/D3D12/D3D12RootSignature.h - include/XCEngine/RHI/D3D12/RootSignatureBuilder.h - include/XCEngine/RHI/D3D12/PipelineStateBuilder.h include/XCEngine/RHI/D3D12/D3D12SwapChain.h include/XCEngine/RHI/D3D12/D3D12Fence.h include/XCEngine/RHI/D3D12/D3D12Screenshot.h @@ -117,8 +115,6 @@ add_library(XCEngine STATIC src/RHI/D3D12/D3D12Shader.cpp src/RHI/D3D12/D3D12Texture.cpp src/RHI/D3D12/D3D12RootSignature.cpp - src/RHI/D3D12/RootSignatureBuilder.cpp - src/RHI/D3D12/PipelineStateBuilder.cpp src/RHI/D3D12/D3D12SwapChain.cpp src/RHI/D3D12/D3D12Fence.cpp src/RHI/D3D12/D3D12Screenshot.cpp diff --git a/engine/include/XCEngine/RHI/D3D12/D3D12PipelineState.h b/engine/include/XCEngine/RHI/D3D12/D3D12PipelineState.h index b5ca8f49..f33f6317 100644 --- a/engine/include/XCEngine/RHI/D3D12/D3D12PipelineState.h +++ b/engine/include/XCEngine/RHI/D3D12/D3D12PipelineState.h @@ -1,8 +1,10 @@ #pragma once #include +#include #include +#include "../Enums.h" #include "D3D12Enum.h" using Microsoft::WRL::ComPtr; @@ -23,6 +25,27 @@ public: void* GetNativeHandle() const { return m_pipelineState.Get(); } PipelineType GetType() const { return PipelineType::Graphics; } + static D3D12_GRAPHICS_PIPELINE_STATE_DESC 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); + + static D3D12_INPUT_ELEMENT_DESC CreateInputElement( + const char* semanticName, + uint32_t semanticIndex, + Format format, + uint32_t inputSlot, + uint32_t alignedByteOffset); + + static D3D12_INPUT_ELEMENT_DESC CreateInputElement( + const char* semanticName, + uint32_t semanticIndex, + Format format, + uint32_t inputSlot); + private: ComPtr m_pipelineState; }; diff --git a/engine/include/XCEngine/RHI/D3D12/D3D12RootSignature.h b/engine/include/XCEngine/RHI/D3D12/D3D12RootSignature.h index 62ba5e66..c21496ae 100644 --- a/engine/include/XCEngine/RHI/D3D12/D3D12RootSignature.h +++ b/engine/include/XCEngine/RHI/D3D12/D3D12RootSignature.h @@ -2,6 +2,7 @@ #include #include +#include #include "../Enums.h" #include "D3D12Enum.h" @@ -20,10 +21,24 @@ public: void Shutdown(); ID3D12RootSignature* GetRootSignature() const { return m_rootSignature.Get(); } - void* GetNativeHandle() const { return m_rootSignature.Get(); } uint32_t GetParameterCount() const { return m_parameterCount; } + static D3D12_ROOT_SIGNATURE_DESC CreateDesc( + D3D12_ROOT_PARAMETER* parameters, + uint32_t parameterCount, + D3D12_STATIC_SAMPLER_DESC* samplers = nullptr, + uint32_t samplerCount = 0, + D3D12_ROOT_SIGNATURE_FLAGS flags = D3D12_ROOT_SIGNATURE_FLAG_ALLOW_INPUT_ASSEMBLER_INPUT_LAYOUT); + + static D3D12_ROOT_PARAMETER CreateCBV(uint32_t shaderRegister, ShaderVisibility visibility = ShaderVisibility::All, uint32_t registerSpace = 0); + static D3D12_ROOT_PARAMETER CreateSRV(uint32_t shaderRegister, ShaderVisibility visibility = ShaderVisibility::All, uint32_t registerSpace = 0); + static D3D12_ROOT_PARAMETER CreateUAV(uint32_t shaderRegister, ShaderVisibility visibility = ShaderVisibility::All, uint32_t registerSpace = 0); + static D3D12_ROOT_PARAMETER Create32BitConstants(uint32_t shaderRegister, uint32_t num32BitValues, ShaderVisibility visibility = ShaderVisibility::All, uint32_t registerSpace = 0); + static D3D12_ROOT_PARAMETER CreateDescriptorTable(uint32_t shaderRegister, uint32_t numDescriptors, D3D12_DESCRIPTOR_RANGE_TYPE rangeType, ShaderVisibility visibility = ShaderVisibility::All, uint32_t registerSpace = 0); + + static D3D12_STATIC_SAMPLER_DESC CreateStaticSampler(uint32_t shaderRegister, const D3D12_SAMPLER_DESC& desc, ShaderVisibility visibility = ShaderVisibility::Pixel); + private: ComPtr m_rootSignature; uint32_t m_parameterCount = 0; diff --git a/engine/include/XCEngine/RHI/D3D12/PipelineStateBuilder.h b/engine/include/XCEngine/RHI/D3D12/PipelineStateBuilder.h deleted file mode 100644 index 47f506a4..00000000 --- a/engine/include/XCEngine/RHI/D3D12/PipelineStateBuilder.h +++ /dev/null @@ -1,53 +0,0 @@ -#pragma once - -#include -#include -#include "../Enums.h" -#include "D3D12Enum.h" - -namespace XCEngine { -namespace RHI { - -class PipelineStateBuilder { -public: - PipelineStateBuilder(); - - PipelineStateBuilder& SetRootSignature(ID3D12RootSignature* rootSignature); - PipelineStateBuilder& SetVertexShader(const D3D12_SHADER_BYTECODE& shader); - PipelineStateBuilder& SetPixelShader(const D3D12_SHADER_BYTECODE& shader); - PipelineStateBuilder& SetGeometryShader(const D3D12_SHADER_BYTECODE& shader); - - PipelineStateBuilder& SetInputLayout(uint32_t numElements, const D3D12_INPUT_ELEMENT_DESC* elements); - PipelineStateBuilder& SetPrimitiveTopologyType(D3D12_PRIMITIVE_TOPOLOGY_TYPE topologyType); - - PipelineStateBuilder& SetRenderTargetFormat(Format format); - PipelineStateBuilder& SetRenderTargetFormats(uint32_t count, const Format* formats); - PipelineStateBuilder& SetDepthStencilFormat(Format format); - - PipelineStateBuilder& SetSampleDesc(uint32_t count, uint32_t quality); - - PipelineStateBuilder& SetFillMode(FillMode mode); - PipelineStateBuilder& SetCullMode(CullMode mode); - PipelineStateBuilder& SetDepthClipEnable(bool enable); - - PipelineStateBuilder& SetDepthEnable(bool enable); - PipelineStateBuilder& SetDepthWriteMask(D3D12_DEPTH_WRITE_MASK writeMask); - PipelineStateBuilder& SetDepthFunc(ComparisonFunc func); - - PipelineStateBuilder& SetStencilEnable(bool enable); - PipelineStateBuilder& SetFrontFaceStencilOp(D3D12_STENCIL_OP failOp, D3D12_STENCIL_OP depthFailOp, D3D12_STENCIL_OP passOp, ComparisonFunc func); - PipelineStateBuilder& SetBackFaceStencilOp(D3D12_STENCIL_OP failOp, D3D12_STENCIL_OP depthFailOp, D3D12_STENCIL_OP passOp, ComparisonFunc func); - - PipelineStateBuilder& SetBlendEnable(bool enable); - PipelineStateBuilder& SetBlendFactor(BlendFactor srcBlend, BlendFactor dstBlend, BlendOp blendOp); - PipelineStateBuilder& SetAlphaBlendFactor(BlendFactor srcBlendAlpha, BlendFactor dstBlendAlpha, BlendOp blendOpAlpha); - PipelineStateBuilder& SetColorWriteMask(ColorWriteMask mask); - - D3D12_GRAPHICS_PIPELINE_STATE_DESC Build(); - -private: - D3D12_GRAPHICS_PIPELINE_STATE_DESC m_desc; -}; - -} // namespace RHI -} // namespace XCEngine diff --git a/engine/include/XCEngine/RHI/D3D12/RootSignatureBuilder.h b/engine/include/XCEngine/RHI/D3D12/RootSignatureBuilder.h deleted file mode 100644 index b59a4ae1..00000000 --- a/engine/include/XCEngine/RHI/D3D12/RootSignatureBuilder.h +++ /dev/null @@ -1,30 +0,0 @@ -#pragma once - -#include -#include - -#include "../Enums.h" -#include "D3D12Enum.h" - -namespace XCEngine { -namespace RHI { - -class RootSignatureBuilder { -public: - RootSignatureBuilder(); - - RootSignatureBuilder& AddCBV(uint32_t shaderRegister, ShaderVisibility visibility = ShaderVisibility::All, uint32_t registerSpace = 0); - RootSignatureBuilder& AddSRV(uint32_t shaderRegister, ShaderVisibility visibility = ShaderVisibility::All, uint32_t registerSpace = 0); - RootSignatureBuilder& AddUAV(uint32_t shaderRegister, ShaderVisibility visibility = ShaderVisibility::All, uint32_t registerSpace = 0); - RootSignatureBuilder& Add32BitConstants(uint32_t shaderRegister, uint32_t num32BitValues, ShaderVisibility visibility = ShaderVisibility::All, uint32_t registerSpace = 0); - RootSignatureBuilder& AddDescriptorTable(uint32_t shaderRegister, uint32_t numDescriptors, D3D12_DESCRIPTOR_RANGE_TYPE rangeType, ShaderVisibility visibility = ShaderVisibility::All, uint32_t registerSpace = 0); - - D3D12_ROOT_SIGNATURE_DESC Build(); - -private: - std::vector m_parameters; - std::vector> m_descriptorRanges; -}; - -} // namespace RHI -} // namespace XCEngine diff --git a/engine/src/RHI/D3D12/D3D12PipelineState.cpp b/engine/src/RHI/D3D12/D3D12PipelineState.cpp index e5920e7a..e98ef13b 100644 --- a/engine/src/RHI/D3D12/D3D12PipelineState.cpp +++ b/engine/src/RHI/D3D12/D3D12PipelineState.cpp @@ -22,5 +22,60 @@ 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 diff --git a/engine/src/RHI/D3D12/D3D12RootSignature.cpp b/engine/src/RHI/D3D12/D3D12RootSignature.cpp index d4d329fb..69c74861 100644 --- a/engine/src/RHI/D3D12/D3D12RootSignature.cpp +++ b/engine/src/RHI/D3D12/D3D12RootSignature.cpp @@ -39,5 +39,91 @@ void D3D12RootSignature::Shutdown() { m_rootSignature.Reset(); } +D3D12_ROOT_SIGNATURE_DESC D3D12RootSignature::CreateDesc( + D3D12_ROOT_PARAMETER* parameters, + uint32_t parameterCount, + D3D12_STATIC_SAMPLER_DESC* samplers, + uint32_t samplerCount, + D3D12_ROOT_SIGNATURE_FLAGS flags) { + D3D12_ROOT_SIGNATURE_DESC desc = {}; + desc.NumParameters = parameterCount; + desc.pParameters = parameters; + desc.NumStaticSamplers = samplerCount; + desc.pStaticSamplers = samplers; + desc.Flags = flags; + return desc; +} + +D3D12_ROOT_PARAMETER D3D12RootSignature::CreateCBV(uint32_t shaderRegister, ShaderVisibility visibility, uint32_t registerSpace) { + D3D12_ROOT_PARAMETER param = {}; + param.ParameterType = D3D12_ROOT_PARAMETER_TYPE_CBV; + param.ShaderVisibility = ToD3D12(visibility); + param.Descriptor.RegisterSpace = registerSpace; + param.Descriptor.ShaderRegister = shaderRegister; + return param; +} + +D3D12_ROOT_PARAMETER D3D12RootSignature::CreateSRV(uint32_t shaderRegister, ShaderVisibility visibility, uint32_t registerSpace) { + D3D12_ROOT_PARAMETER param = {}; + param.ParameterType = D3D12_ROOT_PARAMETER_TYPE_SRV; + param.ShaderVisibility = ToD3D12(visibility); + param.Descriptor.RegisterSpace = registerSpace; + param.Descriptor.ShaderRegister = shaderRegister; + return param; +} + +D3D12_ROOT_PARAMETER D3D12RootSignature::CreateUAV(uint32_t shaderRegister, ShaderVisibility visibility, uint32_t registerSpace) { + D3D12_ROOT_PARAMETER param = {}; + param.ParameterType = D3D12_ROOT_PARAMETER_TYPE_UAV; + param.ShaderVisibility = ToD3D12(visibility); + param.Descriptor.RegisterSpace = registerSpace; + param.Descriptor.ShaderRegister = shaderRegister; + return param; +} + +D3D12_ROOT_PARAMETER D3D12RootSignature::Create32BitConstants(uint32_t shaderRegister, uint32_t num32BitValues, ShaderVisibility visibility, uint32_t registerSpace) { + D3D12_ROOT_PARAMETER param = {}; + param.ParameterType = D3D12_ROOT_PARAMETER_TYPE_32BIT_CONSTANTS; + param.ShaderVisibility = ToD3D12(visibility); + param.Constants.RegisterSpace = registerSpace; + param.Constants.ShaderRegister = shaderRegister; + param.Constants.Num32BitValues = num32BitValues; + return param; +} + +D3D12_ROOT_PARAMETER D3D12RootSignature::CreateDescriptorTable(uint32_t shaderRegister, uint32_t numDescriptors, D3D12_DESCRIPTOR_RANGE_TYPE rangeType, ShaderVisibility visibility, uint32_t registerSpace) { + static D3D12_DESCRIPTOR_RANGE range; + range.RangeType = rangeType; + range.NumDescriptors = numDescriptors; + range.BaseShaderRegister = shaderRegister; + range.RegisterSpace = registerSpace; + range.OffsetInDescriptorsFromTableStart = D3D12_DESCRIPTOR_RANGE_OFFSET_APPEND; + + D3D12_ROOT_PARAMETER param = {}; + param.ParameterType = D3D12_ROOT_PARAMETER_TYPE_DESCRIPTOR_TABLE; + param.ShaderVisibility = ToD3D12(visibility); + param.DescriptorTable.NumDescriptorRanges = 1; + param.DescriptorTable.pDescriptorRanges = ⦥ + return param; +} + +D3D12_STATIC_SAMPLER_DESC D3D12RootSignature::CreateStaticSampler(uint32_t shaderRegister, const D3D12_SAMPLER_DESC& desc, ShaderVisibility visibility) { + D3D12_STATIC_SAMPLER_DESC samplerDesc = {}; + samplerDesc.Filter = desc.Filter; + samplerDesc.AddressU = desc.AddressU; + samplerDesc.AddressV = desc.AddressV; + samplerDesc.AddressW = desc.AddressW; + samplerDesc.MipLODBias = desc.MipLODBias; + samplerDesc.MaxAnisotropy = desc.MaxAnisotropy; + samplerDesc.ComparisonFunc = desc.ComparisonFunc; + samplerDesc.BorderColor = D3D12_STATIC_BORDER_COLOR_OPAQUE_BLACK; + samplerDesc.MinLOD = desc.MinLOD; + samplerDesc.MaxLOD = desc.MaxLOD; + samplerDesc.RegisterSpace = 0; + samplerDesc.ShaderRegister = shaderRegister; + samplerDesc.ShaderVisibility = ToD3D12(visibility); + return samplerDesc; +} + } // namespace RHI } // namespace XCEngine diff --git a/engine/src/RHI/D3D12/PipelineStateBuilder.cpp b/engine/src/RHI/D3D12/PipelineStateBuilder.cpp deleted file mode 100644 index 908ef107..00000000 --- a/engine/src/RHI/D3D12/PipelineStateBuilder.cpp +++ /dev/null @@ -1,159 +0,0 @@ -#include "XCEngine/RHI/D3D12/PipelineStateBuilder.h" - -namespace XCEngine { -namespace RHI { - -PipelineStateBuilder::PipelineStateBuilder() { - memset(&m_desc, 0, sizeof(m_desc)); - m_desc.SampleDesc.Count = 1; - m_desc.SampleDesc.Quality = 0; - m_desc.SampleMask = 0xffffffff; - m_desc.NumRenderTargets = 1; - m_desc.RTVFormats[0] = DXGI_FORMAT_R8G8B8A8_UNORM; - m_desc.DSVFormat = DXGI_FORMAT_D24_UNORM_S8_UINT; - m_desc.PrimitiveTopologyType = D3D12_PRIMITIVE_TOPOLOGY_TYPE_TRIANGLE; - m_desc.DepthStencilState.DepthEnable = TRUE; - m_desc.DepthStencilState.DepthWriteMask = D3D12_DEPTH_WRITE_MASK_ALL; - m_desc.DepthStencilState.DepthFunc = D3D12_COMPARISON_FUNC_LESS_EQUAL; - m_desc.RasterizerState.FillMode = D3D12_FILL_MODE_SOLID; - m_desc.RasterizerState.CullMode = D3D12_CULL_MODE_BACK; - m_desc.RasterizerState.DepthClipEnable = TRUE; -} - -PipelineStateBuilder& PipelineStateBuilder::SetRootSignature(ID3D12RootSignature* rootSignature) { - m_desc.pRootSignature = rootSignature; - return *this; -} - -PipelineStateBuilder& PipelineStateBuilder::SetVertexShader(const D3D12_SHADER_BYTECODE& shader) { - m_desc.VS = shader; - return *this; -} - -PipelineStateBuilder& PipelineStateBuilder::SetPixelShader(const D3D12_SHADER_BYTECODE& shader) { - m_desc.PS = shader; - return *this; -} - -PipelineStateBuilder& PipelineStateBuilder::SetGeometryShader(const D3D12_SHADER_BYTECODE& shader) { - m_desc.GS = shader; - return *this; -} - -PipelineStateBuilder& PipelineStateBuilder::SetInputLayout(uint32_t numElements, const D3D12_INPUT_ELEMENT_DESC* elements) { - m_desc.InputLayout.NumElements = numElements; - m_desc.InputLayout.pInputElementDescs = elements; - return *this; -} - -PipelineStateBuilder& PipelineStateBuilder::SetPrimitiveTopologyType(D3D12_PRIMITIVE_TOPOLOGY_TYPE topologyType) { - m_desc.PrimitiveTopologyType = topologyType; - return *this; -} - -PipelineStateBuilder& PipelineStateBuilder::SetRenderTargetFormat(Format format) { - m_desc.NumRenderTargets = 1; - m_desc.RTVFormats[0] = ToD3D12(format); - return *this; -} - -PipelineStateBuilder& PipelineStateBuilder::SetRenderTargetFormats(uint32_t count, const Format* formats) { - m_desc.NumRenderTargets = count; - for (uint32_t i = 0; i < count && i < D3D12_SIMULTANEOUS_RENDER_TARGET_COUNT; ++i) { - m_desc.RTVFormats[i] = ToD3D12(formats[i]); - } - return *this; -} - -PipelineStateBuilder& PipelineStateBuilder::SetDepthStencilFormat(Format format) { - m_desc.DSVFormat = ToD3D12(format); - return *this; -} - -PipelineStateBuilder& PipelineStateBuilder::SetSampleDesc(uint32_t count, uint32_t quality) { - m_desc.SampleDesc.Count = count; - m_desc.SampleDesc.Quality = quality; - return *this; -} - -PipelineStateBuilder& PipelineStateBuilder::SetFillMode(FillMode mode) { - m_desc.RasterizerState.FillMode = ToD3D12(mode); - return *this; -} - -PipelineStateBuilder& PipelineStateBuilder::SetCullMode(CullMode mode) { - m_desc.RasterizerState.CullMode = ToD3D12(mode); - return *this; -} - -PipelineStateBuilder& PipelineStateBuilder::SetDepthClipEnable(bool enable) { - m_desc.RasterizerState.DepthClipEnable = enable ? TRUE : FALSE; - return *this; -} - -PipelineStateBuilder& PipelineStateBuilder::SetDepthEnable(bool enable) { - m_desc.DepthStencilState.DepthEnable = enable ? TRUE : FALSE; - return *this; -} - -PipelineStateBuilder& PipelineStateBuilder::SetDepthWriteMask(D3D12_DEPTH_WRITE_MASK writeMask) { - m_desc.DepthStencilState.DepthWriteMask = writeMask; - return *this; -} - -PipelineStateBuilder& PipelineStateBuilder::SetDepthFunc(ComparisonFunc func) { - m_desc.DepthStencilState.DepthFunc = ToD3D12(func); - return *this; -} - -PipelineStateBuilder& PipelineStateBuilder::SetStencilEnable(bool enable) { - m_desc.DepthStencilState.StencilEnable = enable ? TRUE : FALSE; - return *this; -} - -PipelineStateBuilder& PipelineStateBuilder::SetFrontFaceStencilOp(D3D12_STENCIL_OP failOp, D3D12_STENCIL_OP depthFailOp, D3D12_STENCIL_OP passOp, ComparisonFunc func) { - m_desc.DepthStencilState.FrontFace.StencilFailOp = failOp; - m_desc.DepthStencilState.FrontFace.StencilDepthFailOp = depthFailOp; - m_desc.DepthStencilState.FrontFace.StencilPassOp = passOp; - m_desc.DepthStencilState.FrontFace.StencilFunc = ToD3D12(func); - return *this; -} - -PipelineStateBuilder& PipelineStateBuilder::SetBackFaceStencilOp(D3D12_STENCIL_OP failOp, D3D12_STENCIL_OP depthFailOp, D3D12_STENCIL_OP passOp, ComparisonFunc func) { - m_desc.DepthStencilState.BackFace.StencilFailOp = failOp; - m_desc.DepthStencilState.BackFace.StencilDepthFailOp = depthFailOp; - m_desc.DepthStencilState.BackFace.StencilPassOp = passOp; - m_desc.DepthStencilState.BackFace.StencilFunc = ToD3D12(func); - return *this; -} - -PipelineStateBuilder& PipelineStateBuilder::SetBlendEnable(bool enable) { - m_desc.BlendState.RenderTarget[0].BlendEnable = enable ? TRUE : FALSE; - return *this; -} - -PipelineStateBuilder& PipelineStateBuilder::SetBlendFactor(BlendFactor srcBlend, BlendFactor dstBlend, BlendOp blendOp) { - m_desc.BlendState.RenderTarget[0].SrcBlend = ToD3D12(srcBlend); - m_desc.BlendState.RenderTarget[0].DestBlend = ToD3D12(dstBlend); - m_desc.BlendState.RenderTarget[0].BlendOp = ToD3D12(blendOp); - return *this; -} - -PipelineStateBuilder& PipelineStateBuilder::SetAlphaBlendFactor(BlendFactor srcBlendAlpha, BlendFactor dstBlendAlpha, BlendOp blendOpAlpha) { - m_desc.BlendState.RenderTarget[0].SrcBlendAlpha = ToD3D12(srcBlendAlpha); - m_desc.BlendState.RenderTarget[0].DestBlendAlpha = ToD3D12(dstBlendAlpha); - m_desc.BlendState.RenderTarget[0].BlendOpAlpha = ToD3D12(blendOpAlpha); - return *this; -} - -PipelineStateBuilder& PipelineStateBuilder::SetColorWriteMask(ColorWriteMask mask) { - m_desc.BlendState.RenderTarget[0].RenderTargetWriteMask = static_cast(mask); - return *this; -} - -D3D12_GRAPHICS_PIPELINE_STATE_DESC PipelineStateBuilder::Build() { - return m_desc; -} - -} // namespace RHI -} // namespace XCEngine diff --git a/engine/src/RHI/D3D12/RootSignatureBuilder.cpp b/engine/src/RHI/D3D12/RootSignatureBuilder.cpp deleted file mode 100644 index 61799eb8..00000000 --- a/engine/src/RHI/D3D12/RootSignatureBuilder.cpp +++ /dev/null @@ -1,84 +0,0 @@ -#include "XCEngine/RHI/D3D12/RootSignatureBuilder.h" - -namespace XCEngine { -namespace RHI { - -RootSignatureBuilder::RootSignatureBuilder() { - m_parameters.reserve(8); - m_descriptorRanges.reserve(8); -} - -RootSignatureBuilder& RootSignatureBuilder::AddCBV(uint32_t shaderRegister, ShaderVisibility visibility, uint32_t registerSpace) { - D3D12_ROOT_PARAMETER param = {}; - param.ParameterType = D3D12_ROOT_PARAMETER_TYPE_CBV; - param.ShaderVisibility = ToD3D12(visibility); - param.Descriptor.RegisterSpace = registerSpace; - param.Descriptor.ShaderRegister = shaderRegister; - m_parameters.push_back(param); - return *this; -} - -RootSignatureBuilder& RootSignatureBuilder::AddSRV(uint32_t shaderRegister, ShaderVisibility visibility, uint32_t registerSpace) { - D3D12_ROOT_PARAMETER param = {}; - param.ParameterType = D3D12_ROOT_PARAMETER_TYPE_SRV; - param.ShaderVisibility = ToD3D12(visibility); - param.Descriptor.RegisterSpace = registerSpace; - param.Descriptor.ShaderRegister = shaderRegister; - m_parameters.push_back(param); - return *this; -} - -RootSignatureBuilder& RootSignatureBuilder::AddUAV(uint32_t shaderRegister, ShaderVisibility visibility, uint32_t registerSpace) { - D3D12_ROOT_PARAMETER param = {}; - param.ParameterType = D3D12_ROOT_PARAMETER_TYPE_UAV; - param.ShaderVisibility = ToD3D12(visibility); - param.Descriptor.RegisterSpace = registerSpace; - param.Descriptor.ShaderRegister = shaderRegister; - m_parameters.push_back(param); - return *this; -} - -RootSignatureBuilder& RootSignatureBuilder::Add32BitConstants(uint32_t shaderRegister, uint32_t num32BitValues, ShaderVisibility visibility, uint32_t registerSpace) { - D3D12_ROOT_PARAMETER param = {}; - param.ParameterType = D3D12_ROOT_PARAMETER_TYPE_32BIT_CONSTANTS; - param.ShaderVisibility = ToD3D12(visibility); - param.Constants.RegisterSpace = registerSpace; - param.Constants.ShaderRegister = shaderRegister; - param.Constants.Num32BitValues = num32BitValues; - m_parameters.push_back(param); - return *this; -} - -RootSignatureBuilder& RootSignatureBuilder::AddDescriptorTable(uint32_t shaderRegister, uint32_t numDescriptors, D3D12_DESCRIPTOR_RANGE_TYPE rangeType, ShaderVisibility visibility, uint32_t registerSpace) { - D3D12_DESCRIPTOR_RANGE range = {}; - range.RangeType = rangeType; - range.NumDescriptors = numDescriptors; - range.BaseShaderRegister = shaderRegister; - range.RegisterSpace = registerSpace; - range.OffsetInDescriptorsFromTableStart = D3D12_DESCRIPTOR_RANGE_OFFSET_APPEND; - - std::vector ranges; - ranges.push_back(range); - m_descriptorRanges.push_back(ranges); - - D3D12_ROOT_PARAMETER param = {}; - param.ParameterType = D3D12_ROOT_PARAMETER_TYPE_DESCRIPTOR_TABLE; - param.ShaderVisibility = ToD3D12(visibility); - param.DescriptorTable.NumDescriptorRanges = static_cast(m_descriptorRanges.back().size()); - param.DescriptorTable.pDescriptorRanges = m_descriptorRanges.back().data(); - m_parameters.push_back(param); - return *this; -} - -D3D12_ROOT_SIGNATURE_DESC RootSignatureBuilder::Build() { - D3D12_ROOT_SIGNATURE_DESC desc = {}; - desc.NumParameters = static_cast(m_parameters.size()); - desc.pParameters = m_parameters.data(); - desc.NumStaticSamplers = 0; - desc.pStaticSamplers = nullptr; - desc.Flags = D3D12_ROOT_SIGNATURE_FLAG_ALLOW_INPUT_ASSEMBLER_INPUT_LAYOUT; - return desc; -} - -} // namespace RHI -} // namespace XCEngine