Shader.h 9.3 KB

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