d3d12: Use ring like buffer for vertex index data

This commit is contained in:
vlj 2015-06-01 23:46:04 +02:00 committed by Vincent Lejeune
parent f721f2cbaa
commit 6bb5dd2125
3 changed files with 22 additions and 29 deletions

View File

@ -194,15 +194,15 @@ std::pair<std::vector<D3D12_VERTEX_BUFFER_VIEW>, D3D12_INDEX_BUFFER_VIEW> D3D12G
for (size_t buffer = 0; buffer < vertexBufferFormat.size(); buffer++)
{
const VertexBufferFormat &vbf = vertexBufferFormat[buffer];
// 65536 alignment
size_t bufferHeapOffset = m_perFrameStorage.m_vertexIndexBuffersHeapFreeSpace;
bufferHeapOffset = (bufferHeapOffset + 65536 - 1) & ~65535;
size_t subBufferSize = vbf.range.second - vbf.range.first;
assert(m_vertexIndexData.canAlloc(subBufferSize));
size_t heapOffset = m_vertexIndexData.alloc(subBufferSize);
ID3D12Resource *vertexBuffer;
check(m_device->CreatePlacedResource(
m_perFrameStorage.m_vertexIndexBuffersHeap,
bufferHeapOffset,
m_vertexIndexData.m_heap,
heapOffset,
&getBufferResourceDesc(subBufferSize),
D3D12_RESOURCE_STATE_GENERIC_READ,
nullptr,
@ -250,14 +250,13 @@ std::pair<std::vector<D3D12_VERTEX_BUFFER_VIEW>, D3D12_INDEX_BUFFER_VIEW> D3D12G
}
vertexBuffer->Unmap(0, nullptr);
m_perFrameStorage.m_inflightResources.push_back(vertexBuffer);
m_vertexIndexData.m_resourceStoredSinceLastSync.push_back(std::make_tuple(heapOffset, subBufferSize, vertexBuffer));
D3D12_VERTEX_BUFFER_VIEW vertexBufferView = {};
vertexBufferView.BufferLocation = vertexBuffer->GetGPUVirtualAddress();
vertexBufferView.SizeInBytes = (UINT)subBufferSize;
vertexBufferView.StrideInBytes = (UINT)vbf.stride;
result.first.push_back(vertexBufferView);
m_perFrameStorage.m_vertexIndexBuffersHeapFreeSpace = bufferHeapOffset + subBufferSize;
}
// Only handle quads now
@ -313,14 +312,14 @@ std::pair<std::vector<D3D12_VERTEX_BUFFER_VIEW>, D3D12_INDEX_BUFFER_VIEW> D3D12G
else
indexCount = m_draw_array_count * 6 / 4;
size_t subBufferSize = powerOf2Align(indexCount * indexSize, 64);
// 65536 alignment
size_t bufferHeapOffset = m_perFrameStorage.m_vertexIndexBuffersHeapFreeSpace;
bufferHeapOffset = (bufferHeapOffset + 65536 - 1) & ~65535;
assert(m_vertexIndexData.canAlloc(subBufferSize));
size_t heapOffset = m_vertexIndexData.alloc(subBufferSize);
ID3D12Resource *indexBuffer;
check(m_device->CreatePlacedResource(
m_perFrameStorage.m_vertexIndexBuffersHeap,
bufferHeapOffset,
m_vertexIndexData.m_heap,
heapOffset,
&getBufferResourceDesc(subBufferSize),
D3D12_RESOURCE_STATE_GENERIC_READ,
nullptr,
@ -359,9 +358,7 @@ std::pair<std::vector<D3D12_VERTEX_BUFFER_VIEW>, D3D12_INDEX_BUFFER_VIEW> D3D12G
}
}
indexBuffer->Unmap(0, nullptr);
m_perFrameStorage.m_inflightResources.push_back(indexBuffer);
m_perFrameStorage.m_vertexIndexBuffersHeapFreeSpace = bufferHeapOffset + subBufferSize;
m_vertexIndexData.m_resourceStoredSinceLastSync.push_back(std::make_tuple(heapOffset, subBufferSize, indexBuffer));
indexBufferView.SizeInBytes = (UINT)subBufferSize;
indexBufferView.BufferLocation = indexBuffer->GetGPUVirtualAddress();

View File

@ -81,7 +81,6 @@ void DataHeap::Release()
void D3D12GSRender::ResourceStorage::Reset()
{
m_vertexIndexBuffersHeapFreeSpace = 0;
m_constantsBufferIndex = 0;
m_currentScaleOffsetBufferIndex = 0;
m_currentStorageOffset = 0;
@ -105,14 +104,6 @@ void D3D12GSRender::ResourceStorage::Init(ID3D12Device *device)
device->CreateCommandAllocator(D3D12_COMMAND_LIST_TYPE_DIRECT, IID_PPV_ARGS(&m_textureUploadCommandAllocator));
check(device->CreateCommandAllocator(D3D12_COMMAND_LIST_TYPE_COPY, IID_PPV_ARGS(&m_downloadCommandAllocator)));
// Create heap for vertex and constants buffers
D3D12_HEAP_DESC vertexBufferHeapDesc = {};
// 16 MB wide
vertexBufferHeapDesc.SizeInBytes = 1024 * 1024 * 128;
vertexBufferHeapDesc.Flags = D3D12_HEAP_FLAG_ALLOW_ONLY_BUFFERS;
vertexBufferHeapDesc.Properties.Type = D3D12_HEAP_TYPE_UPLOAD;
check(device->CreateHeap(&vertexBufferHeapDesc, IID_PPV_ARGS(&m_vertexIndexBuffersHeap)));
D3D12_DESCRIPTOR_HEAP_DESC descriptorHeapDesc = {};
descriptorHeapDesc.Flags = D3D12_DESCRIPTOR_HEAP_FLAG_SHADER_VISIBLE;
descriptorHeapDesc.NumDescriptors = 10000; // For safety
@ -154,7 +145,6 @@ void D3D12GSRender::ResourceStorage::Release()
m_constantsBufferDescriptorsHeap->Release();
m_scaleOffsetDescriptorHeap->Release();
m_vertexIndexBuffersHeap->Release();
for (auto tmp : m_inflightResources)
tmp->Release();
m_textureDescriptorsHeap->Release();
@ -398,11 +388,13 @@ D3D12GSRender::D3D12GSRender()
m_rtts.Init(m_device);
m_constantsData.Init(m_device, 1024 * 1024 * 128, D3D12_HEAP_TYPE_UPLOAD);
m_vertexIndexData.Init(m_device, 1024 * 1024 * 128, D3D12_HEAP_TYPE_UPLOAD);
}
D3D12GSRender::~D3D12GSRender()
{
m_constantsData.Release();
m_vertexIndexData.Release();
m_UAVHeap.m_heap->Release();
m_readbackResources.m_heap->Release();
m_texturesRTTs.clear();
@ -941,6 +933,12 @@ void D3D12GSRender::Flip()
m_constantsData.m_getPos = std::get<0>(tmp);
}
m_constantsData.m_resourceStoredSinceLastSync.clear();
for (auto tmp : m_vertexIndexData.m_resourceStoredSinceLastSync)
{
std::get<2>(tmp)->Release();
m_vertexIndexData.m_getPos = std::get<0>(tmp);
}
m_vertexIndexData.m_resourceStoredSinceLastSync.clear();
m_frame->Flip(nullptr);
}

View File

@ -86,10 +86,6 @@ private:
std::vector<ID3D12Resource *> m_inflightResources;
// Vertex storage
size_t m_vertexIndexBuffersHeapFreeSpace;
ID3D12Heap *m_vertexIndexBuffersHeap;
// Constants storage
ID3D12DescriptorHeap *m_constantsBufferDescriptorsHeap;
size_t m_constantsBufferIndex;
@ -113,6 +109,8 @@ private:
// Constants storage
DataHeap m_constantsData;
// Vertex storage
DataHeap m_vertexIndexData;
struct UAVHeap
{