mirror of
https://github.com/RPCS3/rpcs3.git
synced 2025-08-09 01:29:23 +00:00
d3d12: Use ring like buffer for vertex index data
This commit is contained in:
parent
f721f2cbaa
commit
6bb5dd2125
3 changed files with 22 additions and 29 deletions
|
@ -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++)
|
for (size_t buffer = 0; buffer < vertexBufferFormat.size(); buffer++)
|
||||||
{
|
{
|
||||||
const VertexBufferFormat &vbf = vertexBufferFormat[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;
|
size_t subBufferSize = vbf.range.second - vbf.range.first;
|
||||||
|
assert(m_vertexIndexData.canAlloc(subBufferSize));
|
||||||
|
size_t heapOffset = m_vertexIndexData.alloc(subBufferSize);
|
||||||
|
|
||||||
ID3D12Resource *vertexBuffer;
|
ID3D12Resource *vertexBuffer;
|
||||||
check(m_device->CreatePlacedResource(
|
check(m_device->CreatePlacedResource(
|
||||||
m_perFrameStorage.m_vertexIndexBuffersHeap,
|
m_vertexIndexData.m_heap,
|
||||||
bufferHeapOffset,
|
heapOffset,
|
||||||
&getBufferResourceDesc(subBufferSize),
|
&getBufferResourceDesc(subBufferSize),
|
||||||
D3D12_RESOURCE_STATE_GENERIC_READ,
|
D3D12_RESOURCE_STATE_GENERIC_READ,
|
||||||
nullptr,
|
nullptr,
|
||||||
|
@ -250,14 +250,13 @@ std::pair<std::vector<D3D12_VERTEX_BUFFER_VIEW>, D3D12_INDEX_BUFFER_VIEW> D3D12G
|
||||||
}
|
}
|
||||||
|
|
||||||
vertexBuffer->Unmap(0, nullptr);
|
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 = {};
|
D3D12_VERTEX_BUFFER_VIEW vertexBufferView = {};
|
||||||
vertexBufferView.BufferLocation = vertexBuffer->GetGPUVirtualAddress();
|
vertexBufferView.BufferLocation = vertexBuffer->GetGPUVirtualAddress();
|
||||||
vertexBufferView.SizeInBytes = (UINT)subBufferSize;
|
vertexBufferView.SizeInBytes = (UINT)subBufferSize;
|
||||||
vertexBufferView.StrideInBytes = (UINT)vbf.stride;
|
vertexBufferView.StrideInBytes = (UINT)vbf.stride;
|
||||||
result.first.push_back(vertexBufferView);
|
result.first.push_back(vertexBufferView);
|
||||||
m_perFrameStorage.m_vertexIndexBuffersHeapFreeSpace = bufferHeapOffset + subBufferSize;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
// Only handle quads now
|
// Only handle quads now
|
||||||
|
@ -313,14 +312,14 @@ std::pair<std::vector<D3D12_VERTEX_BUFFER_VIEW>, D3D12_INDEX_BUFFER_VIEW> D3D12G
|
||||||
else
|
else
|
||||||
indexCount = m_draw_array_count * 6 / 4;
|
indexCount = m_draw_array_count * 6 / 4;
|
||||||
size_t subBufferSize = powerOf2Align(indexCount * indexSize, 64);
|
size_t subBufferSize = powerOf2Align(indexCount * indexSize, 64);
|
||||||
// 65536 alignment
|
|
||||||
size_t bufferHeapOffset = m_perFrameStorage.m_vertexIndexBuffersHeapFreeSpace;
|
assert(m_vertexIndexData.canAlloc(subBufferSize));
|
||||||
bufferHeapOffset = (bufferHeapOffset + 65536 - 1) & ~65535;
|
size_t heapOffset = m_vertexIndexData.alloc(subBufferSize);
|
||||||
|
|
||||||
ID3D12Resource *indexBuffer;
|
ID3D12Resource *indexBuffer;
|
||||||
check(m_device->CreatePlacedResource(
|
check(m_device->CreatePlacedResource(
|
||||||
m_perFrameStorage.m_vertexIndexBuffersHeap,
|
m_vertexIndexData.m_heap,
|
||||||
bufferHeapOffset,
|
heapOffset,
|
||||||
&getBufferResourceDesc(subBufferSize),
|
&getBufferResourceDesc(subBufferSize),
|
||||||
D3D12_RESOURCE_STATE_GENERIC_READ,
|
D3D12_RESOURCE_STATE_GENERIC_READ,
|
||||||
nullptr,
|
nullptr,
|
||||||
|
@ -359,9 +358,7 @@ std::pair<std::vector<D3D12_VERTEX_BUFFER_VIEW>, D3D12_INDEX_BUFFER_VIEW> D3D12G
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
indexBuffer->Unmap(0, nullptr);
|
indexBuffer->Unmap(0, nullptr);
|
||||||
m_perFrameStorage.m_inflightResources.push_back(indexBuffer);
|
m_vertexIndexData.m_resourceStoredSinceLastSync.push_back(std::make_tuple(heapOffset, subBufferSize, indexBuffer));
|
||||||
m_perFrameStorage.m_vertexIndexBuffersHeapFreeSpace = bufferHeapOffset + subBufferSize;
|
|
||||||
|
|
||||||
|
|
||||||
indexBufferView.SizeInBytes = (UINT)subBufferSize;
|
indexBufferView.SizeInBytes = (UINT)subBufferSize;
|
||||||
indexBufferView.BufferLocation = indexBuffer->GetGPUVirtualAddress();
|
indexBufferView.BufferLocation = indexBuffer->GetGPUVirtualAddress();
|
||||||
|
|
|
@ -81,7 +81,6 @@ void DataHeap::Release()
|
||||||
|
|
||||||
void D3D12GSRender::ResourceStorage::Reset()
|
void D3D12GSRender::ResourceStorage::Reset()
|
||||||
{
|
{
|
||||||
m_vertexIndexBuffersHeapFreeSpace = 0;
|
|
||||||
m_constantsBufferIndex = 0;
|
m_constantsBufferIndex = 0;
|
||||||
m_currentScaleOffsetBufferIndex = 0;
|
m_currentScaleOffsetBufferIndex = 0;
|
||||||
m_currentStorageOffset = 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));
|
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)));
|
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 = {};
|
D3D12_DESCRIPTOR_HEAP_DESC descriptorHeapDesc = {};
|
||||||
descriptorHeapDesc.Flags = D3D12_DESCRIPTOR_HEAP_FLAG_SHADER_VISIBLE;
|
descriptorHeapDesc.Flags = D3D12_DESCRIPTOR_HEAP_FLAG_SHADER_VISIBLE;
|
||||||
descriptorHeapDesc.NumDescriptors = 10000; // For safety
|
descriptorHeapDesc.NumDescriptors = 10000; // For safety
|
||||||
|
@ -154,7 +145,6 @@ void D3D12GSRender::ResourceStorage::Release()
|
||||||
|
|
||||||
m_constantsBufferDescriptorsHeap->Release();
|
m_constantsBufferDescriptorsHeap->Release();
|
||||||
m_scaleOffsetDescriptorHeap->Release();
|
m_scaleOffsetDescriptorHeap->Release();
|
||||||
m_vertexIndexBuffersHeap->Release();
|
|
||||||
for (auto tmp : m_inflightResources)
|
for (auto tmp : m_inflightResources)
|
||||||
tmp->Release();
|
tmp->Release();
|
||||||
m_textureDescriptorsHeap->Release();
|
m_textureDescriptorsHeap->Release();
|
||||||
|
@ -398,11 +388,13 @@ D3D12GSRender::D3D12GSRender()
|
||||||
m_rtts.Init(m_device);
|
m_rtts.Init(m_device);
|
||||||
|
|
||||||
m_constantsData.Init(m_device, 1024 * 1024 * 128, D3D12_HEAP_TYPE_UPLOAD);
|
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()
|
D3D12GSRender::~D3D12GSRender()
|
||||||
{
|
{
|
||||||
m_constantsData.Release();
|
m_constantsData.Release();
|
||||||
|
m_vertexIndexData.Release();
|
||||||
m_UAVHeap.m_heap->Release();
|
m_UAVHeap.m_heap->Release();
|
||||||
m_readbackResources.m_heap->Release();
|
m_readbackResources.m_heap->Release();
|
||||||
m_texturesRTTs.clear();
|
m_texturesRTTs.clear();
|
||||||
|
@ -941,6 +933,12 @@ void D3D12GSRender::Flip()
|
||||||
m_constantsData.m_getPos = std::get<0>(tmp);
|
m_constantsData.m_getPos = std::get<0>(tmp);
|
||||||
}
|
}
|
||||||
m_constantsData.m_resourceStoredSinceLastSync.clear();
|
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);
|
m_frame->Flip(nullptr);
|
||||||
}
|
}
|
||||||
|
|
|
@ -86,10 +86,6 @@ private:
|
||||||
|
|
||||||
std::vector<ID3D12Resource *> m_inflightResources;
|
std::vector<ID3D12Resource *> m_inflightResources;
|
||||||
|
|
||||||
// Vertex storage
|
|
||||||
size_t m_vertexIndexBuffersHeapFreeSpace;
|
|
||||||
ID3D12Heap *m_vertexIndexBuffersHeap;
|
|
||||||
|
|
||||||
// Constants storage
|
// Constants storage
|
||||||
ID3D12DescriptorHeap *m_constantsBufferDescriptorsHeap;
|
ID3D12DescriptorHeap *m_constantsBufferDescriptorsHeap;
|
||||||
size_t m_constantsBufferIndex;
|
size_t m_constantsBufferIndex;
|
||||||
|
@ -113,6 +109,8 @@ private:
|
||||||
|
|
||||||
// Constants storage
|
// Constants storage
|
||||||
DataHeap m_constantsData;
|
DataHeap m_constantsData;
|
||||||
|
// Vertex storage
|
||||||
|
DataHeap m_vertexIndexData;
|
||||||
|
|
||||||
struct UAVHeap
|
struct UAVHeap
|
||||||
{
|
{
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue