Shader.h 9.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212
  1. #pragma once
  2. #include "Array.h"
  3. struct ID3D10Blob;
  4. struct ID3D11PixelShader;
  5. struct ID3D11VertexShader;
  6. struct ID3D11Device;
  7. struct ID3D11DeviceContext;
  8. struct D3D11_INPUT_ELEMENT_DESC;
  9. struct ID3D11Buffer;
  10. struct ID3D11InputLayout;
  11. struct ID3D12Device2;
  12. struct ID3D12GraphicsCommandList2;
  13. struct D3D12_INPUT_ELEMENT_DESC;
  14. struct D3D12_ROOT_PARAMETER1;
  15. struct D3D12_CONSTANT_BUFFER_VIEW_DESC;
  16. namespace Framework
  17. {
  18. class Text;
  19. class DXBuffer;
  20. class DX12CopyCommandQueue;
  21. class DX12DirectCommandQueue;
  22. enum ShaderType
  23. {
  24. UNBEKANNT,
  25. VERTEX,
  26. PIXEL
  27. };
  28. //! Eine Shader Klasse, die alle Constanten Buffers eines Shaders verwaltet
  29. class Shader : public virtual ReferenceCounter
  30. {
  31. protected:
  32. ShaderType type;
  33. RCArray< DXBuffer > *constBuffers;
  34. public:
  35. //! Konstruktor
  36. Shader();
  37. //! Destruktor
  38. virtual ~Shader();
  39. //! Setzt den Compilierten Shader
  40. //! zD3d11Device: Das Device, mit welchem der Shader erstellt werden soll
  41. //! \param bytes Die Bytes des compilierten codes
  42. //! \param length die Länge des bytearrays
  43. //! \return true, wenn bytes gültig ist, false sonst
  44. virtual bool setCompiledByteArray( unsigned char *bytes, int length ) = 0;
  45. //! Nach dem Aufruf dieser Funktion wird dieser Shader als Pixel Shader benutzt
  46. //! zD3d11Context: Das Context Objekt, mit dem der Shader verwendet werden soll
  47. virtual void benutzeShader() = 0;
  48. //! erstellt ein constanten Buffer, der constante daten an den Shader übergibt
  49. //! es können maximal 14 Buffer erstellt werden
  50. //! zD3d11Device: Das Device, mit dem der Buffer erstellt werden soll
  51. //! \param size Die größe des buffers in byte
  52. //! \param index Die position des Buffers im Buffer Array. Bereits vorhanderner Buffer wird ersetzt. Buffer 1 kann nicht erstellt werden, wenn Buffer 0 noch nicht erstellt wurde usw.
  53. virtual bool erstelleConstBuffer( int size, int index ) = 0;
  54. //! Löscht einen constanten Buffer
  55. //! \param index der Index des Buffers, der gelöscht werden soll. Buffer 0 kann nicht gelöscht werden, solange Buffer 1 noch existiert usw.
  56. bool removeConstBuffer( int index );
  57. //! Kopiert daten in einen constanten buffer
  58. //! zD3d11Context: Das Context Objekt, das zum kopieren verwendt werden soll
  59. //! \param data Einen zeiger auf en byte Array der größe des Buffers
  60. //! \param index Der Index des Buffers
  61. //! \param len Die Länge der Daten in Bytes (-1 für die maximale größe des Buffers)
  62. bool füllConstBuffer( char *data, int index, int len = -1 );
  63. //! Gibt die Länge eines constanten Buffers zurück
  64. //! \param index Der Index des Buffers
  65. int getConstBufferLänge( int index ) const;
  66. //! Gibt den Shadertyp zurück
  67. ShaderType getType() const;
  68. };
  69. class DX11Shader : public Shader
  70. {
  71. protected:
  72. ID3D11Device *device;
  73. ID3D11DeviceContext *context;
  74. public:
  75. DX11Shader( ID3D11Device *device, ID3D11DeviceContext *context );
  76. virtual ~DX11Shader();
  77. //! erstellt ein constanten Buffer, der constante daten an den Shader übergibt
  78. //! es können maximal 14 Buffer erstellt werden
  79. //! zD3d11Device: Das Device, mit dem der Buffer erstellt werden soll
  80. //! \param size Die größe des buffers in byte
  81. //! \param index Die position des Buffers im Buffer Array. Bereits vorhanderner Buffer wird ersetzt. Buffer 1 kann nicht erstellt werden, wenn Buffer 0 noch nicht erstellt wurde usw.
  82. virtual bool erstelleConstBuffer( int size, int index ) override;
  83. };
  84. //! Verwaltet einen Pixel Shader
  85. class DX11PixelShader : public DX11Shader
  86. {
  87. private:
  88. ID3D11PixelShader *pixelShader;
  89. public:
  90. //! Konstruktor
  91. DX11PixelShader( ID3D11Device *device, ID3D11DeviceContext *context );
  92. //! Destruktor
  93. ~DX11PixelShader();
  94. //! Setzt den Compilierten Shader
  95. //! zD3d11Device: Das Device, mit welchem der Shader erstellt werden soll
  96. //! \param bytes Die Bytes des compilierten codes
  97. //! \param length die Länge des bytearrays
  98. //! \return true, wenn bytes gültig ist, false sonst
  99. bool setCompiledByteArray( unsigned char *bytes, int length ) override;
  100. //! Nach dem Aufruf dieser Funktion wird dieser Shader als Pixel Shader benutzt
  101. //! zD3d11Context: Das Context Objekt, mit dem der Shader verwendet werden soll
  102. void benutzeShader() override;
  103. };
  104. //! Verwaltet einen Vertex Shader
  105. class DX11VertexShader : public DX11Shader
  106. {
  107. private:
  108. ID3D11VertexShader *vertexShader;
  109. ID3D11InputLayout *inputLayout;
  110. unsigned char *shaderByteBuffer;
  111. int byteBufferSize;
  112. public:
  113. //! Konstruktor
  114. DX11VertexShader( ID3D11Device *device, ID3D11DeviceContext *context );
  115. //! Destruktor
  116. ~DX11VertexShader();
  117. //! Setzt den Compilierten Shader
  118. //! zD3d11Device: Das Device, mit welchem der Shader erstellt werden soll
  119. //! \param bytes Die Bytes des compilierten codes
  120. //! \param length die Länge des bytearrays
  121. //! \return true, wenn bytes gültig ist, false sonst
  122. bool setCompiledByteArray( unsigned char *bytes, int length ) override;
  123. //! erstellt ein InputLayout für den Shader
  124. //! Darf erst nach compile aufgerufen werden
  125. //! zD3d11Device: Das Device, mit dem das Layout erstellt werden soll
  126. //! \param descArray Ein Array mit initialisierungsdaten
  127. //! \param anz Die Anzahl der Elemente im Array
  128. bool erstelleInputLayout( D3D11_INPUT_ELEMENT_DESC *descArray, int anz );
  129. //! Nach dem Aufruf dieser Funktion wird dieser Shader als Vertex Shader benutzt
  130. //! zD3d11Context: Das Context Objekt, mit dem der Shader verwendet werden soll
  131. void benutzeShader() override;
  132. };
  133. class DX12Shader : public Shader
  134. {
  135. protected:
  136. ID3D12Device2 *device;
  137. DX12CopyCommandQueue *copy;
  138. DX12DirectCommandQueue *direct;
  139. unsigned char *shaderByteBuffer;
  140. int byteBufferSize;
  141. public:
  142. DX12Shader( ID3D12Device2 *device, DX12CopyCommandQueue *copy, DX12DirectCommandQueue *direct );
  143. virtual ~DX12Shader();
  144. //! erstellt ein constanten Buffer, der constante daten an den Shader übergibt
  145. //! es können maximal 14 Buffer erstellt werden
  146. //! zD3d11Device: Das Device, mit dem der Buffer erstellt werden soll
  147. //! \param size Die größe des buffers in byte
  148. //! \param index Die position des Buffers im Buffer Array. Bereits vorhanderner Buffer wird ersetzt. Buffer 1 kann nicht erstellt werden, wenn Buffer 0 noch nicht erstellt wurde usw.
  149. virtual bool erstelleConstBuffer( int size, int index ) override;
  150. //! Setzt den Compilierten Shader
  151. //! zD3d11Device: Das Device, mit welchem der Shader erstellt werden soll
  152. //! \param bytes Die Bytes des compilierten codes
  153. //! \param length die Länge des bytearrays
  154. //! \return true, wenn bytes gültig ist, false sonst
  155. bool setCompiledByteArray( unsigned char *bytes, int length ) override;
  156. //! Nach dem Aufruf dieser Funktion wird dieser Shader als Pixel Shader benutzt
  157. //! zD3d11Context: Das Context Objekt, mit dem der Shader verwendet werden soll
  158. void benutzeShader() override;
  159. //! gibt die compilierten bytes zurück
  160. unsigned char *getCompiledShader() const;
  161. //! gitbt die anzahl der compilierten bytes zurück
  162. int getCompiledLength() const;
  163. //! Erstellt den RootParameter zu einem constanten buffer
  164. //! \param index Der Index des Buffers
  165. //! \param view enthält nach dem Aufruf die position und größe des buffers im speicher
  166. virtual void getViewDesc( int index, D3D12_CONSTANT_BUFFER_VIEW_DESC &view );
  167. };
  168. class DX12PixelShader : public DX12Shader
  169. {
  170. public:
  171. DX12PixelShader( ID3D12Device2 *device, DX12CopyCommandQueue *copy, DX12DirectCommandQueue *direct );
  172. };
  173. class DX12VertexShader : public DX12Shader
  174. {
  175. private:
  176. D3D12_INPUT_ELEMENT_DESC *inputLayout;
  177. int inputLayoutSize;
  178. public:
  179. //! Konstruktor
  180. DX12VertexShader( ID3D12Device2 *device, DX12CopyCommandQueue *copy, DX12DirectCommandQueue *direct );
  181. //! Destruktor
  182. ~DX12VertexShader();
  183. //! erstellt ein InputLayout für den Shader
  184. //! Darf erst nach compile aufgerufen werden
  185. //! zD3d11Device: Das Device, mit dem das Layout erstellt werden soll
  186. //! \param descArray Ein Array mit initialisierungsdaten
  187. //! \param anz Die Anzahl der Elemente im Array
  188. bool erstelleInputLayout( D3D12_INPUT_ELEMENT_DESC *descArray, int anz );
  189. //! Gint die Anzahl an eingabeparametern des Shaders zurück
  190. int getInputLayoutSize() const;
  191. //! Gibt eine Liste mit formaten für jeden Eingabewert zurück
  192. D3D12_INPUT_ELEMENT_DESC *zInputLayout() const;
  193. };
  194. }