From ee9f283d4da2984b1d6815816ddb55463fda25be Mon Sep 17 00:00:00 2001 From: TuxSH <1922548+TuxSH@users.noreply.github.com> Date: Sat, 21 Jan 2023 20:32:57 +0000 Subject: [PATCH] rosalina: fix rare screen filter race condition --- sysmodules/rosalina/source/menu.c | 4 ++-- sysmodules/rosalina/source/menus/screen_filters.c | 13 +++++++++++++ 2 files changed, 15 insertions(+), 2 deletions(-) diff --git a/sysmodules/rosalina/source/menu.c b/sysmodules/rosalina/source/menu.c index d8c3f39..b630f14 100644 --- a/sysmodules/rosalina/source/menu.c +++ b/sysmodules/rosalina/source/menu.c @@ -255,8 +255,8 @@ void menuThreadMain(void) if(isN3DS) N3DSMenu_UpdateStatus(); - while (!isServiceUsable("ac:u") || !isServiceUsable("hid:USER")) - svcSleepThread(500 * 1000 * 1000LL); + while (!isServiceUsable("ac:u") || !isServiceUsable("hid:USER") || !isServiceUsable("gsp::Gpu")) + svcSleepThread(250 * 1000 * 1000LL); s64 out = 0; diff --git a/sysmodules/rosalina/source/menus/screen_filters.c b/sysmodules/rosalina/source/menus/screen_filters.c index a0a9376..bb943d7 100644 --- a/sysmodules/rosalina/source/menus/screen_filters.c +++ b/sysmodules/rosalina/source/menus/screen_filters.c @@ -153,13 +153,26 @@ void ScreenFiltersMenu_Set##name(void)\ void ScreenFiltersMenu_RestoreSettings(void) { + // Precondition: menu has not been entered + // Not initialized/default: return if (ScreenFiltersMenu_IsDefaultSettings()) return; // Wait for GSP to restore the CCT table svcSleepThread(20 * 1000 * 1000LL); + + // Pause GSP, then wait a bit to ensure GPU commands complete + // We need to ensure no GPU stuff is running when changing + // the gamma table (otherwise colors become and stay glitched). + svcKernelSetState(0x10000, 2); + svcSleepThread(5 * 1000 * 100LL); + ScreenFiltersMenu_ApplyColorSettings(); + + // Unpause GSP + svcKernelSetState(0x10000, 2); + svcSleepThread(5 * 1000 * 100LL); } DEF_CCT_SETTER(6500, Default)