#pragma once
#include "DXBuffer.h"

struct ID3D12Resource;
struct ID3D12Device;
struct D3D12_RESOURCE_DESC;
struct ID3D12GraphicsCommandList;

namespace Framework
{
    //! Ein Buffer mit Daten im Grafikspeicher
    class DX12Buffer : public DXBuffer
    {
    protected:
        D3D12_RESOURCE_DESC* description;
        ID3D12Resource* buffer;
        ID3D12Resource* intermediate;
        ID3D12Device* device;
        ID3D12GraphicsCommandList* list;
    public:
        //! Konstruktor
        //! eSize: Die Länge eines Elementes in Bytes
        DLLEXPORT DX12Buffer( int eSize, ID3D12Device* device, ID3D12GraphicsCommandList* 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, ID3D12Device* 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, ID3D12Device* 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;
    };
}