mirror of
https://git.eden-emu.dev/eden-emu/eden.git
synced 2026-09-10 06:02:40 +00:00
5f142c7926
Reduces the page entries from 32 bytes to 8 and rewrites `VirtualBuffer` to be more efficient in memory usage and specifically for large zero regions. The page table will now only reserve 1GiB instead of 4GiB and of this memory it should only use at most ~8MiB. This PR has the side effect of using Eden on Windows on low memory systems much more plausible since it would previously require ~10GiB of committable memory at front (despite using ~5-6 at most, inadvertently stalling other processes) where as now it should only require around the amount that it'll actually use. Co-authored-by: Lizzie <lizzie@eden-emu.dev> Reviewed-on: https://git.eden-emu.dev/eden-emu/eden/pulls/4219 Reviewed-by: Maufeat <sahyno1996@gmail.com> Reviewed-by: lizzie <lizzie@eden-emu.dev> Reviewed-by: CamilleLaVey <camillelavey99@gmail.com>
72 lines
2.1 KiB
C++
72 lines
2.1 KiB
C++
// SPDX-FileCopyrightText: Copyright 2026 Eden Emulator Project
|
|
// SPDX-License-Identifier: GPL-3.0-or-later
|
|
|
|
// SPDX-FileCopyrightText: Copyright 2020 yuzu Emulator Project
|
|
// SPDX-License-Identifier: GPL-2.0-or-later
|
|
|
|
#pragma once
|
|
|
|
#include "common/host_memory.h"
|
|
#include "common/typed_address.h"
|
|
|
|
namespace Core {
|
|
|
|
namespace DramMemoryMap {
|
|
enum : u64 {
|
|
Base = 0x80000000ULL,
|
|
KernelReserveBase = Base + 0x60000,
|
|
SlabHeapBase = KernelReserveBase + 0x85000,
|
|
};
|
|
}; // namespace DramMemoryMap
|
|
|
|
class DeviceMemory {
|
|
public:
|
|
explicit DeviceMemory();
|
|
~DeviceMemory();
|
|
|
|
DeviceMemory& operator=(const DeviceMemory&) = delete;
|
|
DeviceMemory(const DeviceMemory&) = delete;
|
|
|
|
template <typename T>
|
|
Common::PhysicalAddress GetPhysicalAddr(const T* ptr) const {
|
|
return GetPhysicalAddr(reinterpret_cast<uintptr_t>(ptr));
|
|
}
|
|
|
|
Common::PhysicalAddress GetPhysicalAddr(uintptr_t ptr) const {
|
|
return (ptr - reinterpret_cast<uintptr_t>(buffer.BackingBasePointer())) +
|
|
DramMemoryMap::Base;
|
|
}
|
|
|
|
template <typename T>
|
|
PAddr GetRawPhysicalAddr(const T* ptr) const {
|
|
return static_cast<PAddr>(reinterpret_cast<uintptr_t>(ptr) -
|
|
reinterpret_cast<uintptr_t>(buffer.BackingBasePointer()));
|
|
}
|
|
|
|
template <typename T>
|
|
T* GetPointer(Common::PhysicalAddress addr) {
|
|
return reinterpret_cast<T*>(buffer.BackingBasePointer() +
|
|
(GetInteger(addr) - DramMemoryMap::Base));
|
|
}
|
|
|
|
template <typename T>
|
|
const T* GetPointer(Common::PhysicalAddress addr) const {
|
|
return reinterpret_cast<T*>(buffer.BackingBasePointer() +
|
|
(GetInteger(addr) - DramMemoryMap::Base));
|
|
}
|
|
|
|
template <typename T>
|
|
T* GetPointerFromRaw(PAddr addr) {
|
|
return reinterpret_cast<T*>(buffer.BackingBasePointer() + addr);
|
|
}
|
|
|
|
template <typename T>
|
|
const T* GetPointerFromRaw(PAddr addr) const {
|
|
return reinterpret_cast<T*>(buffer.BackingBasePointer() + addr);
|
|
}
|
|
|
|
Common::HostMemory buffer;
|
|
};
|
|
|
|
} // namespace Core
|