code: Remove save state compatibility checks (#6980)

This commit is contained in:
GPUCode 2023-09-17 01:22:10 +03:00 committed by GitHub
parent 542209c993
commit d1c16bad78
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
13 changed files with 52 additions and 115 deletions

View File

@ -35,8 +35,7 @@ public:
const auto r = GetCpuRegister(i); const auto r = GetCpuRegister(i);
ar << r; ar << r;
} }
std::size_t fpu_reg_count = file_version == 0 ? 16 : 64; for (std::size_t i = 0; i < 64; i++) {
for (std::size_t i = 0; i < fpu_reg_count; i++) {
const auto r = GetFpuRegister(i); const auto r = GetFpuRegister(i);
ar << r; ar << r;
} }
@ -55,8 +54,7 @@ public:
ar >> r; ar >> r;
SetCpuRegister(i, r); SetCpuRegister(i, r);
} }
std::size_t fpu_reg_count = file_version == 0 ? 16 : 64; for (std::size_t i = 0; i < 64; i++) {
for (std::size_t i = 0; i < fpu_reg_count; i++) {
ar >> r; ar >> r;
SetFpuRegister(i, r); SetFpuRegister(i, r);
} }
@ -268,8 +266,7 @@ private:
ar << pc; ar << pc;
const auto cpsr = GetCPSR(); const auto cpsr = GetCPSR();
ar << cpsr; ar << cpsr;
int vfp_reg_count = file_version == 0 ? 32 : 64; for (int i = 0; i < 64; i++) {
for (int i = 0; i < vfp_reg_count; i++) {
const auto r = GetVFPReg(i); const auto r = GetVFPReg(i);
ar << r; ar << r;
} }
@ -316,8 +313,7 @@ private:
SetPC(r); SetPC(r);
ar >> r; ar >> r;
SetCPSR(r); SetCPSR(r);
int vfp_reg_count = file_version == 0 ? 32 : 64; for (int i = 0; i < 64; i++) {
for (int i = 0; i < vfp_reg_count; i++) {
ar >> r; ar >> r;
SetVFPReg(i, r); SetVFPReg(i, r);
} }

View File

