diff --git a/rpcs3/Emu/RSX/D3D12/D3D12Buffer.cpp b/rpcs3/Emu/RSX/D3D12/D3D12Buffer.cpp index 0bf9889d40..d1e2fa258f 100644 --- a/rpcs3/Emu/RSX/D3D12/D3D12Buffer.cpp +++ b/rpcs3/Emu/RSX/D3D12/D3D12Buffer.cpp @@ -194,15 +194,15 @@ std::pair, 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, 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, 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, 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(); diff --git a/rpcs3/Emu/RSX/D3D12/D3D12GSRender.cpp b/rpcs3/Emu/RSX/D3D12/D3D12GSRender.cpp index 4ecec2a8a3..0b69325707 100644 --- a/rpcs3/Emu/RSX/D3D12/D3D12GSRender.cpp +++ b/rpcs3/Emu/RSX/D3D12/D3D12GSRender.cpp @@ -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); } diff --git a/rpcs3/Emu/RSX/D3D12/D3D12GSRender.h b/rpcs3/Emu/RSX/D3D12/D3D12GSRender.h index b6ecd42d1e..48daaaa84e 100644 --- a/rpcs3/Emu/RSX/D3D12/D3D12GSRender.h +++ b/rpcs3/Emu/RSX/D3D12/D3D12GSRender.h @@ -86,10 +86,6 @@ private: std::vector 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 {