void System::Shutdown() { // Log last frame performance stats const auto perf_results = GetAndResetPerfStats(); telemetry_session->AddField(Telemetry::FieldType::Performance, "Shutdown_EmulationSpeed", perf_results.emulation_speed * 100.0); telemetry_session->AddField(Telemetry::FieldType::Performance, "Shutdown_Framerate", perf_results.game_fps); telemetry_session->AddField(Telemetry::FieldType::Performance, "Shutdown_Frametime", perf_results.frametime * 1000.0); // Shutdown emulation session GDBStub::Shutdown(); VideoCore::Shutdown(); HW::Shutdown(); telemetry_session.reset(); rpc_server.reset(); cheat_engine.reset(); service_manager.reset(); dsp_core.reset(); cpu_core.reset(); kernel.reset(); timing.reset(); app_loader.reset(); if (auto room_member = Network::GetRoomMember().lock()) { Network::GameInfo game_info{}; room_member->SendGameInfo(game_info); } LOG_DEBUG(Core, "Shutdown OK"); }
System::ResultStatus System::Init(EmuWindow* emu_window, u32 system_mode) { Memory::InitMemoryMap(); LOG_DEBUG(HW_Memory, "initialized OK"); if (Settings::values.use_cpu_jit) { cpu_core = std::make_unique<ARM_Dynarmic>(USER32MODE); } else { cpu_core = std::make_unique<ARM_DynCom>(USER32MODE); } telemetry_session = std::make_unique<Core::TelemetrySession>(); CoreTiming::Init(); HW::Init(); Kernel::Init(system_mode); Service::Init(); AudioCore::Init(); GDBStub::Init(); if (!VideoCore::Init(emu_window)) { return ResultStatus::ErrorVideoCore; } LOG_DEBUG(Core, "Initialized OK"); // Reset counters and set time origin to current frame GetAndResetPerfStats(); perf_stats.BeginSystemFrame(); return ResultStatus::Success; }
System::ResultStatus System::Init(Frontend::EmuWindow& emu_window, u32 system_mode) { LOG_DEBUG(HW_Memory, "initialized OK"); memory = std::make_unique<Memory::MemorySystem>(); timing = std::make_unique<Timing>(); kernel = std::make_unique<Kernel::KernelSystem>(*memory, *timing, [this] { PrepareReschedule(); }, system_mode); if (Settings::values.use_cpu_jit) { #ifdef ARCHITECTURE_x86_64 cpu_core = std::make_unique<ARM_Dynarmic>(this, *memory, USER32MODE); #else cpu_core = std::make_unique<ARM_DynCom>(this, *memory, USER32MODE); LOG_WARNING(Core, "CPU JIT requested, but Dynarmic not available"); #endif } else { cpu_core = std::make_unique<ARM_DynCom>(this, *memory, USER32MODE); } kernel->GetThreadManager().SetCPU(*cpu_core); memory->SetCPU(*cpu_core); if (Settings::values.enable_dsp_lle) { dsp_core = std::make_unique<AudioCore::DspLle>(*memory, Settings::values.enable_dsp_lle_multithread); } else { dsp_core = std::make_unique<AudioCore::DspHle>(*memory); } memory->SetDSP(*dsp_core); dsp_core->SetSink(Settings::values.sink_id, Settings::values.audio_device_id); dsp_core->EnableStretching(Settings::values.enable_audio_stretching); telemetry_session = std::make_unique<Core::TelemetrySession>(); rpc_server = std::make_unique<RPC::RPCServer>(); service_manager = std::make_shared<Service::SM::ServiceManager>(*this); archive_manager = std::make_unique<Service::FS::ArchiveManager>(*this); HW::Init(*memory); Service::Init(*this); GDBStub::Init(); ResultStatus result = VideoCore::Init(emu_window, *memory); if (result != ResultStatus::Success) { return result; } LOG_DEBUG(Core, "Initialized OK"); // Reset counters and set time origin to current frame GetAndResetPerfStats(); perf_stats.BeginSystemFrame(); return ResultStatus::Success; }
System::ResultStatus System::Init(EmuWindow* emu_window, u32 system_mode) { LOG_DEBUG(HW_Memory, "initialized OK"); CoreTiming::Init(); if (Settings::values.use_cpu_jit) { #ifdef ARCHITECTURE_x86_64 cpu_core = std::make_unique<ARM_Dynarmic>(USER32MODE); #else cpu_core = std::make_unique<ARM_DynCom>(USER32MODE); LOG_WARNING(Core, "CPU JIT requested, but Dynarmic not available"); #endif } else { cpu_core = std::make_unique<ARM_DynCom>(USER32MODE); } dsp_core = std::make_unique<AudioCore::DspHle>(); dsp_core->SetSink(Settings::values.sink_id, Settings::values.audio_device_id); dsp_core->EnableStretching(Settings::values.enable_audio_stretching); telemetry_session = std::make_unique<Core::TelemetrySession>(); service_manager = std::make_shared<Service::SM::ServiceManager>(); HW::Init(); Kernel::Init(system_mode); Service::Init(service_manager); GDBStub::Init(); Movie::GetInstance().Init(); if (!VideoCore::Init(emu_window)) { return ResultStatus::ErrorVideoCore; } LOG_DEBUG(Core, "Initialized OK"); // Reset counters and set time origin to current frame GetAndResetPerfStats(); perf_stats.BeginSystemFrame(); return ResultStatus::Success; }