@ -717,9 +717,7 @@ void System::serialize(Archive& ar, const unsigned int file_version) {
ar&* memory.get(); ar&* memory.get();
ar&* kernel.get(); ar&* kernel.get();
VideoCore::serialize(ar, file_version); VideoCore::serialize(ar, file_version);
if (file_version >= 1) { ar& movie;
ar& movie;
}
// This needs to be set from somewhere - might as well be here! // This needs to be set from somewhere - might as well be here!
if (Archive::is_loading::value) { if (Archive::is_loading::value) {

View File

@ -299,13 +299,7 @@ private:
void serialize(Archive& ar, const unsigned int file_version) { void serialize(Archive& ar, const unsigned int file_version) {
// event_types set during initialization of other things // event_types set during initialization of other things
ar& timers; ar& timers;
if (file_version == 0) { ar& current_timer;
std::shared_ptr<Timer> x;
ar& x;
current_timer = x.get();
} else {
ar& current_timer;
}
if (Archive::is_loading::value) { if (Archive::is_loading::value) {
event_queue_locked = true; event_queue_locked = true;
} }

View File

@ -79,29 +79,13 @@ private:
void WakeUp(ThreadWakeupReason reason, std::shared_ptr<Thread> thread, void WakeUp(ThreadWakeupReason reason, std::shared_ptr<Thread> thread,
std::shared_ptr<WaitObject> object) override; std::shared_ptr<WaitObject> object) override;
class DummyCallback : public WakeupCallback {
public:
void WakeUp(ThreadWakeupReason reason, std::shared_ptr<Thread> thread,
std::shared_ptr<WaitObject> object) override {}
};
friend class boost::serialization::access; friend class boost::serialization::access;
template <class Archive> template <class Archive>
void serialize(Archive& ar, const unsigned int file_version) { void serialize(Archive& ar, const unsigned int file_version) {
ar& boost::serialization::base_object<Object>(*this); ar& boost::serialization::base_object<Object>(*this);
if (file_version == 1) {
// This rigmarole is needed because in past versions, AddressArbiter inherited
// WakeupCallback But it turns out this breaks shared_from_this, so we split it out.
// Using a dummy class to deserialize a base_object allows compatibility to be
// maintained.
DummyCallback x;
ar& boost::serialization::base_object<WakeupCallback>(x);
}
ar& name; ar& name;
ar& waiting_threads; ar& waiting_threads;
if (file_version > 1) { ar& timeout_callback;
ar& timeout_callback;
}
} }
}; };

View File

@ -45,16 +45,7 @@ void Thread::serialize(Archive& ar, const unsigned int file_version) {
ar& tls_address; ar& tls_address;
ar& held_mutexes; ar& held_mutexes;
ar& pending_mutexes; ar& pending_mutexes;
ar& owner_process;
// Note: this is equivalent of what is done in boost/serialization/weak_ptr.hpp, but it's
// compatible with previous versions of savestates.
// TODO(SaveStates): When the savestate version is bumped, simplify this again.
std::shared_ptr<Process> shared_owner_process = owner_process.lock();
ar& shared_owner_process;
if (Archive::is_loading::value) {
owner_process = shared_owner_process;
}
ar& wait_objects; ar& wait_objects;
ar& wait_address; ar& wait_address;
ar& name; ar& name;

View File

@ -11,9 +11,9 @@
#include <vector> #include <vector>
#include <boost/container/flat_set.hpp> #include <boost/container/flat_set.hpp>
#include <boost/serialization/export.hpp> #include <boost/serialization/export.hpp>
#include <boost/serialization/shared_ptr.hpp>
#include <boost/serialization/unordered_map.hpp> #include <boost/serialization/unordered_map.hpp>
#include <boost/serialization/vector.hpp> #include <boost/serialization/vector.hpp>
#include <boost/serialization/weak_ptr.hpp>
#include "common/common_types.h" #include "common/common_types.h"
#include "common/thread_queue_list.h" #include "common/thread_queue_list.h"
#include "core/arm/arm_interface.h" #include "core/arm/arm_interface.h"

View File

@ -188,9 +188,7 @@ private:
void serialize(Archive& ar, const unsigned int file_version) { void serialize(Archive& ar, const unsigned int file_version) {
ar& next_title_id; ar& next_title_id;
ar& next_media_type; ar& next_media_type;
if (file_version > 0) { ar& flags;
ar& flags;
}
ar& current_title_id; ar& current_title_id;
ar& current_media_type; ar& current_media_type;
} }
@ -517,25 +515,23 @@ private:
void serialize(Archive& ar, const unsigned int file_version) { void serialize(Archive& ar, const unsigned int file_version) {
ar& next_parameter; ar& next_parameter;
ar& app_jump_parameters; ar& app_jump_parameters;
if (file_version > 0) { ar& delayed_parameter;
ar& delayed_parameter; ar& app_start_parameters;
ar& app_start_parameters; ar& deliver_arg;
ar& deliver_arg; ar& capture_info;
ar& capture_info; ar& capture_buffer_info;
ar& capture_buffer_info; ar& active_slot;
ar& active_slot; ar& last_library_launcher_slot;
ar& last_library_launcher_slot; ar& last_prepared_library_applet;
ar& last_prepared_library_applet; ar& last_system_launcher_slot;
ar& last_system_launcher_slot; ar& last_jump_to_home_slot;
ar& last_jump_to_home_slot; ar& ordered_to_close_sys_applet;
ar& ordered_to_close_sys_applet; ar& ordered_to_close_application;
ar& ordered_to_close_application; ar& application_cancelled;
ar& application_cancelled; ar& application_close_target;
ar& application_close_target; ar& new_3ds_mode_blocked;
ar& new_3ds_mode_blocked; ar& lock;
ar& lock; ar& capture_info;
ar& capture_info;
}
ar& applet_slots; ar& applet_slots;
ar& library_applet_closing_command; ar& library_applet_closing_command;

View File

@ -48,9 +48,7 @@ void Module::serialize(Archive& ar, const unsigned int file_version) {
ar& cpu_percent; ar& cpu_percent;
ar& screen_capture_post_permission; ar& screen_capture_post_permission;
ar& applet_manager; ar& applet_manager;
if (file_version > 0) { ar& wireless_reboot_info;
ar& wireless_reboot_info;
}
} }
SERIALIZE_IMPL(Module) SERIALIZE_IMPL(Module)

View File

@ -30,11 +30,7 @@ void Module::serialize(Archive& ar, const unsigned int file_version) {
ar& cameras; ar& cameras;
ar& ports; ar& ports;
ar& is_camera_reload_pending; ar& is_camera_reload_pending;
if (file_version > 0) { ar& initialized;
ar& initialized;
} else {
initialized = true;
}
if (Archive::is_loading::value && initialized) { if (Archive::is_loading::value && initialized) {
for (int i = 0; i < NumCameras; i++) { for (int i = 0; i < NumCameras; i++) {
LoadCameraImplementation(cameras[i], i); LoadCameraImplementation(cameras[i], i);

View File

@ -681,11 +681,6 @@ private:
private: private:
template <class Archive> template <class Archive>
void serialize(Archive& ar, const unsigned int file_version) { void serialize(Archive& ar, const unsigned int file_version) {
// For compatibility: put a nullptr here
if (file_version == 0) {
std::unique_ptr<Camera::CameraInterface> x;
ar& x;
}
ar& contexts; ar& contexts;
ar& current_context; ar& current_context;
ar& frame_rate; ar& frame_rate;

View File

@ -46,9 +46,7 @@ void Module::serialize(Archive& ar, const unsigned int file_version) {
if (Archive::is_loading::value) { if (Archive::is_loading::value) {
LoadInputDevices(); LoadInputDevices();
} }
if (file_version >= 1) { ar& state.hex;
ar& state.hex;
}
// Update events are set in the constructor // Update events are set in the constructor
// Devices are set from the implementation (and are stateless afaik) // Devices are set from the implementation (and are stateless afaik)
} }

View File

@ -400,18 +400,16 @@ private:
ar& clamp; ar& clamp;
// mic interface set in constructor // mic interface set in constructor
ar& state; ar& state;
if (file_version > 0) { // Maintain the internal mic state
// Maintain the internal mic state ar& encoding;
ar& encoding; bool is_sampling = mic && mic->IsSampling();
bool is_sampling = mic && mic->IsSampling(); ar& is_sampling;
ar& is_sampling; if (Archive::is_loading::value) {
if (Archive::is_loading::value) { if (is_sampling) {
if (is_sampling) { CreateMic();
CreateMic(); StartSampling();
StartSampling(); } else if (mic) {
} else if (mic) { mic->StopSampling();
mic->StopSampling();
}
} }
} }
} }

View File

@ -153,37 +153,30 @@ void Movie::serialize(Archive& ar, const unsigned int file_version) {
u64 _current_byte = static_cast<u64>(current_byte); u64 _current_byte = static_cast<u64>(current_byte);
ar& _current_byte; ar& _current_byte;
current_byte = static_cast<std::size_t>(_current_byte); current_byte = static_cast<std::size_t>(_current_byte);
ar& current_input;
if (file_version > 0) {
ar& current_input;
}
std::vector<u8> recorded_input_ = recorded_input; std::vector<u8> recorded_input_ = recorded_input;
ar& recorded_input_; ar& recorded_input_;
ar& init_time; ar& init_time;
if (file_version > 0) { if (Archive::is_loading::value) {
if (Archive::is_loading::value) { u64 savestate_movie_id;
u64 savestate_movie_id; ar& savestate_movie_id;
ar& savestate_movie_id; if (id != savestate_movie_id) {
if (id != savestate_movie_id) { if (savestate_movie_id == 0) {
if (savestate_movie_id == 0) { throw std::runtime_error("You must close your movie to load this state");
throw std::runtime_error("You must close your movie to load this state"); } else {
} else { throw std::runtime_error("You must load the same movie to load this state");
throw std::runtime_error("You must load the same movie to load this state");
}
} }
} else {
ar& id;
} }
} else {
ar& id;
} }
// Whether the state was made in MovieFinished state // Whether the state was made in MovieFinished state
bool post_movie = play_mode == PlayMode::MovieFinished; bool post_movie = play_mode == PlayMode::MovieFinished;
if (file_version > 0) { ar& post_movie;
ar& post_movie;
}
if (Archive::is_loading::value && id != 0) { if (Archive::is_loading::value && id != 0) {
if (!read_only) { if (!read_only) {