diff --git a/rpcs3/Emu/RSX/D3D12/D3D12Buffer.cpp b/rpcs3/Emu/RSX/D3D12/D3D12Buffer.cpp index e08f7c33c1..c07baf056f 100644 --- a/rpcs3/Emu/RSX/D3D12/D3D12Buffer.cpp +++ b/rpcs3/Emu/RSX/D3D12/D3D12Buffer.cpp @@ -347,10 +347,12 @@ std::tuple> D3D12GSRe { size_t vertex_count; std::vector vertex_buffer_view; - std::tie(vertex_buffer_view, vertex_count) = upload_inlined_vertex_array( - rsx::method_registers.vertex_arrays_info, - { (const gsl::byte*) inline_vertex_array.data(), ::narrow(inline_vertex_array.size() * sizeof(uint)) }, - m_buffer_data, m_vertex_buffer_data.Get(), command_list); + std::tie(vertex_buffer_view, vertex_count) = + upload_inlined_vertex_array(rsx::method_registers.vertex_arrays_info, + {(const gsl::byte*)rsx::method_registers.current_draw_clause.inline_vertex_array.data(), + ::narrow(rsx::method_registers.current_draw_clause.inline_vertex_array.size() * + sizeof(uint))}, + m_buffer_data, m_vertex_buffer_data.Get(), command_list); if (is_primitive_native(rsx::method_registers.current_draw_clause.primitive)) return std::make_tuple(false, vertex_count, vertex_buffer_view); diff --git a/rpcs3/Emu/RSX/GL/vertex_buffer.cpp b/rpcs3/Emu/RSX/GL/vertex_buffer.cpp index 624d93d5b7..14846eab86 100644 --- a/rpcs3/Emu/RSX/GL/vertex_buffer.cpp +++ b/rpcs3/Emu/RSX/GL/vertex_buffer.cpp @@ -418,7 +418,9 @@ u32 GLGSRender::upload_inline_array(const u32 &max_vertex_attrib_size, const u32 stride += rsx::get_vertex_type_size_on_host(info.type(), info.size()); } - u32 vertex_draw_count = (u32)(inline_vertex_array.size() * sizeof(u32)) / stride; + u32 vertex_draw_count = + (u32)(rsx::method_registers.current_draw_clause.inline_vertex_array.size() * sizeof(u32)) / + stride; m_attrib_ring_buffer.reserve_and_map(vertex_draw_count * max_vertex_attrib_size); for (int index = 0; index < rsx::limits::vertex_count; ++index) @@ -443,7 +445,8 @@ u32 GLGSRender::upload_inline_array(const u32 &max_vertex_attrib_size, const u32 auto &texture = m_gl_attrib_buffers[index]; - u8 *src = reinterpret_cast(inline_vertex_array.data()); + u8* src = + reinterpret_cast(rsx::method_registers.current_draw_clause.inline_vertex_array.data()); auto mapping = m_attrib_ring_buffer.alloc_from_reserve(data_size, m_min_texbuffer_alignment); u8 *dst = static_cast(mapping.first); diff --git a/rpcs3/Emu/RSX/RSXThread.cpp b/rpcs3/Emu/RSX/RSXThread.cpp index cb35c5f7a8..00d7c7c075 100644 --- a/rpcs3/Emu/RSX/RSXThread.cpp +++ b/rpcs3/Emu/RSX/RSXThread.cpp @@ -327,7 +327,7 @@ namespace rsx void thread::begin() { - inline_vertex_array.clear(); + rsx::method_registers.current_draw_clause.inline_vertex_array.clear(); } void thread::end() @@ -521,11 +521,13 @@ namespace rsx void thread::write_inline_array_to_buffer(void *dst_buffer) { - u8* src = reinterpret_cast(inline_vertex_array.data()); + u8* src = + reinterpret_cast(rsx::method_registers.current_draw_clause.inline_vertex_array.data()); u8* dst = (u8*)dst_buffer; size_t bytes_written = 0; - while (bytes_written < inline_vertex_array.size() * sizeof(u32)) + while (bytes_written < + rsx::method_registers.current_draw_clause.inline_vertex_array.size() * sizeof(u32)) { for (int index = 0; index < rsx::limits::vertex_count; ++index) { diff --git a/rpcs3/Emu/RSX/RSXThread.h b/rpcs3/Emu/RSX/RSXThread.h index 5f17179164..2e096924e3 100644 --- a/rpcs3/Emu/RSX/RSXThread.h +++ b/rpcs3/Emu/RSX/RSXThread.h @@ -183,8 +183,6 @@ namespace rsx u32 local_mem_addr, main_mem_addr; bool strict_ordering[0x1000]; - std::vector inline_vertex_array; - bool m_rtts_dirty; bool m_transform_constants_dirty; bool m_textures_dirty[16]; diff --git a/rpcs3/Emu/RSX/VK/VKVertexBuffers.cpp b/rpcs3/Emu/RSX/VK/VKVertexBuffers.cpp index 412176974e..8805fcb3fd 100644 --- a/rpcs3/Emu/RSX/VK/VKVertexBuffers.cpp +++ b/rpcs3/Emu/RSX/VK/VKVertexBuffers.cpp @@ -394,7 +394,9 @@ u32 VKGSRender::upload_inlined_array() stride += rsx::get_vertex_type_size_on_host(info.type(), info.size()); } - u32 vertex_draw_count = (u32)(inline_vertex_array.size() * sizeof(u32)) / stride; + u32 vertex_draw_count = + (u32)(rsx::method_registers.current_draw_clause.inline_vertex_array.size() * sizeof(u32)) / + stride; for (int index = 0; index < rsx::limits::vertex_count; ++index) { @@ -413,7 +415,8 @@ u32 VKGSRender::upload_inlined_array() const VkFormat format = vk::get_suitable_vk_format(vertex_info.type(), vertex_info.size()); u32 offset_in_attrib_buffer = m_attrib_ring_info.alloc<256>(data_size); - u8 *src = reinterpret_cast(inline_vertex_array.data()); + u8* src = + reinterpret_cast(rsx::method_registers.current_draw_clause.inline_vertex_array.data()); u8 *dst = static_cast(m_attrib_ring_info.map(offset_in_attrib_buffer, data_size)); src += offsets[index]; diff --git a/rpcs3/Emu/RSX/rsx_methods.cpp b/rpcs3/Emu/RSX/rsx_methods.cpp index 2675e26d29..ff4946116a 100644 --- a/rpcs3/Emu/RSX/rsx_methods.cpp +++ b/rpcs3/Emu/RSX/rsx_methods.cpp @@ -206,7 +206,7 @@ namespace rsx void draw_inline_array(thread* rsx, u32 _reg, u32 arg) { rsx::method_registers.current_draw_clause.command = rsx::draw_command::inlined_array; - rsx->inline_vertex_array.push_back(arg); + rsx::method_registers.current_draw_clause.inline_vertex_array.push_back(arg); } template @@ -269,7 +269,8 @@ namespace rsx rsx::method_registers.current_draw_clause.first_count_commands.push_back(std::make_pair(0, max_vertex_count)); } - if (!(rsx::method_registers.current_draw_clause.first_count_commands.empty() && rsxthr->inline_vertex_array.empty())) + if (!(rsx::method_registers.current_draw_clause.first_count_commands.empty() && + rsx::method_registers.current_draw_clause.inline_vertex_array.empty())) { rsxthr->end(); } diff --git a/rpcs3/Emu/RSX/rsx_methods.h b/rpcs3/Emu/RSX/rsx_methods.h index 86b547dd28..a8a0d694ad 100644 --- a/rpcs3/Emu/RSX/rsx_methods.h +++ b/rpcs3/Emu/RSX/rsx_methods.h @@ -28,6 +28,8 @@ namespace rsx primitive_type primitive; draw_command command; + std::vector inline_vertex_array; + /** * Stores the first and count argument from draw/draw indexed parameters between begin/end clauses. */