Shader.h 9.1 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. // bytes: Die Bytes des compilierten codes
  43. // 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. // size: Die größe des buffers in byte
  53. // 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. // 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. // data: Einen zeiger auf en byte Array der größe des Buffers
  61. // index: Der Index des Buffers
  62. // 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. // 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. // 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. // 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. // size: Die größe des buffers in byte
  88. // 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. // bytes: Die Bytes des compilierten codes
  104. // 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. // bytes: Die Bytes des compilierten codes
  127. // 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. // descArray: Ein Array mit initialisierungsdaten
  134. // 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. // size: Die größe des buffers in byte
  155. // 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. // bytes: Die Bytes des compilierten codes
  160. // 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. // index: Der Index des Buffers
  172. // 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. // descArray: Ein Array mit initialisierungsdaten
  194. // 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. }