#pragma once #include "Betriebssystem.h" #include "ReferenceCounter.h" #ifdef WIN32 struct ID3D11Buffer; struct D3D11_BUFFER_DESC; struct ID3D11ShaderResourceView; struct ID3D11Device; struct ID3D11DeviceContext; struct ID3D12Resource; struct ID3D12Device2; struct D3D12_RESOURCE_DESC; struct ID3D12GraphicsCommandList2; #endif namespace Framework { class DX12CopyCommandQueue; class DX12DirectCommandQueue; //! Eine Schnittstelle zwischen dem Arbeitsspeicher und dem Grafikspeicher class DXBuffer : public virtual ReferenceCounter { protected: void *data; bool changed; int len; int elLen; public: //! Konstruktor //! \param bind Der verwendungszweck des Buffers. Beispiel: D3D11_BIND_INDEX_BUFFER, D3D11_BIND_VERTEX_BUFFER. //! \param eLen Länge eines einzelnen Elements in Bytes DLLEXPORT DXBuffer( int eLen ); //! Destruktor DLLEXPORT virtual ~DXBuffer(); //! Setzt den geändert fläg, so das beim nächsten auruf von 'kopieren' die daten neu kopiert werden DLLEXPORT void setChanged(); //! Ändert die länge des Buffers beim nächsten aufruf von 'kopieren' //! \param len Die Länge in Bytes DLLEXPORT void setLength( int len ); //! Legt fest, was beim nächsten aufruf von 'kopieren' kopiert wird //! \param data Ein zeiger auf die Daten DLLEXPORT void setData( void *data ); //! Kopiert die Daten in den Buffer, fals sie sich verändert haben DLLEXPORT virtual void copieren( int byteCount = -1 ) = 0; //! Gibt die Länge eines Elementes in bytes zurück DLLEXPORT int getElementLength() const; //! Gibt die Anzahl der Elemente im Buffer zurück DLLEXPORT int getElementAnzahl() const; }; #ifdef WIN32 //! Ein Buffer mit Daten im Grafikspeicher class DX11Buffer : public DXBuffer { protected: D3D11_BUFFER_DESC *description; ID3D11Buffer *buffer; ID3D11Device *device; ID3D11DeviceContext *context; public: //! Konstruktor //! eSize: Die Länge eines Elementes in Bytes DLLEXPORT DX11Buffer( int eSize, ID3D11Device *device, ID3D11DeviceContext *context, int bindFlags ); //! Destruktor DLLEXPORT virtual ~DX11Buffer(); //! Kopiert die Daten in den Buffer, fals sie sich verändert haben DLLEXPORT void copieren( int byteCount = -1 ) override; //! Gibt den Buffer zurück DLLEXPORT ID3D11Buffer *zBuffer() const; }; //! Ein Buffer von Indizes aus dem Buffer mit Eckpunkten, wovon immer drei ein Dreieck ergeben, das gezeichnet wird class DX11StructuredBuffer : public DX11Buffer { private: ID3D11ShaderResourceView *view; public: //! Konstruktor //! eSize: Die Länge eines Elementes in Bytes DLLEXPORT DX11StructuredBuffer( int eSize, ID3D11Device *device, ID3D11DeviceContext *context ); //! Destruktor DLLEXPORT virtual ~DX11StructuredBuffer(); //! Kopiert die Daten in den Buffer, fals sie sich verändert haben DLLEXPORT void copieren( int byteCount = -1 ) override; //! Gibt die verwendtete Shader Resource View zurück DLLEXPORT operator ID3D11ShaderResourceView *() const; }; //! Ein Buffer mit Daten im Grafikspeicher class DX12Buffer : public DXBuffer { protected: D3D12_RESOURCE_DESC *description; ID3D12Resource *buffer; ID3D12Resource *intermediate; ID3D12Device2 *device; ID3D12GraphicsCommandList2 *list; public: //! Konstruktor //! eSize: Die Länge eines Elementes in Bytes DLLEXPORT DX12Buffer( int eSize, ID3D12Device2 *device, ID3D12GraphicsCommandList2 *list, int bindFlags ); //! Destruktor DLLEXPORT virtual ~DX12Buffer(); //! Kopiert die Daten in den Buffer, fals sie sich verändert haben DLLEXPORT void copieren( int byteCount = -1 ) override; //! Gibt den Buffer zurück DLLEXPORT ID3D12Resource *zBuffer() const; }; class DX12IndexBuffer : public DX12Buffer { private: bool ibs; DX12DirectCommandQueue *direct; DX12CopyCommandQueue *copy; public: DX12IndexBuffer( int eSize, ID3D12Device2 *device, DX12CopyCommandQueue *copy, DX12DirectCommandQueue *direct ); ~DX12IndexBuffer(); //! Kopiert die Daten in den Buffer, fals sie sich verändert haben DLLEXPORT void copieren( int byteCount = -1 ) override; }; class DX12VertexBuffer : public DX12Buffer { private: bool vbs; DX12DirectCommandQueue *direct; DX12CopyCommandQueue *copy; public: DX12VertexBuffer( int eSize, ID3D12Device2 *device, DX12CopyCommandQueue *copy, DX12DirectCommandQueue *direct ); ~DX12VertexBuffer(); //! Kopiert die Daten in den Buffer, fals sie sich verändert haben DLLEXPORT void copieren( int byteCount = -1 ) override; }; #endif }