diff --git a/rpcs3/Emu/RSX/RSXThread.cpp b/rpcs3/Emu/RSX/RSXThread.cpp index e1bca99591..49cbb909e3 100644 --- a/rpcs3/Emu/RSX/RSXThread.cpp +++ b/rpcs3/Emu/RSX/RSXThread.cpp @@ -337,7 +337,6 @@ namespace rsx void thread::end() { - rsx::method_registers.transform_constants.clear(); in_begin_end = false; for (u8 index = 0; index < rsx::limits::vertex_count; ++index) @@ -937,13 +936,7 @@ namespace rsx */ void thread::fill_vertex_program_constants_data(void *buffer) { - //Some games dont initialize some registers that they use in the vertex stage - memset(buffer, 0, 512 * 4 * sizeof(float)); - - for (const auto &entry : rsx::method_registers.transform_constants) - local_transform_constants[entry.first] = entry.second; - for (const auto &entry : local_transform_constants) - stream_vector_from_memory((char*)buffer + entry.first * 4 * sizeof(float), (void*)entry.second.rgba); + memcpy(buffer, rsx::method_registers.transform_constants.data(), 468 * 4 * sizeof(float)); } void thread::fill_fragment_state_buffer(void *buffer, const RSXFragmentProgram &fragment_program) diff --git a/rpcs3/Emu/RSX/RSXThread.h b/rpcs3/Emu/RSX/RSXThread.h index 1da838e34a..0f0aded8ba 100644 --- a/rpcs3/Emu/RSX/RSXThread.h +++ b/rpcs3/Emu/RSX/RSXThread.h @@ -275,9 +275,6 @@ namespace rsx GcmTileInfo tiles[limits::tiles_count]; GcmZcullInfo zculls[limits::zculls_count]; - // Constant stored for whole frame - std::unordered_map local_transform_constants; - bool capture_current_frame = false; void capture_frame(const std::string &name); diff --git a/rpcs3/Emu/RSX/rsx_methods.cpp b/rpcs3/Emu/RSX/rsx_methods.cpp index 80aac8a14e..ac115cea5f 100644 --- a/rpcs3/Emu/RSX/rsx_methods.cpp +++ b/rpcs3/Emu/RSX/rsx_methods.cpp @@ -334,7 +334,13 @@ namespace rsx static constexpr u8 subreg = index % 4; u32 load = rsx::method_registers.transform_constant_load(); - rsx::method_registers.transform_constants[load + reg].rgba[subreg] = (f32&)arg; + if ((load + index) >= 512) + { + LOG_ERROR(RSX, "Invalid register index (load=%d, index=%d)", load, index); + return; + } + + rsx::method_registers.transform_constants[load + reg][subreg] = arg; rsxthr->m_transform_constants_dirty = true; } }; diff --git a/rpcs3/Emu/RSX/rsx_methods.h b/rpcs3/Emu/RSX/rsx_methods.h index e6854a0388..040e4c555b 100644 --- a/rpcs3/Emu/RSX/rsx_methods.h +++ b/rpcs3/Emu/RSX/rsx_methods.h @@ -155,7 +155,7 @@ namespace rsx std::array transform_program; - std::unordered_map> transform_constants; + std::array transform_constants; draw_clause current_draw_clause; @@ -183,7 +183,10 @@ namespace rsx fragment_textures(fill_array(registers, std::make_index_sequence<16>())), vertex_textures(fill_array(registers, std::make_index_sequence<4>())), vertex_arrays_info(fill_array(registers, std::make_index_sequence<16>())) - { } + { + //NOTE: Transform constants persist through a context reset (NPEB00913) + memset(transform_constants.data(), 0, 512 * 4 * sizeof(u32)); + } ~rsx_state() { }