diff --git a/gfx/drivers/gl.c b/gfx/drivers/gl.c index c37dfe8819..3290fb471f 100644 --- a/gfx/drivers/gl.c +++ b/gfx/drivers/gl.c @@ -1789,6 +1789,12 @@ static void *gl_init(const video_info_t *video, if (!string_is_empty(version)) sscanf(version, "%d.%d", &gl->version_major, &gl->version_minor); +#ifdef _WIN32 + if (string_is_equal(vendor, "Microsoft Corporation")) + if (string_is_equal(renderer, "GDI Generic")) + rarch_force_video_driver_fallback("gdi"); +#endif + hwr = video_driver_get_hw_context(); if (hwr->context_type == RETRO_HW_CONTEXT_OPENGL_CORE) diff --git a/intl/msg_hash_us.h b/intl/msg_hash_us.h index ab207a72a4..8603980993 100644 --- a/intl/msg_hash_us.h +++ b/intl/msg_hash_us.h @@ -8112,3 +8112,7 @@ MSG_HASH( MENU_ENUM_LABEL_VALUE_DOWN_SELECT, "Down + Select" ) +MSG_HASH( + MENU_ENUM_LABEL_VALUE_VIDEO_DRIVER_FALLBACK, + "Your graphics driver is not compatible with the current video driver in RetroArch, falling back to the %s driver. Please restart RetroArch for the changes to take effect." + ) diff --git a/msg_hash.h b/msg_hash.h index 077ed3f10b..a5136c476b 100644 --- a/msg_hash.h +++ b/msg_hash.h @@ -2229,7 +2229,7 @@ enum msg_hash_enums MENU_ENUM_LABEL_VALUE_SWITCH_BACKLIGHT_CONTROL, MENU_ENUM_SUBLABEL_SWITCH_BACKLIGHT_CONTROL, #endif -#if defined(HAVE_LAKKA_SWITCH) || defined(HAVE_LIBNX) +#if defined(HAVE_LAKKA_SWITCH) || defined(HAVE_LIBNX) MENU_ENUM_LABEL_SWITCH_CPU_PROFILE, MENU_ENUM_LABEL_VALUE_SWITCH_CPU_PROFILE, MENU_ENUM_SUBLABEL_SWITCH_CPU_PROFILE, @@ -2243,6 +2243,7 @@ enum msg_hash_enums MENU_LABEL(MENU_SOUND_CANCEL), MENU_LABEL(MENU_SOUND_NOTICE), MENU_LABEL(MENU_SOUND_BGM), + MENU_ENUM_LABEL_VALUE_VIDEO_DRIVER_FALLBACK, MSG_LAST }; diff --git a/retroarch.c b/retroarch.c index bee9cd1af2..3efaa4e2d2 100644 --- a/retroarch.c +++ b/retroarch.c @@ -3769,3 +3769,39 @@ char *get_retroarch_launch_arguments(void) { return launch_arguments; } + +void rarch_force_video_driver_fallback(const char *driver) +{ + settings_t *settings = config_get_ptr(); + ui_msg_window_t *msg_window = NULL; + + strlcpy(settings->arrays.video_driver, driver, sizeof(settings->arrays.video_driver)); + + command_event(CMD_EVENT_MENU_SAVE_CURRENT_CONFIG, NULL); + +#ifdef _WIN32 + /* UI companion driver is not inited yet, just call into it directly */ + msg_window = &ui_msg_window_win32; +#endif + + if (msg_window) + { + ui_msg_window_state window_state = {0}; + char *title = strdup(msg_hash_to_str(MSG_ERROR)); + char text[PATH_MAX_LENGTH]; + + text[0] = '\0'; + + snprintf(text, sizeof(text), msg_hash_to_str(MENU_ENUM_LABEL_VALUE_VIDEO_DRIVER_FALLBACK), driver); + + window_state.buttons = UI_MSG_WINDOW_OK; + window_state.title = title; + window_state.text = strdup(text); + + msg_window->error(&window_state); + + free(title); + } + + exit(1); +} diff --git a/retroarch.h b/retroarch.h index da182d72fe..419ef9072b 100644 --- a/retroarch.h +++ b/retroarch.h @@ -404,6 +404,8 @@ void runloop_msg_queue_lock(void); void runloop_msg_queue_unlock(void); #endif +void rarch_force_video_driver_fallback(const char *driver); + RETRO_END_DECLS #endif