diff --git a/cheevos/cheevos.c b/cheevos/cheevos.c index 2e863d4c26..2e4fa19594 100644 --- a/cheevos/cheevos.c +++ b/cheevos/cheevos.c @@ -1357,14 +1357,23 @@ static void rcheevos_start_session_async(retro_task_t* task) } #endif - rcheevos_show_game_placard(); - task_set_finished(task, true); if (rcheevos_end_load_state() == 0) rcheevos_fetch_badges(); } +static void rcheevos_start_session_finish(retro_task_t* task, void* data, void* userdata, const char* error) +{ + (void)task; + (void)data; + (void)userdata; + (void)error; + + /* this must be called on the main thread */ + rcheevos_show_game_placard(); +} + static void rcheevos_start_session(void) { retro_task_t* task; @@ -1391,6 +1400,7 @@ static void rcheevos_start_session(void) /* this is called on the primary thread. use a task to do the initialization on a background thread */ task = task_init(); task->handler = rcheevos_start_session_async; + task->callback = rcheevos_start_session_finish; task_queue_push(task); } diff --git a/cheevos/cheevos_menu.c b/cheevos/cheevos_menu.c index 44bab9744f..f47366f46b 100644 --- a/cheevos/cheevos_menu.c +++ b/cheevos/cheevos_menu.c @@ -657,6 +657,9 @@ uintptr_t rcheevos_get_badge_texture(const char *badge, bool locked) if (!badge) return 0; + /* OpenGL driver crashes if gfx_display_reset_textures_list is called on a background thread */ + retro_assert(task_is_on_main_thread()); + snprintf(badge_file, sizeof(badge_file), "%s%s%s", badge, locked ? "_lock" : "", FILE_PATH_PNG_EXTENSION);