| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130 |
- #pragma once
- #include "DX12Buffer.h"
- #include "d3dx12.h"
- #include "DX12CommandQueue.h"
- using namespace Framework;
- // Constructor
- // eSize: length of an element in bytes
- DX12Buffer::DX12Buffer(
- int eSize, ID3D12Device5* zDevice, DX12CommandQueue* queue, int flags)
- : DXBuffer(eSize),
- buffer(0),
- zDevice(zDevice),
- queue(queue),
- currentState(D3D12_RESOURCE_STATE_COMMON)
- {
- description = new D3D12_RESOURCE_DESC();
- ZeroMemory(description, sizeof(D3D12_RESOURCE_DESC));
- description->Dimension = D3D12_RESOURCE_DIMENSION_BUFFER;
- description->Alignment = 0;
- 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;
- }
- // Destructor
- DX12Buffer::~DX12Buffer()
- {
- if (buffer) buffer->Release();
- if (queue) queue->release();
- delete description;
- }
- // Copies the data into the buffer if it has changed
- void DX12Buffer::copyToGPU(__int64 byteCount)
- {
- if (!len) return;
- if (byteCount < 0) byteCount = len;
- if (description->Width != (unsigned)len)
- {
- if (buffer) buffer->Release();
- buffer = 0;
- description->Width = (unsigned)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;
- zDevice->CreateCommittedResource(&hprop,
- D3D12_HEAP_FLAG_NONE,
- description,
- D3D12_RESOURCE_STATE_GENERIC_READ,
- 0,
- __uuidof(ID3D12Resource),
- (void**)&buffer);
- }
- 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);
- changed = 0;
- }
- }
- void Framework::DX12Buffer::createBufferWithoutData(
- D3D12_RESOURCE_STATES states, D3D12_HEAP_TYPE heapType)
- {
- if (!len) return;
- if (description->Width != len)
- {
- if (buffer) buffer->Release();
- buffer = 0;
- description->Width = len;
- }
- if (!buffer)
- {
- D3D12_HEAP_PROPERTIES hprop;
- hprop.Type = heapType;
- hprop.CPUPageProperty = D3D12_CPU_PAGE_PROPERTY_UNKNOWN;
- hprop.MemoryPoolPreference = D3D12_MEMORY_POOL_UNKNOWN;
- hprop.CreationNodeMask = 0;
- hprop.VisibleNodeMask = 0;
- zDevice->CreateCommittedResource(&hprop,
- D3D12_HEAP_FLAG_NONE,
- description,
- states & ~D3D12_RESOURCE_STATE_UNORDERED_ACCESS,
- 0,
- __uuidof(ID3D12Resource),
- (void**)&buffer);
- if (states & D3D12_RESOURCE_STATE_UNORDERED_ACCESS)
- {
- // TODO: add state transition
- CD3DX12_RESOURCE_BARRIER transition
- = CD3DX12_RESOURCE_BARRIER::Transition(
- buffer, D3D12_RESOURCE_STATE_COMMON, states);
- queue->zCommandList()->ResourceBarrier(1, &transition);
- }
- this->currentState = states;
- }
- }
- void Framework::DX12Buffer::transformState(D3D12_RESOURCE_STATES newState)
- {
- CD3DX12_RESOURCE_BARRIER transition
- = CD3DX12_RESOURCE_BARRIER::Transition(buffer, currentState, newState);
- queue->zCommandList()->ResourceBarrier(1, &transition);
- currentState = newState;
- }
- // Returns the buffer
- ID3D12Resource* DX12Buffer::zBuffer() const
- {
- return buffer;
- }
|