#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 Render3D; // Eine Schnittstelle zwischen dem Arbeitsspeicher und dem Grafikspeicher class DXBuffer { protected: void *data; bool changed; int len; int elLen; int ref; public: // Konstruktor // bind: Der verwendungszweck des Buffers. Beispiel: D3D11_BIND_INDEX_BUFFER, D3D11_BIND_VERTEX_BUFFER. // 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' // len: Die Länge in Bytes __declspec( dllexport ) void setLength( int len ); // Legt fest, was beim nächsten aufruf von 'kopieren' kopiert wird // 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; }; #endif }