d3d12: Use openMP for vertex buffer mapping and factorize function

This commit is contained in:
vlj 2015-06-04 22:43:57 +02:00 committed by Vincent Lejeune
parent 459ab17d74
commit 694d4e01a0

View file

@ -183,25 +183,19 @@ std::vector<VertexBufferFormat> FormatVertexData(RSXVertexData *m_vertex_data)
return Result; return Result;
} }
std::pair<std::vector<D3D12_VERTEX_BUFFER_VIEW>, D3D12_INDEX_BUFFER_VIEW> D3D12GSRender::EnableVertexData(bool indexed_draw) /**
* Create a new vertex buffer with attributes from vbf using vertexIndexHeap as storage heap.
*/
static
ID3D12Resource *createVertexBuffer(const VertexBufferFormat &vbf, const RSXVertexData *vertexData, ID3D12Device *device, DataHeap &vertexIndexHeap)
{ {
std::pair<std::vector<D3D12_VERTEX_BUFFER_VIEW>, D3D12_INDEX_BUFFER_VIEW> result;
const std::vector<VertexBufferFormat> &vertexBufferFormat = FormatVertexData(m_vertex_data);
m_IASet = getIALayout(m_device, vertexBufferFormat, m_vertex_data);
const u32 data_offset = indexed_draw ? 0 : m_draw_array_first;
for (size_t buffer = 0; buffer < vertexBufferFormat.size(); buffer++)
{
const VertexBufferFormat &vbf = vertexBufferFormat[buffer];
size_t subBufferSize = vbf.range.second - vbf.range.first; size_t subBufferSize = vbf.range.second - vbf.range.first;
assert(m_vertexIndexData.canAlloc(subBufferSize)); assert(vertexIndexHeap.canAlloc(subBufferSize));
size_t heapOffset = m_vertexIndexData.alloc(subBufferSize); size_t heapOffset = vertexIndexHeap.alloc(subBufferSize);
ID3D12Resource *vertexBuffer; ID3D12Resource *vertexBuffer;
check(m_device->CreatePlacedResource( check(device->CreatePlacedResource(
m_vertexIndexData.m_heap, vertexIndexHeap.m_heap,
heapOffset, heapOffset,
&getBufferResourceDesc(subBufferSize), &getBufferResourceDesc(subBufferSize),
D3D12_RESOURCE_STATE_GENERIC_READ, D3D12_RESOURCE_STATE_GENERIC_READ,
@ -211,15 +205,16 @@ std::pair<std::vector<D3D12_VERTEX_BUFFER_VIEW>, D3D12_INDEX_BUFFER_VIEW> D3D12G
void *bufferMap; void *bufferMap;
check(vertexBuffer->Map(0, nullptr, (void**)&bufferMap)); check(vertexBuffer->Map(0, nullptr, (void**)&bufferMap));
for (unsigned vertex = 0; vertex < vbf.elementCount; vertex++) #pragma omp parallel for
for (int vertex = 0; vertex < vbf.elementCount; vertex++)
{ {
for (size_t attributeId : vbf.attributeId) for (size_t attributeId : vbf.attributeId)
{ {
if (!m_vertex_data[attributeId].addr) continue; if (!vertexData[attributeId].addr) continue;
size_t baseOffset = m_vertex_data[attributeId].addr - vbf.range.first; size_t baseOffset = vertexData[attributeId].addr - vbf.range.first;
size_t tsize = m_vertex_data[attributeId].GetTypeSize(); size_t tsize = vertexData[attributeId].GetTypeSize();
size_t size = m_vertex_data[attributeId].size; size_t size = vertexData[attributeId].size;
auto src = vm::get_ptr<const u8>(m_vertex_data[attributeId].addr + vbf.stride * vertex); auto src = vm::get_ptr<const u8>(vertexData[attributeId].addr + vbf.stride * vertex);
char* dst = (char*)bufferMap + baseOffset + vbf.stride * vertex; char* dst = (char*)bufferMap + baseOffset + vbf.stride * vertex;
switch (tsize) switch (tsize)
@ -250,7 +245,24 @@ std::pair<std::vector<D3D12_VERTEX_BUFFER_VIEW>, D3D12_INDEX_BUFFER_VIEW> D3D12G
} }
vertexBuffer->Unmap(0, nullptr); vertexBuffer->Unmap(0, nullptr);
m_vertexIndexData.m_resourceStoredSinceLastSync.push_back(std::make_tuple(heapOffset, subBufferSize, vertexBuffer)); vertexIndexHeap.m_resourceStoredSinceLastSync.push_back(std::make_tuple(heapOffset, subBufferSize, vertexBuffer));
return vertexBuffer;
}
std::pair<std::vector<D3D12_VERTEX_BUFFER_VIEW>, D3D12_INDEX_BUFFER_VIEW> D3D12GSRender::EnableVertexData(bool indexed_draw)
{
std::pair<std::vector<D3D12_VERTEX_BUFFER_VIEW>, D3D12_INDEX_BUFFER_VIEW> result;
const std::vector<VertexBufferFormat> &vertexBufferFormat = FormatVertexData(m_vertex_data);
m_IASet = getIALayout(m_device, vertexBufferFormat, m_vertex_data);
const u32 data_offset = indexed_draw ? 0 : m_draw_array_first;
for (size_t buffer = 0; buffer < vertexBufferFormat.size(); buffer++)
{
const VertexBufferFormat &vbf = vertexBufferFormat[buffer];
size_t subBufferSize = vbf.range.second - vbf.range.first;
ID3D12Resource *vertexBuffer = createVertexBuffer(vbf, m_vertex_data, m_device, m_vertexIndexData);
D3D12_VERTEX_BUFFER_VIEW vertexBufferView = {}; D3D12_VERTEX_BUFFER_VIEW vertexBufferView = {};
vertexBufferView.BufferLocation = vertexBuffer->GetGPUVirtualAddress(); vertexBufferView.BufferLocation = vertexBuffer->GetGPUVirtualAddress();