#pragma once #include "Betriebssystem.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 { protected: void *data; bool changed; int len; int elLen; int ref; 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 __declspec( dllexport ) DXBuffer( int eLen ); //! Destruktor __declspec( dllexport ) virtual ~DXBuffer(); //! Setzt den geändert fläg, so das beim nächsten auruf von 'kopieren' die daten neu kopiert werden __declspec( dllexport ) void setChanged(); //! Ändert die länge des Buffers beim nächsten aufruf von 'kopieren' //! \param len Die Länge in Bytes __declspec( dllexport ) void setLength( int len ); //! Legt fest, was beim nächsten aufruf von 'kopieren' kopiert wird //! \param data Ein zeiger auf die Daten __declspec( dllexport ) void setData( void *data ); //! Kopiert die Daten in den Buffer, fals sie sich verändert haben __declspec( dllexport ) virtual void copieren( int byteCount = -1 ) = 0; //! Gibt die Länge eines Elementes in bytes zurück __declspec( dllexport ) int getElementLength() const; //! Gibt die Anzahl der Elemente im Buffer zurück __declspec( dllexport ) int getElementAnzahl() const; //! Erhöht den Reference Counting Zähler. //! \return this. __declspec( dllexport ) DXBuffer *getThis(); //! Verringert den Reference Counting Zähler. Wenn der Zähler 0 erreicht, wird das Zeichnung automatisch gelöscht. //! \return 0. __declspec( dllexport ) virtual DXBuffer *release(); }; #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 __declspec( dllexport ) DX11Buffer( int eSize, ID3D11Device *device, ID3D11DeviceContext *context, int bindFlags ); //! Destruktor __declspec( dllexport ) virtual ~DX11Buffer(); //! Kopiert die Daten in den Buffer, fals sie sich verändert haben __declspec( dllexport ) void copieren( int byteCount = -1 ) override; //! Gibt den Buffer zurück __declspec( 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 __declspec( dllexport ) DX11StructuredBuffer( int eSize, ID3D11Device *device, ID3D11DeviceContext *context ); //! Destruktor __declspec( dllexport ) virtual ~DX11StructuredBuffer(); //! Kopiert die Daten in den Buffer, fals sie sich verändert haben __declspec( dllexport ) void copieren( int byteCount = -1 ) override; //! Gibt die verwendtete Shader Resource View zurück __declspec( 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 __declspec( dllexport ) DX12Buffer( int eSize, ID3D12Device2 *device, ID3D12GraphicsCommandList2 *list, int bindFlags ); //! Destruktor __declspec( dllexport ) virtual ~DX12Buffer(); //! Kopiert die Daten in den Buffer, fals sie sich verändert haben __declspec( dllexport ) void copieren( int byteCount = -1 ) override; //! Gibt den Buffer zurück __declspec( 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 __declspec( 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 __declspec( dllexport ) void copieren( int byteCount = -1 ) override; }; #endif }