BsD3D11GpuProgram.h 5.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182
  1. //********************************** Banshee Engine (www.banshee3d.com) **************************************************//
  2. //**************** Copyright (c) 2016 Marko Pintera ([email protected]). All rights reserved. **********************//
  3. #pragma once
  4. #include "BsD3D11Prerequisites.h"
  5. #include "BsGpuProgram.h"
  6. namespace BansheeEngine
  7. {
  8. /** @addtogroup D3D11
  9. * @{
  10. */
  11. /** Abstraction of a DirectX 11 shader object. */
  12. class BS_D3D11_EXPORT D3D11GpuProgramCore : public GpuProgramCore
  13. {
  14. public:
  15. virtual ~D3D11GpuProgramCore();
  16. /** Returns compiled shader microcode. */
  17. const HLSLMicroCode& getMicroCode() const { return mMicrocode; }
  18. /** Returns unique GPU program ID. */
  19. UINT32 getProgramId() const { return mProgramId; }
  20. protected:
  21. D3D11GpuProgramCore(const GPU_PROGRAM_DESC& desc, GpuDeviceFlags deviceMask);
  22. /** @copydoc GpuProgramCore::initialize */
  23. void initialize() override;
  24. /** Loads the shader from microcode. */
  25. virtual void loadFromMicrocode(D3D11Device& device, ID3D10Blob* microcode) = 0;
  26. /** Compiles the shader from source and generates the microcode. */
  27. ID3DBlob* compileMicrocode(const String& profile);
  28. /**
  29. * Reflects the microcode and extracts input/output parameters, and constant buffer structures used by the program.
  30. */
  31. void populateParametersAndConstants(ID3DBlob* microcode);
  32. /** Parses compiler error message and returns the line number at which the error occurred. */
  33. UINT32 parseErrorMessage(const char* message);
  34. protected:
  35. static UINT32 GlobalProgramId;
  36. bool mEnableBackwardsCompatibility;
  37. UINT32 mProgramId;
  38. HLSLMicroCode mMicrocode;
  39. };
  40. /** Implementation of a DX11 vertex shader. */
  41. class BS_D3D11_EXPORT D3D11GpuVertexProgramCore : public D3D11GpuProgramCore
  42. {
  43. public:
  44. ~D3D11GpuVertexProgramCore();
  45. /** Returns internal DX11 vertex shader object. */
  46. ID3D11VertexShader* getVertexShader() const;
  47. protected:
  48. friend class D3D11HLSLProgramFactory;
  49. D3D11GpuVertexProgramCore(const GPU_PROGRAM_DESC& desc, GpuDeviceFlags deviceMask);
  50. /** @copydoc D3D11GpuProgramCore::loadFromMicrocode */
  51. void loadFromMicrocode(D3D11Device& device, ID3D10Blob* microcode) override;
  52. protected:
  53. ID3D11VertexShader* mVertexShader;
  54. };
  55. /** Implementation of a DX11 pixel shader. */
  56. class BS_D3D11_EXPORT D3D11GpuFragmentProgramCore : public D3D11GpuProgramCore
  57. {
  58. public:
  59. ~D3D11GpuFragmentProgramCore();
  60. /** Returns internal DX11 pixel shader object. */
  61. ID3D11PixelShader* getPixelShader() const;
  62. protected:
  63. friend class D3D11HLSLProgramFactory;
  64. D3D11GpuFragmentProgramCore(const GPU_PROGRAM_DESC& desc, GpuDeviceFlags deviceMask);
  65. /** @copydoc D3D11GpuProgramCore::loadFromMicrocode */
  66. void loadFromMicrocode(D3D11Device& device, ID3D10Blob* microcode) override;
  67. protected:
  68. ID3D11PixelShader* mPixelShader;
  69. };
  70. /** Implementation of a DX11 domain shader. */
  71. class BS_D3D11_EXPORT D3D11GpuDomainProgramCore : public D3D11GpuProgramCore
  72. {
  73. public:
  74. ~D3D11GpuDomainProgramCore();
  75. /** Returns internal DX11 domain shader object. */
  76. ID3D11DomainShader* getDomainShader() const;
  77. protected:
  78. friend class D3D11HLSLProgramFactory;
  79. D3D11GpuDomainProgramCore(const GPU_PROGRAM_DESC& desc, GpuDeviceFlags deviceMask);
  80. /** @copydoc D3D11GpuProgramCore::loadFromMicrocode */
  81. void loadFromMicrocode(D3D11Device& device, ID3D10Blob* microcode) override;
  82. protected:
  83. ID3D11DomainShader* mDomainShader;
  84. };
  85. /** Implementation of a DX11 hull shader. */
  86. class BS_D3D11_EXPORT D3D11GpuHullProgramCore : public D3D11GpuProgramCore
  87. {
  88. public:
  89. ~D3D11GpuHullProgramCore();
  90. /** Returns internal DX11 hull shader object. */
  91. ID3D11HullShader* getHullShader() const;
  92. protected:
  93. friend class D3D11HLSLProgramFactory;
  94. D3D11GpuHullProgramCore(const GPU_PROGRAM_DESC& desc, GpuDeviceFlags deviceMask);
  95. /** @copydoc D3D11GpuProgramCore::loadFromMicrocode */
  96. void loadFromMicrocode(D3D11Device& device, ID3D10Blob* microcode) override;
  97. protected:
  98. ID3D11HullShader* mHullShader;
  99. };
  100. /** Implementation of a DX11 geometry shader. */
  101. class BS_D3D11_EXPORT D3D11GpuGeometryProgramCore : public D3D11GpuProgramCore
  102. {
  103. public:
  104. ~D3D11GpuGeometryProgramCore();
  105. /** Returns internal DX11 geometry shader object. */
  106. ID3D11GeometryShader* getGeometryShader() const;
  107. protected:
  108. friend class D3D11HLSLProgramFactory;
  109. D3D11GpuGeometryProgramCore(const GPU_PROGRAM_DESC& desc, GpuDeviceFlags deviceMask);
  110. /** @copydoc D3D11GpuProgramCore::loadFromMicrocode */
  111. void loadFromMicrocode(D3D11Device& device, ID3D10Blob* microcode) override;
  112. protected:
  113. ID3D11GeometryShader* mGeometryShader;
  114. };
  115. /** Implementation of a DX11 compute shader. */
  116. class BS_D3D11_EXPORT D3D11GpuComputeProgramCore : public D3D11GpuProgramCore
  117. {
  118. public:
  119. ~D3D11GpuComputeProgramCore();
  120. /** Returns internal DX11 compute shader object. */
  121. ID3D11ComputeShader* getComputeShader() const;
  122. protected:
  123. friend class D3D11HLSLProgramFactory;
  124. D3D11GpuComputeProgramCore(const GPU_PROGRAM_DESC& desc, GpuDeviceFlags deviceMask);
  125. /** @copydoc D3D11GpuProgramCore::loadFromMicrocode */
  126. void loadFromMicrocode(D3D11Device& device, ID3D10Blob* microcode) override;
  127. protected:
  128. ID3D11ComputeShader* mComputeShader;
  129. };
  130. /** @} */
  131. }