Savestates Support For PS3 Emulation (#10478)

This commit is contained in:
Elad Ashkenazi 2022-07-04 16:02:17 +03:00 committed by GitHub
parent 969b9eb89d
commit fcd297ffb2
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
154 changed files with 4948 additions and 635 deletions

View file

@ -12,18 +12,77 @@
LOG_CHANNEL(sys_memory);
//
static shared_mutex s_memstats_mtx;
lv2_memory_container::lv2_memory_container(u32 size, bool from_idm) noexcept
: size(size)
, id{from_idm ? idm::last_id() : SYS_MEMORY_CONTAINER_ID_INVALID}
{
}
//
static shared_mutex s_memstats_mtx;
lv2_memory_container::lv2_memory_container(utils::serial& ar, bool from_idm) noexcept
: size(ar)
, id{from_idm ? idm::last_id() : SYS_MEMORY_CONTAINER_ID_INVALID}
, used(ar)
{
}
std::shared_ptr<void> lv2_memory_container::load(utils::serial& ar)
{
// Use idm::last_id() only for the instances at IDM
return std::make_shared<lv2_memory_container>(stx::exact_t<utils::serial&>(ar), true);
}
void lv2_memory_container::save(utils::serial& ar)
{
ar(size, used);
}
lv2_memory_container* lv2_memory_container::search(u32 id)
{
if (id != SYS_MEMORY_CONTAINER_ID_INVALID)
{
return idm::check<lv2_memory_container>(id);
}
return &g_fxo->get<lv2_memory_container>();
}
struct sys_memory_address_table
{
atomic_t<lv2_memory_container*> addrs[65536]{};
sys_memory_address_table() = default;
SAVESTATE_INIT_POS(id_manager::id_map<lv2_memory_container>::savestate_init_pos + 0.1);
sys_memory_address_table(utils::serial& ar)
{
// First: address, second: conatiner ID (SYS_MEMORY_CONTAINER_ID_INVALID for global FXO memory container)
std::unordered_map<u16, u32> mm;
ar(mm);
for (const auto& [addr, id] : mm)
{
addrs[addr] = ensure(lv2_memory_container::search(id));
}
}
void save(utils::serial& ar)
{
std::unordered_map<u16, u32> mm;
for (auto& ctr : addrs)
{
if (const auto ptr = +ctr)
{
mm[static_cast<u16>(&ctr - addrs)] = ptr->id;
}
}
ar(mm);
}
};
// Todo: fix order of error checks