DXBuffer.cpp 4.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191
  1. #include "DXBuffer.h"
  2. #include <iostream>
  3. #ifdef WIN32
  4. #include <d3d11.h>
  5. #endif
  6. using namespace Framework;
  7. // Inhalt der DXBuffer Klasse
  8. // Konstruktor
  9. // bind: Der verwendungszweck des Buffers. Beispiel: D3D11_BIND_INDEX_BUFFER, D3D11_BIND_VERTEX_BUFFER.
  10. // eLän: Länge eines einzelnen Elements in Bytes
  11. DXBuffer::DXBuffer( int eLen )
  12. {
  13. data = 0;
  14. changed = 0;
  15. len = 0;
  16. elLen = eLen;
  17. ref = 1;
  18. }
  19. // Destruktor
  20. DXBuffer::~DXBuffer()
  21. {}
  22. // Setzt den geändert fläg, so das beim nächsten auruf von 'kopieren' die daten neu kopiert werden
  23. void DXBuffer::setChanged()
  24. {
  25. changed = 1;
  26. }
  27. // Ändert die länge des Buffers beim nächsten aufruf von 'kopieren'
  28. // län: Die Länge in Bytes
  29. void DXBuffer::setLength( int len )
  30. {
  31. this->len = len;
  32. }
  33. // Legt fest, was beim nächsten aufruf von 'kopieren' kopiert wird
  34. // data: Ein zeiger auf die Daten
  35. void DXBuffer::setData( void *data )
  36. {
  37. this->data = data;
  38. changed = 1;
  39. }
  40. // Gibt die Länge eines Elementes in bytes zurück
  41. int DXBuffer::getElementLength() const
  42. {
  43. return elLen;
  44. }
  45. // Gibt die Anzahl der Elemente im Buffer zurück
  46. int DXBuffer::getElementAnzahl() const
  47. {
  48. return len / elLen;
  49. }
  50. // Erhöht den Reference Counting Zähler.
  51. // return: this.
  52. DXBuffer *DXBuffer::getThis()
  53. {
  54. ref++;
  55. return this;
  56. }
  57. // Verringert den Reference Counting Zähler. Wenn der Zähler 0 erreicht, wird das Zeichnung automatisch gelöscht.
  58. // return: 0.
  59. DXBuffer *DXBuffer::release()
  60. {
  61. ref--;
  62. if( !ref )
  63. delete this;
  64. return 0;
  65. }
  66. #ifdef WIN32
  67. // Inhalt der DX11Buffer Klasse
  68. // Konstruktor
  69. // eSize: Die Länge eines Elementes in Bytes
  70. DX11Buffer::DX11Buffer( int eSize, ID3D11Device *device, ID3D11DeviceContext *context, int bindFlags )
  71. : DXBuffer( eSize )
  72. {
  73. buffer = 0;
  74. description = new D3D11_BUFFER_DESC();
  75. memset( description, 0, sizeof( description ) );
  76. description->Usage = D3D11_USAGE_DYNAMIC;
  77. description->CPUAccessFlags = D3D11_CPU_ACCESS_WRITE;
  78. description->BindFlags = bindFlags;
  79. this->device = device;
  80. this->context = context;
  81. }
  82. // Destruktor
  83. DX11Buffer::~DX11Buffer()
  84. {
  85. if( buffer )
  86. buffer->Release();
  87. delete description;
  88. }
  89. // Kopiert die Daten in den Buffer, fals sie sich verändert haben
  90. // zRObj: Das Objekt, mit dem die Grafikkarte angesprochen wird
  91. void DX11Buffer::copieren( int byteCount )
  92. {
  93. if( !len )
  94. return;
  95. if( byteCount < 0 )
  96. byteCount = len;
  97. if( description->ByteWidth < (unsigned)len )
  98. {
  99. if( buffer )
  100. buffer->Release();
  101. buffer = 0;
  102. }
  103. if( !buffer )
  104. {
  105. description->ByteWidth = len;
  106. device->CreateBuffer( description, 0, &buffer );
  107. if( data )
  108. changed = 1;
  109. }
  110. if( changed )
  111. {
  112. D3D11_MAPPED_SUBRESOURCE map;
  113. if( ( description->Usage | D3D11_USAGE_DYNAMIC ) == description->Usage )
  114. context->Map( buffer, 0, D3D11_MAP::D3D11_MAP_WRITE_DISCARD, 0, &map );
  115. else
  116. context->Map( buffer, 0, D3D11_MAP::D3D11_MAP_WRITE, 0, &map );
  117. memcpy( map.pData, data, byteCount );
  118. context->Unmap( buffer, 0 );
  119. changed = 0;
  120. }
  121. }
  122. // Gibt den Buffer zurück
  123. ID3D11Buffer *DX11Buffer::zBuffer() const
  124. {
  125. return buffer;
  126. }
  127. // Inhalt der DXStructuredBuffer Klasse
  128. // Konstruktor
  129. // eSize: Die Länge eines Elementes in Bytes
  130. DX11StructuredBuffer::DX11StructuredBuffer( int eSize, ID3D11Device *device, ID3D11DeviceContext *context )
  131. : DX11Buffer( eSize, device, context, D3D11_BIND_UNORDERED_ACCESS | D3D11_BIND_SHADER_RESOURCE )
  132. {
  133. description->MiscFlags = D3D11_RESOURCE_MISC_BUFFER_STRUCTURED;
  134. description->StructureByteStride = eSize;
  135. description->Usage = D3D11_USAGE_DEFAULT;
  136. view = 0;
  137. }
  138. // Destruktor
  139. DX11StructuredBuffer::~DX11StructuredBuffer()
  140. {
  141. if( view )
  142. view->Release();
  143. }
  144. // Kopiert die Daten in den Buffer, fals sie sich verändert haben
  145. // zRObj: Das Objekt, mit dem die Grafikkarte angesprochen wird
  146. void DX11StructuredBuffer::copieren( int byteCount )
  147. {
  148. ID3D11Buffer *old = buffer;
  149. DX11Buffer::copieren( byteCount );
  150. if( buffer != old )
  151. {
  152. if( view )
  153. view->Release();
  154. D3D11_SHADER_RESOURCE_VIEW_DESC desc = {};
  155. desc.ViewDimension = D3D11_SRV_DIMENSION_BUFFEREX;
  156. desc.BufferEx.FirstElement = 0;
  157. desc.Format = DXGI_FORMAT_UNKNOWN;
  158. desc.BufferEx.NumElements = description->ByteWidth / description->StructureByteStride;
  159. device->CreateShaderResourceView( buffer, &desc, &view );
  160. }
  161. }
  162. // Gibt die verwendtete Shader Resource View zurück
  163. DX11StructuredBuffer::operator ID3D11ShaderResourceView *( ) const
  164. {
  165. return view;
  166. }
  167. #endif