DXBuffer.cpp 4.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189
  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. changed = 1;
  33. }
  34. // Legt fest, was beim nächsten aufruf von 'kopieren' kopiert wird
  35. // data: Ein zeiger auf die Daten
  36. void DXBuffer::setData( void *data )
  37. {
  38. this->data = data;
  39. changed = 1;
  40. }
  41. // Gibt die Länge eines Elementes in bytes zurück
  42. int DXBuffer::getElementLength() const
  43. {
  44. return elLen;
  45. }
  46. // Gibt die Anzahl der Elemente im Buffer zurück
  47. int DXBuffer::getElementAnzahl() const
  48. {
  49. return len / elLen;
  50. }
  51. // Erhöht den Reference Counting Zähler.
  52. // return: this.
  53. DXBuffer *DXBuffer::getThis()
  54. {
  55. ref++;
  56. return this;
  57. }
  58. // Verringert den Reference Counting Zähler. Wenn der Zähler 0 erreicht, wird das Zeichnung automatisch gelöscht.
  59. // return: 0.
  60. DXBuffer *DXBuffer::release()
  61. {
  62. ref--;
  63. if( !ref )
  64. delete this;
  65. return 0;
  66. }
  67. #ifdef WIN32
  68. // Inhalt der DXVertexBuffer Klasse
  69. // Konstruktor
  70. // eSize: Die Länge eines Elementes in Bytes
  71. DX11Buffer::DX11Buffer( int eSize, ID3D11Device *device, ID3D11DeviceContext *context, int bindFlags )
  72. : DXBuffer( eSize )
  73. {
  74. buffer = 0;
  75. description = new D3D11_BUFFER_DESC();
  76. memset( description, 0, sizeof( description ) );
  77. description->Usage = D3D11_USAGE_DYNAMIC;
  78. description->CPUAccessFlags = D3D11_CPU_ACCESS_WRITE;
  79. description->BindFlags = bindFlags;
  80. this->device = device;
  81. this->context = context;
  82. }
  83. // Destruktor
  84. DX11Buffer::~DX11Buffer()
  85. {
  86. if( buffer )
  87. buffer->Release();
  88. delete description;
  89. }
  90. // Kopiert die Daten in den Buffer, fals sie sich verändert haben
  91. // zRObj: Das Objekt, mit dem die Grafikkarte angesprochen wird
  92. void DX11Buffer::copieren()
  93. {
  94. if( !changed || !len || !data )
  95. return;
  96. if( description->ByteWidth != (unsigned)len )
  97. {
  98. if( buffer )
  99. buffer->Release();
  100. buffer = 0;
  101. }
  102. if( !buffer )
  103. {
  104. D3D11_SUBRESOURCE_DATA ini;
  105. memset( &ini, 0, sizeof( ini ) );
  106. ini.pSysMem = data;
  107. description->ByteWidth = len;
  108. device->CreateBuffer( description, &ini, &buffer );
  109. }
  110. else if( changed )
  111. {
  112. D3D11_MAPPED_SUBRESOURCE map;
  113. context->Map( buffer, 0, D3D11_MAP::D3D11_MAP_WRITE_DISCARD, 0, &map );
  114. memcpy( map.pData, data, len );
  115. context->Unmap( buffer, 0 );
  116. changed = 0;
  117. }
  118. }
  119. // Gibt den Buffer zurück
  120. ID3D11Buffer *DX11Buffer::zBuffer() const
  121. {
  122. return buffer;
  123. }
  124. // Inhalt der DXStructuredBuffer Klasse
  125. // Konstruktor
  126. // eSize: Die Länge eines Elementes in Bytes
  127. DX11StructuredBuffer::DX11StructuredBuffer( int eSize, ID3D11Device *device, ID3D11DeviceContext *context )
  128. : DX11Buffer( eSize, device, context, D3D11_BIND_UNORDERED_ACCESS | D3D11_BIND_SHADER_RESOURCE )
  129. {
  130. description->MiscFlags = D3D11_RESOURCE_MISC_BUFFER_STRUCTURED;
  131. description->StructureByteStride = eSize;
  132. description->Usage = D3D11_USAGE_DEFAULT;
  133. view = 0;
  134. }
  135. // Destruktor
  136. DX11StructuredBuffer::~DX11StructuredBuffer()
  137. {
  138. if( view )
  139. view->Release();
  140. }
  141. // Kopiert die Daten in den Buffer, fals sie sich verändert haben
  142. // zRObj: Das Objekt, mit dem die Grafikkarte angesprochen wird
  143. void DX11StructuredBuffer::copieren()
  144. {
  145. ID3D11Buffer *old = buffer;
  146. DX11Buffer::copieren();
  147. if( buffer != old )
  148. {
  149. if( view )
  150. view->Release();
  151. D3D11_SHADER_RESOURCE_VIEW_DESC desc = {};
  152. desc.ViewDimension = D3D11_SRV_DIMENSION_BUFFEREX;
  153. desc.BufferEx.FirstElement = 0;
  154. desc.Format = DXGI_FORMAT_UNKNOWN;
  155. desc.BufferEx.NumElements = description->ByteWidth / description->StructureByteStride;
  156. device->CreateShaderResourceView( buffer, &desc, &view );
  157. }
  158. }
  159. // Gibt die verwendtete Shader Resource View zurück
  160. DX11StructuredBuffer::operator ID3D11ShaderResourceView *( ) const
  161. {
  162. return view;
  163. }
  164. #endif