DXBuffer.cpp 4.3 KB

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