Esempio n. 1
0
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");
}
Esempio n. 2
0
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;
}
Esempio n. 3
0
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;
}
Esempio n. 4
0
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;
}