From 0b677dcfdf7c5623c75600ae4c16739aaefb2402 Mon Sep 17 00:00:00 2001 From: sonninnos Date: Wed, 5 Jun 2024 04:24:40 +0300 Subject: [PATCH 1/4] libretro: Logging correction --- libretro/libretro.cpp | 35 +++++++++++++++++++---------------- 1 file changed, 19 insertions(+), 16 deletions(-) diff --git a/libretro/libretro.cpp b/libretro/libretro.cpp index e1a4c674da..344157acb0 100644 --- a/libretro/libretro.cpp +++ b/libretro/libretro.cpp @@ -1192,9 +1192,20 @@ static const struct retro_controller_info ports[] = void retro_init(void) { - VsyncSwapIntervalReset(); + struct retro_log_callback log; + if (environ_cb(RETRO_ENVIRONMENT_GET_LOG_INTERFACE, &log)) + { + log_cb = log.log; + LogManager::Init(&g_Config.bEnableLogging); + printfLogger = new PrintfLogger(log); + LogManager* logman = LogManager::GetInstance(); + logman->RemoveListener(logman->GetConsoleListener()); + logman->RemoveListener(logman->GetDebuggerListener()); + logman->ChangeFileLog(nullptr); + logman->AddListener(printfLogger); + } - g_threadManager.Init(cpu_info.num_cores, cpu_info.logical_cpu_count); + VsyncSwapIntervalReset(); struct retro_input_descriptor desc[] = { { 0, RETRO_DEVICE_JOYPAD, 0, RETRO_DEVICE_ID_JOYPAD_LEFT, "D-Pad Left" }, @@ -1221,23 +1232,12 @@ void retro_init(void) if (environ_cb(RETRO_ENVIRONMENT_GET_INPUT_BITMASKS, NULL)) libretro_supports_bitmasks = true; - struct retro_log_callback log; - if (environ_cb(RETRO_ENVIRONMENT_GET_LOG_INTERFACE, &log)) - { - log_cb = log.log; - LogManager::Init(&g_Config.bEnableLogging); - printfLogger = new PrintfLogger(log); - LogManager* logman = LogManager::GetInstance(); - logman->RemoveListener(logman->GetConsoleListener()); - logman->RemoveListener(logman->GetDebuggerListener()); - logman->ChangeFileLog(nullptr); - logman->AddListener(printfLogger); - logman->SetAllLogLevels(LogLevel::LINFO); - } - g_Config.Load("", ""); g_Config.iInternalResolution = 0; + // Log levels must be set after g_Config.Load + LogManager::GetInstance()->SetAllLogLevels(LogLevel::LINFO); + const char* nickname = NULL; if (environ_cb(RETRO_ENVIRONMENT_GET_USERNAME, &nickname) && nickname) g_Config.sNickName = std::string(nickname); @@ -1263,6 +1263,8 @@ void retro_init(void) g_VFS.Register("", new DirectoryReader(retro_base_dir)); + g_threadManager.Init(cpu_info.num_cores, cpu_info.logical_cpu_count); + init_output_audio_buffer(2048); } @@ -1270,6 +1272,7 @@ void retro_deinit(void) { g_threadManager.Teardown(); LogManager::Shutdown(); + log_cb = NULL; delete printfLogger; printfLogger = nullptr; From 4cc75d91feaea349c11897a22d659294bc2fd59c Mon Sep 17 00:00:00 2001 From: sonninnos Date: Wed, 5 Jun 2024 04:50:19 +0300 Subject: [PATCH 2/4] libretro: Fix opengl detectvsyncswapinterval crash --- libretro/LibretroGraphicsContext.cpp | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/libretro/LibretroGraphicsContext.cpp b/libretro/LibretroGraphicsContext.cpp index 0fd20d41cd..f79c197e9c 100644 --- a/libretro/LibretroGraphicsContext.cpp +++ b/libretro/LibretroGraphicsContext.cpp @@ -42,6 +42,10 @@ LibretroHWRenderContext::LibretroHWRenderContext(retro_hw_context_type context_t void LibretroHWRenderContext::ContextReset() { INFO_LOG(G3D, "Context reset"); + if (gpu && Libretro::useEmuThread) { + Libretro::EmuThreadPause(); + } + if (gpu) { gpu->DeviceLost(); } @@ -57,6 +61,10 @@ void LibretroHWRenderContext::ContextReset() { if (gpu) { gpu->DeviceRestore(draw_); } + + if (gpu && Libretro::useEmuThread) { + Libretro::EmuThreadStart(); + } } void LibretroHWRenderContext::ContextDestroy() { From 4aa8d3a818d98e3b76b72d13051f0b349bdd5d4f Mon Sep 17 00:00:00 2001 From: sonninnos Date: Wed, 5 Jun 2024 04:53:22 +0300 Subject: [PATCH 3/4] libretro: Add autostateload unserialize crash safeguard --- libretro/libretro.cpp | 11 ++++++----- 1 file changed, 6 insertions(+), 5 deletions(-) diff --git a/libretro/libretro.cpp b/libretro/libretro.cpp index 344157acb0..b8ac23c34e 100644 --- a/libretro/libretro.cpp +++ b/libretro/libretro.cpp @@ -1655,7 +1655,7 @@ void retro_run(void) if (useEmuThread) { - if( emuThreadState == EmuThreadState::PAUSED || + if ( emuThreadState == EmuThreadState::PAUSED || emuThreadState == EmuThreadState::PAUSE_REQUESTED) { VsyncSwapIntervalDetect(); @@ -1694,9 +1694,8 @@ namespace SaveState size_t retro_serialize_size(void) { - if(!gpu) { // The HW renderer isn't ready on first pass. + if (!gpu) // The HW renderer isn't ready on first pass. return 134217728; // 128MB ought to be enough for anybody. - } SaveState::SaveStart state; // TODO: Libretro API extension to use the savestate queue @@ -1709,9 +1708,8 @@ size_t retro_serialize_size(void) bool retro_serialize(void *data, size_t size) { - if(!gpu) { // The HW renderer isn't ready on first pass. + if (!gpu) // The HW renderer isn't ready on first pass. return false; - } // TODO: Libretro API extension to use the savestate queue if (useEmuThread) @@ -1733,6 +1731,9 @@ bool retro_serialize(void *data, size_t size) bool retro_unserialize(const void *data, size_t size) { + if (!gpu) // The HW renderer isn't ready on first pass. + return false; + // TODO: Libretro API extension to use the savestate queue if (useEmuThread) EmuThreadPause(); // Does nothing if already paused From 4c1b50a3948ec4c896b8fa4d81f9f8b8474941e9 Mon Sep 17 00:00:00 2001 From: sonninnos Date: Wed, 5 Jun 2024 05:20:57 +0300 Subject: [PATCH 4/4] libretro: Do internal fastforward toggling only with ForceLagSync --- libretro/libretro.cpp | 9 ++++++--- 1 file changed, 6 insertions(+), 3 deletions(-) diff --git a/libretro/libretro.cpp b/libretro/libretro.cpp index b8ac23c34e..f91b3f0f19 100644 --- a/libretro/libretro.cpp +++ b/libretro/libretro.cpp @@ -487,9 +487,12 @@ static std::string map_psp_language_to_i18n_locale(int val) static void check_variables(CoreParameter &coreParam) { - bool isFastForwarding; - if (environ_cb(RETRO_ENVIRONMENT_GET_FASTFORWARDING, &isFastForwarding)) - coreParam.fastForward = isFastForwarding; + if (g_Config.bForceLagSync) + { + bool isFastForwarding; + if (environ_cb(RETRO_ENVIRONMENT_GET_FASTFORWARDING, &isFastForwarding)) + coreParam.fastForward = isFastForwarding; + } bool updated = false;