mirror of
https://github.com/RPCSX/rpcsx.git
synced 2026-04-04 14:08:37 +00:00
Savestates Support For PS3 Emulation (#10478)
This commit is contained in:
parent
969b9eb89d
commit
fcd297ffb2
154 changed files with 4948 additions and 635 deletions
|
|
@ -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
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue