diff --git a/rpcs3/Emu/RSX/Common/BufferUtils.cpp b/rpcs3/Emu/RSX/Common/BufferUtils.cpp index 4cfb7485e7..ee318c2a05 100644 --- a/rpcs3/Emu/RSX/Common/BufferUtils.cpp +++ b/rpcs3/Emu/RSX/Common/BufferUtils.cpp @@ -648,7 +648,7 @@ u32 get_index_type_size(rsx::index_array_type type) fmt::throw_exception("Wrong index type" HERE); } -void write_index_array_for_non_indexed_non_native_primitive_to_buffer(char* dst, rsx::primitive_type draw_mode, unsigned first, unsigned count) +void write_index_array_for_non_indexed_non_native_primitive_to_buffer(char* dst, rsx::primitive_type draw_mode, unsigned count) { unsigned short *typedDst = (unsigned short *)(dst); switch (draw_mode) diff --git a/rpcs3/Emu/RSX/Common/BufferUtils.h b/rpcs3/Emu/RSX/Common/BufferUtils.h index 63910f5244..0bcf7bd4b8 100644 --- a/rpcs3/Emu/RSX/Common/BufferUtils.h +++ b/rpcs3/Emu/RSX/Common/BufferUtils.h @@ -39,7 +39,7 @@ std::tuple write_index_array_data_to_buffer(gsl::span dst, /** * Write index data needed to emulate non indexed non native primitive mode. */ -void write_index_array_for_non_indexed_non_native_primitive_to_buffer(char* dst, rsx::primitive_type draw_mode, unsigned first, unsigned count); +void write_index_array_for_non_indexed_non_native_primitive_to_buffer(char* dst, rsx::primitive_type draw_mode, unsigned count); /** * Stream a 128 bits vector to dst. diff --git a/rpcs3/Emu/RSX/D3D12/D3D12Buffer.cpp b/rpcs3/Emu/RSX/D3D12/D3D12Buffer.cpp index ed088e2d69..ecda416bde 100644 --- a/rpcs3/Emu/RSX/D3D12/D3D12Buffer.cpp +++ b/rpcs3/Emu/RSX/D3D12/D3D12Buffer.cpp @@ -235,15 +235,13 @@ namespace void* mapped_buffer = m_buffer_data.map(CD3DX12_RANGE(heap_offset, heap_offset + buffer_size)); - size_t first = 0; - for (const auto& pair : vertex_ranges) { - size_t element_count = - get_index_count(rsx::method_registers.current_draw_clause.primitive, pair.second); - write_index_array_for_non_indexed_non_native_primitive_to_buffer((char*)mapped_buffer, - rsx::method_registers.current_draw_clause.primitive, (u32)first, (u32)pair.second); - mapped_buffer = (char*)mapped_buffer + element_count * sizeof(u16); - first += pair.second; - } + + size_t vertex_count = 0; + for (const auto& pair : vertex_ranges) + vertex_count += pair.second; + + write_index_array_for_non_indexed_non_native_primitive_to_buffer((char *)mapped_buffer, rsx::method_registers.current_draw_clause.primitive, vertex_count); + m_buffer_data.unmap(CD3DX12_RANGE(heap_offset, heap_offset + buffer_size)); D3D12_INDEX_BUFFER_VIEW index_buffer_view = { m_buffer_data.get_heap()->GetGPUVirtualAddress() + heap_offset, (UINT)buffer_size, diff --git a/rpcs3/Emu/RSX/GL/GLVertexBuffers.cpp b/rpcs3/Emu/RSX/GL/GLVertexBuffers.cpp index ce088e1b3f..3beb56fded 100644 --- a/rpcs3/Emu/RSX/GL/GLVertexBuffers.cpp +++ b/rpcs3/Emu/RSX/GL/GLVertexBuffers.cpp @@ -146,27 +146,22 @@ namespace // return vertex count if primitive type is not native (empty array otherwise) std::tuple get_index_array_for_emulated_non_indexed_draw(const std::vector> &first_count_commands, rsx::primitive_type primitive_mode, gl::ring_buffer &dst) { - u32 vertex_draw_count = 0; + u32 element_count = 0; verify(HERE), !gl::is_primitive_native(primitive_mode); for (const auto &pair : first_count_commands) - { - vertex_draw_count += (u32)get_index_count(primitive_mode, pair.second); - } + element_count += (u32)get_index_count(primitive_mode, pair.second); - u32 first = 0; - auto mapping = dst.alloc_from_heap(vertex_draw_count * sizeof(u16), 256); + auto mapping = dst.alloc_from_heap(element_count * sizeof(u16), 256); char *mapped_buffer = (char *)mapping.first; - for (const auto &pair : first_count_commands) - { - size_t element_count = get_index_count(primitive_mode, pair.second); - write_index_array_for_non_indexed_non_native_primitive_to_buffer(mapped_buffer, primitive_mode, first, pair.second); - mapped_buffer = (char*)mapped_buffer + element_count * sizeof(u16); - first += pair.second; - } + //This is an emulated buffer, so our indices only range from 0->original_vertex_array_length + u32 vertex_count = 0; + for (auto &first_count : first_count_commands) + vertex_count += first_count.second; - return std::make_tuple(vertex_draw_count, mapping.second); + write_index_array_for_non_indexed_non_native_primitive_to_buffer(mapped_buffer, primitive_mode, vertex_count); + return std::make_tuple(element_count, mapping.second); } std::tuple upload_index_buffer(gsl::span raw_index_buffer, void *ptr, rsx::index_array_type type, rsx::primitive_type draw_mode, const std::vector> first_count_commands, u32 initial_vertex_count) diff --git a/rpcs3/Emu/RSX/VK/VKVertexBuffers.cpp b/rpcs3/Emu/RSX/VK/VKVertexBuffers.cpp index 045a6d9187..40849d4b90 100644 --- a/rpcs3/Emu/RSX/VK/VKVertexBuffers.cpp +++ b/rpcs3/Emu/RSX/VK/VKVertexBuffers.cpp @@ -240,7 +240,7 @@ namespace void* buf = m_index_buffer_ring_info.map(offset_in_index_buffer, upload_size); write_index_array_for_non_indexed_non_native_primitive_to_buffer( - reinterpret_cast(buf), clause.primitive, 0, vertex_count); + reinterpret_cast(buf), clause.primitive, vertex_count); m_index_buffer_ring_info.unmap(); return std::make_tuple(