From a03988b05d6c8424bf2342b24858bfbf348b4636 Mon Sep 17 00:00:00 2001 From: TuxSH <1922548+TuxSH@users.noreply.github.com> Date: Tue, 18 Jul 2023 00:47:57 +0200 Subject: [PATCH] Fix rare race condition issue causing white screens --- sysmodules/rosalina/source/main.c | 1 + sysmodules/rosalina/source/menu.c | 1 - .../rosalina/source/menus/screen_filters.c | 17 +++++++++++++---- sysmodules/rosalina/source/shell.c | 3 +++ 4 files changed, 17 insertions(+), 5 deletions(-) diff --git a/sysmodules/rosalina/source/main.c b/sysmodules/rosalina/source/main.c index b170ed3..adfee97 100644 --- a/sysmodules/rosalina/source/main.c +++ b/sysmodules/rosalina/source/main.c @@ -261,6 +261,7 @@ int main(void) Draw_Init(); Cheat_SeedRng(svcGetSystemTick()); + ScreenFiltersMenu_LoadConfig(); MyThread *menuThread = menuCreateThread(); MyThread *taskRunnerThread = taskRunnerCreateThread(); diff --git a/sysmodules/rosalina/source/menu.c b/sysmodules/rosalina/source/menu.c index f61fa44..cec872e 100644 --- a/sysmodules/rosalina/source/menu.c +++ b/sysmodules/rosalina/source/menu.c @@ -270,7 +270,6 @@ void menuThreadMain(void) while (!isServiceUsable("ac:u") || !isServiceUsable("hid:USER") || !isServiceUsable("gsp::Gpu") || !isServiceUsable("cdc:CHK")) svcSleepThread(250 * 1000 * 1000LL); - ScreenFiltersMenu_LoadConfig(); handleShellOpened(); hidInit(); // assume this doesn't fail diff --git a/sysmodules/rosalina/source/menus/screen_filters.c b/sysmodules/rosalina/source/menus/screen_filters.c index d9b5fc1..f3e0648 100644 --- a/sysmodules/rosalina/source/menus/screen_filters.c +++ b/sysmodules/rosalina/source/menus/screen_filters.c @@ -45,12 +45,21 @@ typedef union { ScreenFilter topScreenFilter; ScreenFilter bottomScreenFilter; +static inline bool ScreenFiltersMenu_IsDefaultSettingsFilter(const ScreenFilter *filter) +{ + bool ok = true; + ok = ok && filter->cct == 6500; + ok = ok && !filter->invert; + ok = ok && filter->gamma == 1.0f; + ok = ok && filter->contrast == 1.0f; + ok = ok && filter->brightness == 0.0f; + return ok; +} + + static inline bool ScreenFiltersMenu_IsDefaultSettings(void) { - static const ScreenFilter defaultFilter = { 6500, false, 1.0f, 1.0f, 0.0f }; - bool ok1 = memcmp(&topScreenFilter, &defaultFilter, sizeof(defaultFilter)) == 0; - bool ok2 = memcmp(&bottomScreenFilter, &defaultFilter, sizeof(defaultFilter)) == 0; - return ok1 && ok2; + return ScreenFiltersMenu_IsDefaultSettingsFilter(&topScreenFilter) && ScreenFiltersMenu_IsDefaultSettingsFilter(&bottomScreenFilter); } static inline u8 ScreenFiltersMenu_GetColorLevel(int inLevel, float wp, float a, float b, float g) diff --git a/sysmodules/rosalina/source/shell.c b/sysmodules/rosalina/source/shell.c index c867046..15e1c22 100644 --- a/sysmodules/rosalina/source/shell.c +++ b/sysmodules/rosalina/source/shell.c @@ -78,6 +78,9 @@ static void forceAudioOutput(u32 forceOp) void handleShellOpened(void) { + // Somtimes this is called before Rosalina thread main executes, + // sometimes not... how fun :)) + s64 out = 0; svcGetSystemInfo(&out, 0x10000, 4); u32 multiConfig = (u32)out;