DX12Shader.h 3.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101
  1. #pragma once
  2. #include "Array.h"
  3. #include "DX12Buffer.h"
  4. struct ID3D12Device5;
  5. struct ID3D12GraphicsCommandList;
  6. struct D3D12_INPUT_ELEMENT_DESC;
  7. struct D3D12_ROOT_PARAMETER1;
  8. struct D3D12_CONSTANT_BUFFER_VIEW_DESC;
  9. namespace Framework
  10. {
  11. enum DX12ShaderRegister
  12. {
  13. DX12_SHADER_REGISTER_B_CONST_BUFFER = 0,
  14. DX12_SHADER_REGISTER_T_SHADER_RESOURCE = 1,
  15. DX12_SHADER_REGISTER_U_UNORDERED_ACCESS = 2,
  16. // TODO: Do we need Sampler?
  17. };
  18. struct DX12ShaderRegisterUsage
  19. {
  20. DX12ShaderRegister registerType;
  21. int registerIndex;
  22. int spaceIndex;
  23. };
  24. class DX12ShaderSignature : public ReferenceCounter
  25. {
  26. private:
  27. ID3D12RootSignature* signature;
  28. ID3D12Device5* zDevice;
  29. Array<DX12ShaderRegisterUsage> registerUsages;
  30. PFN_D3D12_SERIALIZE_ROOT_SIGNATURE pfnD3D12SerializeRootSignature;
  31. public:
  32. DX12ShaderSignature(ID3D12Device5* zDevice,
  33. PFN_D3D12_SERIALIZE_ROOT_SIGNATURE pfnD3D12SerializeRootSignature);
  34. ~DX12ShaderSignature();
  35. /**
  36. * needs to be called for each datastructure with : register(...)
  37. *
  38. * \param registerType the register type e.g.
  39. * DX12_SHADER_REGISTER_B_CONST_BUFFER for : register(b0)
  40. * \param registerIndex the register index e.g. 1 for : register(b1)
  41. */
  42. void addRegisterUsage(
  43. DX12ShaderRegister registerType, int registerIndex);
  44. /**
  45. * needs to be called for each datastructure with : register(...)
  46. *
  47. * \param registerType the register type e.g.
  48. * DX12_SHADER_REGISTER_B_CONST_BUFFER for : register(b0, space1)
  49. * \param registerIndex the register index e.g. 1 for : register(b1,
  50. * space2)
  51. * \param spaceIndex the space index e.g. 3 for : register(b1, space3)
  52. */
  53. void addRegisterUsage(
  54. DX12ShaderRegister registerType, int registerIndex, int spaceIndex);
  55. /**
  56. * Creates the root signature.
  57. */
  58. void createSignature();
  59. ID3D12RootSignature* zSignature() const;
  60. };
  61. class DX12ShaderFunction : public ReferenceCounter
  62. {
  63. private:
  64. Text functionName;
  65. DX12ShaderSignature* signature;
  66. };
  67. class DX12Shader : public ReferenceCounter
  68. {
  69. private:
  70. RCArray<DX12ShaderFunction> functions;
  71. const char* shaderBytes;
  72. int shaderBytesSize;
  73. };
  74. class ShaderHitGroup : public ReferenceCounter
  75. {
  76. private:
  77. Text name;
  78. DX12ShaderFunction* closestHitShaderFunctionName;
  79. DX12ShaderFunction* anyHitShaderFunctionName;
  80. DX12ShaderFunction* intersectionShaderFunctionName;
  81. int payloadSize;
  82. int attributeSize;
  83. };
  84. class DX12Pipeline : public ReferenceCounter
  85. {
  86. private:
  87. RCArray<DX12Shader> shaders;
  88. RCArray<ShaderHitGroup> hitGroups;
  89. int maxRecursionDepth;
  90. }; // namespace Framework
  91. } // namespace Framework