PipelineState.cpp 3.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384
  1. // Jolt Physics Library (https://github.com/jrouwe/JoltPhysics)
  2. // SPDX-FileCopyrightText: 2021 Jorrit Rouwe
  3. // SPDX-License-Identifier: MIT
  4. #include <TestFramework.h>
  5. #include <Renderer/PipelineState.h>
  6. #include <Renderer/Renderer.h>
  7. #include <Renderer/FatalErrorIfFailed.h>
  8. PipelineState::PipelineState(Renderer *inRenderer, ID3DBlob *inVertexShader, const D3D12_INPUT_ELEMENT_DESC *inInputDescription, uint inInputDescriptionCount, ID3DBlob *inPixelShader, D3D12_FILL_MODE inFillMode, D3D12_PRIMITIVE_TOPOLOGY_TYPE inTopology, EDepthTest inDepthTest, EBlendMode inBlendMode, ECullMode inCullMode) :
  9. mRenderer(inRenderer)
  10. {
  11. D3D12_GRAPHICS_PIPELINE_STATE_DESC pso_desc = {};
  12. pso_desc.InputLayout = { inInputDescription, inInputDescriptionCount };
  13. pso_desc.pRootSignature = mRenderer->GetRootSignature();
  14. pso_desc.VS = { inVertexShader->GetBufferPointer(), inVertexShader->GetBufferSize() };
  15. pso_desc.PS = { inPixelShader->GetBufferPointer(), inPixelShader->GetBufferSize() };
  16. pso_desc.RasterizerState.FillMode = inFillMode;
  17. pso_desc.RasterizerState.CullMode = inCullMode == ECullMode::Backface? D3D12_CULL_MODE_FRONT : D3D12_CULL_MODE_BACK; // DX uses left handed system so we reverse the options
  18. pso_desc.RasterizerState.FrontCounterClockwise = FALSE;
  19. pso_desc.RasterizerState.DepthBias = D3D12_DEFAULT_DEPTH_BIAS;
  20. pso_desc.RasterizerState.DepthBiasClamp = D3D12_DEFAULT_DEPTH_BIAS_CLAMP;
  21. pso_desc.RasterizerState.SlopeScaledDepthBias = D3D12_DEFAULT_SLOPE_SCALED_DEPTH_BIAS;
  22. pso_desc.RasterizerState.DepthClipEnable = TRUE;
  23. pso_desc.RasterizerState.MultisampleEnable = FALSE;
  24. pso_desc.RasterizerState.AntialiasedLineEnable = FALSE;
  25. pso_desc.RasterizerState.ForcedSampleCount = 0;
  26. pso_desc.RasterizerState.ConservativeRaster = D3D12_CONSERVATIVE_RASTERIZATION_MODE_OFF;
  27. pso_desc.BlendState.AlphaToCoverageEnable = FALSE;
  28. pso_desc.BlendState.IndependentBlendEnable = FALSE;
  29. D3D12_RENDER_TARGET_BLEND_DESC &blend_desc = pso_desc.BlendState.RenderTarget[0];
  30. blend_desc.LogicOpEnable = FALSE;
  31. blend_desc.LogicOp = D3D12_LOGIC_OP_NOOP;
  32. blend_desc.RenderTargetWriteMask = D3D12_COLOR_WRITE_ENABLE_ALL;
  33. switch (inBlendMode)
  34. {
  35. case EBlendMode::Write:
  36. blend_desc.BlendEnable = FALSE;
  37. break;
  38. case EBlendMode::AlphaTest:
  39. pso_desc.BlendState.AlphaToCoverageEnable = TRUE;
  40. [[fallthrough]];
  41. case EBlendMode::AlphaBlend:
  42. blend_desc.BlendEnable = TRUE;
  43. blend_desc.SrcBlend = D3D12_BLEND_SRC_ALPHA;
  44. blend_desc.DestBlend = D3D12_BLEND_INV_SRC_ALPHA;
  45. blend_desc.BlendOp = D3D12_BLEND_OP_ADD;
  46. blend_desc.SrcBlendAlpha = D3D12_BLEND_ZERO;
  47. blend_desc.DestBlendAlpha = D3D12_BLEND_ZERO;
  48. blend_desc.BlendOpAlpha = D3D12_BLEND_OP_ADD;
  49. break;
  50. }
  51. pso_desc.DepthStencilState.DepthEnable = inDepthTest == EDepthTest::On? TRUE : FALSE;
  52. pso_desc.DepthStencilState.DepthWriteMask = inDepthTest == EDepthTest::On? D3D12_DEPTH_WRITE_MASK_ALL : D3D12_DEPTH_WRITE_MASK_ZERO;
  53. pso_desc.DepthStencilState.DepthFunc = D3D12_COMPARISON_FUNC_LESS;
  54. pso_desc.DepthStencilState.StencilEnable = FALSE;
  55. pso_desc.SampleMask = UINT_MAX;
  56. pso_desc.PrimitiveTopologyType = inTopology;
  57. pso_desc.NumRenderTargets = 1;
  58. pso_desc.RTVFormats[0] = DXGI_FORMAT_R8G8B8A8_UNORM;
  59. pso_desc.DSVFormat = DXGI_FORMAT_D32_FLOAT;
  60. pso_desc.SampleDesc.Count = 1;
  61. FatalErrorIfFailed(mRenderer->GetDevice()->CreateGraphicsPipelineState(&pso_desc, IID_PPV_ARGS(&mPSO)));
  62. }
  63. PipelineState::~PipelineState()
  64. {
  65. if (mPSO != nullptr)
  66. mRenderer->RecycleD3DObject(mPSO.Get());
  67. }
  68. void PipelineState::Activate()
  69. {
  70. mRenderer->GetCommandList()->SetPipelineState(mPSO.Get());
  71. }