don't allocate entire app on heap

This commit is contained in:
SimoneN64
2023-06-12 10:13:50 +02:00
parent 91575fe4df
commit 0b21f16ea6
4 changed files with 30 additions and 30 deletions

View File

@@ -2,22 +2,22 @@
#include <Scheduler.hpp> #include <Scheduler.hpp>
namespace n64 { namespace n64 {
Core::Core() { Core::Core() : cpu{new Interpreter} {
if(SDL_GameControllerAddMappingsFromFile("resources/gamecontrollerdb.txt") < 0) { if(SDL_GameControllerAddMappingsFromFile("resources/gamecontrollerdb.txt") < 0) {
Util::warn("Failed to load game controller DB"); Util::warn("Failed to load game controller DB");
} }
} }
void Core::Stop() { void Core::Stop() {
cpu.Reset(); cpu->Reset();
cpu.mem.Reset(); cpu->mem.Reset();
pause = true; pause = true;
romLoaded = false; romLoaded = false;
} }
void Core::LoadROM(const std::string& rom_) { void Core::LoadROM(const std::string& rom_) {
rom = rom_; rom = rom_;
cpu.Reset(); cpu->Reset();
pause = false; pause = false;
romLoaded = true; romLoaded = true;
@@ -27,21 +27,21 @@ void Core::LoadROM(const std::string& rom_) {
return extension == i; return extension == i;
}); });
cpu.mem.LoadROM(isArchive, rom); cpu->mem.LoadROM(isArchive, rom);
GameDB::match(cpu.mem); GameDB::match(cpu->mem);
cpu.mem.mmio.vi.isPal = cpu.mem.IsROMPAL(); cpu->mem.mmio.vi.isPal = cpu->mem.IsROMPAL();
cpu.mem.mmio.si.pif.InitDevices(cpu.mem.saveType); cpu->mem.mmio.si.pif.InitDevices(cpu->mem.saveType);
cpu.mem.mmio.si.pif.LoadMempak(rom); cpu->mem.mmio.si.pif.LoadMempak(rom);
cpu.mem.mmio.si.pif.LoadEeprom(cpu.mem.saveType, rom); cpu->mem.mmio.si.pif.LoadEeprom(cpu->mem.saveType, rom);
cpu.mem.flash.Load(cpu.mem.saveType, rom); cpu->mem.flash.Load(cpu->mem.saveType, rom);
cpu.mem.LoadSRAM(cpu.mem.saveType, rom); cpu->mem.LoadSRAM(cpu->mem.saveType, rom);
cpu.mem.mmio.si.pif.ExecutePIF(cpu.mem, cpu.regs); PIF::ExecutePIF(cpu->mem, cpu->regs);
} }
void Core::Run(float volumeL, float volumeR) { void Core::Run(float volumeL, float volumeR) {
Mem& mem = cpu.mem; Mem& mem = cpu->mem;
MMIO& mmio = mem.mmio; MMIO& mmio = mem.mmio;
Registers& regs = cpu.regs; Registers& regs = cpu->regs;
for (int field = 0; field < mmio.vi.numFields; field++) { for (int field = 0; field < mmio.vi.numFields; field++) {
int frameCycles = 0; int frameCycles = 0;
@@ -53,7 +53,7 @@ void Core::Run(float volumeL, float volumeR) {
} }
for(; cycles < mem.mmio.vi.cyclesPerHalfline; cycles++, frameCycles++) { for(; cycles < mem.mmio.vi.cyclesPerHalfline; cycles++, frameCycles++) {
int taken = cpu.Step(); int taken = cpu->Step();
static int cpuSteps = 0; static int cpuSteps = 0;
cpuSteps += taken; cpuSteps += taken;
if(mmio.rsp.spStatus.halt) { if(mmio.rsp.spStatus.halt) {
@@ -83,7 +83,7 @@ void Core::Run(float volumeL, float volumeR) {
InterruptRaise(mmio.mi, regs, Interrupt::VI); InterruptRaise(mmio.mi, regs, Interrupt::VI);
} }
mmio.ai.Step(cpu.mem, regs, frameCycles, volumeL, volumeR); mmio.ai.Step(cpu->mem, regs, frameCycles, volumeL, volumeR);
scheduler.tick(frameCycles, mem, regs); scheduler.tick(frameCycles, mem, regs);
} }
} }

View File

@@ -8,7 +8,7 @@ struct Window;
namespace n64 { namespace n64 {
struct Core { struct Core {
~Core() { Stop(); } ~Core() { Stop(); delete cpu; }
Core(); Core();
void Stop(); void Stop();
void LoadROM(const std::string&); void LoadROM(const std::string&);
@@ -23,6 +23,6 @@ struct Core {
bool romLoaded = false; bool romLoaded = false;
bool done = false; bool done = false;
std::string rom; std::string rom;
Interpreter cpu; Interpreter* cpu = nullptr;
}; };
} }

View File

@@ -11,7 +11,7 @@ namespace fs = std::filesystem;
Window::Window(n64::Core& core) : settings() { Window::Window(n64::Core& core) : settings() {
InitSDL(); InitSDL();
InitParallelRDP(core.cpu.mem.GetRDRAM(), window); InitParallelRDP(core.cpu->mem.GetRDRAM(), window);
InitImgui(); InitImgui();
NFD::Init(); NFD::Init();
} }
@@ -152,7 +152,7 @@ ImDrawData* Window::Present(n64::Core& core) {
void Window::LoadROM(n64::Core& core, const std::string &path) { void Window::LoadROM(n64::Core& core, const std::string &path) {
if(!path.empty()) { if(!path.empty()) {
core.LoadROM(path); core.LoadROM(path);
gameName = core.cpu.mem.rom.gameNameDB; gameName = core.cpu->mem.rom.gameNameDB;
if(gameName.empty()) { if(gameName.empty()) {
gameName = fs::path(path).stem().string(); gameName = fs::path(path).stem().string();
@@ -181,13 +181,13 @@ void Window::RenderMainMenuBar(n64::Core &core) {
} }
} }
if (ImGui::MenuItem("Dump RDRAM")) { if (ImGui::MenuItem("Dump RDRAM")) {
core.cpu.mem.DumpRDRAM(); core.cpu->mem.DumpRDRAM();
} }
if (ImGui::MenuItem("Dump IMEM")) { if (ImGui::MenuItem("Dump IMEM")) {
core.cpu.mem.DumpIMEM(); core.cpu->mem.DumpIMEM();
} }
if (ImGui::MenuItem("Dump DMEM")) { if (ImGui::MenuItem("Dump DMEM")) {
core.cpu.mem.DumpDMEM(); core.cpu->mem.DumpDMEM();
} }
if (ImGui::MenuItem("Exit")) { if (ImGui::MenuItem("Exit")) {
core.done = true; core.done = true;
@@ -232,8 +232,8 @@ void Window::Render(n64::Core& core) {
static u32 lastFrame = 0; static u32 lastFrame = 0;
if(!core.pause && lastFrame < ticks - 1000) { if(!core.pause && lastFrame < ticks - 1000) {
lastFrame = ticks; lastFrame = ticks;
windowTitle += fmt::format(" | {:02d} VI/s", core.cpu.mem.mmio.vi.swaps); windowTitle += fmt::format(" | {:02d} VI/s", core.cpu->mem.mmio.vi.swaps);
core.cpu.mem.mmio.vi.swaps = 0; core.cpu->mem.mmio.vi.swaps = 0;
SDL_SetWindowTitle(window, windowTitle.c_str()); SDL_SetWindowTitle(window, windowTitle.c_str());
windowTitle = shadowWindowTitle; windowTitle = shadowWindowTitle;
} }

View File

@@ -2,16 +2,16 @@
#include <MupenMovie.hpp> #include <MupenMovie.hpp>
int main(int argc, char** argv) { int main(int argc, char** argv) {
App* app = new App; App app;
if(argc > 1) { if(argc > 1) {
if(argc > 2) { if(argc > 2) {
LoadTAS(argv[2]); LoadTAS(argv[2]);
} }
app->LoadROM(argv[1]); app.LoadROM(argv[1]);
} }
app->Run(); app.Run();
delete app;
return 0; return 0;
} }