diff --git a/rpcs3/Emu/RSX/D3D12/D3D12Buffer.cpp b/rpcs3/Emu/RSX/D3D12/D3D12Buffer.cpp index 72ca461ddb..799431ea70 100644 --- a/rpcs3/Emu/RSX/D3D12/D3D12Buffer.cpp +++ b/rpcs3/Emu/RSX/D3D12/D3D12Buffer.cpp @@ -168,7 +168,7 @@ bool overlaps(const std::pair &range1, const std::pair FormatVertexData(const RSXVertexData *m_vertex_data, size_t base_offset) +std::vector FormatVertexData(const RSXVertexData *m_vertex_data, size_t *vertex_data_size, size_t base_offset) { std::vector Result; for (size_t i = 0; i < 32; ++i) @@ -176,7 +176,7 @@ std::vector FormatVertexData(const RSXVertexData *m_vertex_d const RSXVertexData &vertexData = m_vertex_data[i]; if (!vertexData.IsEnabled()) continue; - size_t elementCount = vertexData.data.size() / (vertexData.size * vertexData.GetTypeSize()); + size_t elementCount = vertex_data_size[i] / (vertexData.size * vertexData.GetTypeSize()); // If there is a single element, stride is 0, use the size of element instead size_t stride = vertexData.stride; size_t elementSize = vertexData.GetTypeSize(); @@ -281,7 +281,7 @@ isContained(const std::vector > &ranges, const std::pair D3D12GSRender::UploadVertexBuffers(bool indexed_draw) { std::vector result; - const std::vector &vertexBufferFormat = FormatVertexData(m_vertex_data, m_vertex_data_base_offset); + const std::vector &vertexBufferFormat = FormatVertexData(m_vertex_data, m_vertexBufferSize, m_vertex_data_base_offset); m_IASet = getIALayout(m_device.Get(), vertexBufferFormat, m_vertex_data, m_vertex_data_base_offset); const u32 data_offset = indexed_draw ? 0 : m_draw_array_first; diff --git a/rpcs3/Emu/RSX/D3D12/D3D12GSRender.cpp b/rpcs3/Emu/RSX/D3D12/D3D12GSRender.cpp index a50c5c3e83..c8893c8c8b 100644 --- a/rpcs3/Emu/RSX/D3D12/D3D12GSRender.cpp +++ b/rpcs3/Emu/RSX/D3D12/D3D12GSRender.cpp @@ -475,7 +475,6 @@ void D3D12GSRender::Draw() std::chrono::time_point vertexIndexDurationStart = std::chrono::system_clock::now(); // Init vertex count - // TODO: Very hackish, clean this if (m_indexed_array.m_count) { for (u32 i = 0; i < m_vertex_count; ++i) @@ -484,7 +483,7 @@ void D3D12GSRender::Draw() if (!m_vertex_data[i].addr) continue; const u32 tsize = m_vertex_data[i].GetTypeSize(); - m_vertex_data[i].data.resize((m_indexed_array.index_min + m_indexed_array.index_max - m_indexed_array.index_min + 1) * tsize * m_vertex_data[i].size); + m_vertexBufferSize[i] = (m_indexed_array.index_min + m_indexed_array.index_max - m_indexed_array.index_min + 1) * tsize * m_vertex_data[i].size; } } else @@ -495,7 +494,7 @@ void D3D12GSRender::Draw() if (!m_vertex_data[i].addr) continue; const u32 tsize = m_vertex_data[i].GetTypeSize(); - m_vertex_data[i].data.resize((m_draw_array_first + m_draw_array_count) * tsize * m_vertex_data[i].size); + m_vertexBufferSize[i] = (m_draw_array_first + m_draw_array_count) * tsize * m_vertex_data[i].size; } } diff --git a/rpcs3/Emu/RSX/D3D12/D3D12GSRender.h b/rpcs3/Emu/RSX/D3D12/D3D12GSRender.h index f03064fa43..ca12d0618b 100644 --- a/rpcs3/Emu/RSX/D3D12/D3D12GSRender.h +++ b/rpcs3/Emu/RSX/D3D12/D3D12GSRender.h @@ -232,6 +232,8 @@ private: PipelineStateObjectCache m_cachePSO; std::pair *m_PSO; + size_t m_vertexBufferSize[32]; + struct { size_t m_drawCallDuration;