mirror of
https://github.com/RPCS3/rpcs3.git
synced 2025-02-06 00:40:11 +00:00
d3d12: Use ring like buffer for vertex index data
This commit is contained in:
parent
f721f2cbaa
commit
6bb5dd2125
@ -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();
|
||||
|
@ -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);
|
||||
}
|
||||
|
@ -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
|
||||
{
|
||||
|
Loading…
x
Reference in New Issue
Block a user