#pragma once #include "DX12Buffer.h" #include "d3dx12.h" #include "DX12CommandQueue.h" using namespace Framework; // Konstruktor // eSize: Die Länge eines Elementes in Bytes DX12Buffer::DX12Buffer( int eSize, ID3D12Device* device, ID3D12GraphicsCommandList* list, int flags) : DXBuffer(eSize), buffer(0), intermediate(0), device(device), list(list) { description = new D3D12_RESOURCE_DESC(); ZeroMemory(description, sizeof(D3D12_RESOURCE_DESC)); description->Dimension = D3D12_RESOURCE_DIMENSION_BUFFER; description->Height = 1; description->DepthOrArraySize = 1; description->MipLevels = 1; description->Format = DXGI_FORMAT_UNKNOWN; description->SampleDesc.Count = 1; description->Layout = D3D12_TEXTURE_LAYOUT_ROW_MAJOR; description->Flags = (D3D12_RESOURCE_FLAGS)flags; } // Destruktor DX12Buffer::~DX12Buffer() { if (intermediate) intermediate->Release(); if (buffer) buffer->Release(); delete description; } // Kopiert die Daten in den Buffer, fals sie sich verändert haben void DX12Buffer::copieren(int byteCount) { if (!len) return; if (byteCount < 0) byteCount = len; if (description->Width < len) { if (intermediate) intermediate->Release(); if (buffer) buffer->Release(); buffer = 0; description->Width = len; } if (!buffer) { D3D12_HEAP_PROPERTIES hprop; hprop.Type = D3D12_HEAP_TYPE_UPLOAD; hprop.CPUPageProperty = D3D12_CPU_PAGE_PROPERTY_UNKNOWN; hprop.MemoryPoolPreference = D3D12_MEMORY_POOL_UNKNOWN; hprop.CreationNodeMask = 1; hprop.VisibleNodeMask = 1; device->CreateCommittedResource(&hprop, D3D12_HEAP_FLAG_NONE, description, D3D12_RESOURCE_STATE_GENERIC_READ, 0, __uuidof(ID3D12Resource), (void**)&buffer); hprop.Type = D3D12_HEAP_TYPE_UPLOAD; device->CreateCommittedResource(&hprop, D3D12_HEAP_FLAG_NONE, description, D3D12_RESOURCE_STATE_GENERIC_READ, 0, __uuidof(ID3D12Resource), (void**)&intermediate); if (data) changed = 1; } if (changed && data) { BYTE* pData; D3D12_RANGE r; r.Begin = 0; r.End = 0; buffer->Map(0, &r, (void**)&pData); memcpy(pData, data, byteCount); r.End = byteCount; buffer->Unmap(0, &r); // list->CopyBufferRegion( buffer, 0, intermediate, 0, len ); changed = 0; } } // Gibt den Buffer zurück ID3D12Resource* DX12Buffer::zBuffer() const { return buffer; } DX12IndexBuffer::DX12IndexBuffer(int eSize, ID3D12Device* device, DX12CopyCommandQueue* copy, DX12DirectCommandQueue* direct) : DX12Buffer( eSize, device, copy->getCommandList(), D3D12_RESOURCE_FLAG_NONE), copy(copy), direct(direct) { ibs = 0; } DX12IndexBuffer::~DX12IndexBuffer() {} // Kopiert die Daten in den Buffer, fals sie sich verändert haben void DX12IndexBuffer::copieren(int byteCount) { /*if( ibs ) { D3D12_RESOURCE_BARRIER barrier; barrier.Type = D3D12_RESOURCE_BARRIER_TYPE_TRANSITION; barrier.Transition.pResource = buffer; barrier.Transition.StateBefore = D3D12_RESOURCE_STATE_INDEX_BUFFER; barrier.Transition.StateAfter = D3D12_RESOURCE_STATE_COPY_DEST; barrier.Transition.Subresource = 0; barrier.Flags = D3D12_RESOURCE_BARRIER_FLAG_NONE; direct->getCommandList()->ResourceBarrier( 1, &barrier ); direct->execute(); ibs = 0; }*/ DX12Buffer::copieren(byteCount); // copy->execute(); /*D3D12_RESOURCE_BARRIER barrier; barrier.Type = D3D12_RESOURCE_BARRIER_TYPE_TRANSITION; barrier.Transition.pResource = buffer; barrier.Transition.StateBefore = D3D12_RESOURCE_STATE_COPY_DEST; barrier.Transition.StateAfter = D3D12_RESOURCE_STATE_INDEX_BUFFER; barrier.Transition.Subresource = 0; barrier.Flags = D3D12_RESOURCE_BARRIER_FLAG_NONE; direct->getCommandList()->ResourceBarrier( 1, &barrier ); direct->execute(); ibs = 1;*/ } DX12VertexBuffer::DX12VertexBuffer(int eSize, ID3D12Device* device, DX12CopyCommandQueue* copy, DX12DirectCommandQueue* direct) : DX12Buffer( eSize, device, copy->getCommandList(), D3D12_RESOURCE_FLAG_NONE), copy(copy), direct(direct) { vbs = 0; } DX12VertexBuffer::~DX12VertexBuffer() {} // Kopiert die Daten in den Buffer, fals sie sich verändert haben void DX12VertexBuffer::copieren(int byteCount) { /*if( vbs ) { D3D12_RESOURCE_BARRIER barrier; barrier.Type = D3D12_RESOURCE_BARRIER_TYPE_TRANSITION; barrier.Transition.pResource = buffer; barrier.Transition.StateBefore = D3D12_RESOURCE_STATE_VERTEX_AND_CONSTANT_BUFFER; barrier.Transition.StateAfter = D3D12_RESOURCE_STATE_COPY_DEST; barrier.Transition.Subresource = 0; barrier.Flags = D3D12_RESOURCE_BARRIER_FLAG_NONE; direct->getCommandList()->ResourceBarrier( 1, &barrier ); direct->execute(); vbs = 0; }*/ DX12Buffer::copieren(byteCount); // copy->execute(); /*D3D12_RESOURCE_BARRIER barrier; barrier.Type = D3D12_RESOURCE_BARRIER_TYPE_TRANSITION; barrier.Transition.pResource = buffer; barrier.Transition.StateBefore = D3D12_RESOURCE_STATE_COPY_DEST; barrier.Transition.StateAfter = D3D12_RESOURCE_STATE_VERTEX_AND_CONSTANT_BUFFER; barrier.Transition.Subresource = 0; barrier.Flags = D3D12_RESOURCE_BARRIER_FLAG_NONE; direct->getCommandList()->ResourceBarrier( 1, &barrier ); direct->execute(); vbs = 1;*/ }