Shader.h 8.9 KB

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