diff --git a/gfx/drivers_context/wgl_ctx.c b/gfx/drivers_context/wgl_ctx.c index 78c1ba429e..38638e354e 100644 --- a/gfx/drivers_context/wgl_ctx.c +++ b/gfx/drivers_context/wgl_ctx.c @@ -85,6 +85,8 @@ #endif #endif +static void gfx_ctx_wgl_destroy(void *data); + #if defined(HAVE_OPENGL) || defined(HAVE_OPENGL1) || defined(HAVE_OPENGL_CORE) typedef HGLRC (APIENTRY *wglCreateContextAttribsProc)(HDC, HGLRC, const int*); static wglCreateContextAttribsProc pcreate_context; @@ -563,7 +565,7 @@ static void *gfx_ctx_wgl_init(video_frame_info_t *video_info, void *video_driver return NULL; if (g_win32_inited) - goto error; + gfx_ctx_wgl_destroy(NULL); #ifdef HAVE_DYNAMIC dll_handle = dylib_load("OpenGL32.dll"); diff --git a/intl/msg_hash_ja.h b/intl/msg_hash_ja.h index 02ac63310e..72b88322c9 100644 --- a/intl/msg_hash_ja.h +++ b/intl/msg_hash_ja.h @@ -9231,10 +9231,6 @@ MSG_HASH( MENU_ENUM_SUBLABEL_DISC_INFORMATION, "挿入されたディスクの情報を表示します。" ) -MSG_HASH( - MSG_INCOMPATIBLE_CORE_FOR_VIDEO_DRIVER, - "このコアは設定されたビデオドライバに対応しません。" -) MSG_HASH( MENU_ENUM_LABEL_VALUE_QT_RESET, "リセット" diff --git a/intl/msg_hash_ko.h b/intl/msg_hash_ko.h index 915bf577c1..5b3fdeed67 100644 --- a/intl/msg_hash_ko.h +++ b/intl/msg_hash_ko.h @@ -9107,10 +9107,6 @@ MSG_HASH( MENU_ENUM_SUBLABEL_DISC_INFORMATION, "삽입된 미디어 디스크의 정보를 봅니다." ) -MSG_HASH( - MSG_INCOMPATIBLE_CORE_FOR_VIDEO_DRIVER, - "현재 코어가 비디오 드라이버와 호환되지 않습니다." - ) MSG_HASH( MENU_ENUM_LABEL_VALUE_QT_RESET, "초기화" diff --git a/intl/msg_hash_pt_br.h b/intl/msg_hash_pt_br.h index 89265044a3..aa2d1bab75 100644 --- a/intl/msg_hash_pt_br.h +++ b/intl/msg_hash_pt_br.h @@ -9111,10 +9111,6 @@ MSG_HASH( MENU_ENUM_SUBLABEL_DISC_INFORMATION, "Ver informações sobre discos de mídia inseridos." ) -MSG_HASH( - MSG_INCOMPATIBLE_CORE_FOR_VIDEO_DRIVER, - "Este núcleo não é compatível com o driver de vídeo atual." - ) MSG_HASH( MENU_ENUM_LABEL_VALUE_QT_RESET, "Reiniciar" diff --git a/intl/msg_hash_us.h b/intl/msg_hash_us.h index f6e6a43dfa..f9fd0d0aac 100644 --- a/intl/msg_hash_us.h +++ b/intl/msg_hash_us.h @@ -9202,10 +9202,6 @@ MSG_HASH( MENU_ENUM_SUBLABEL_DISC_INFORMATION, "View information about inserted media discs." ) -MSG_HASH( - MSG_INCOMPATIBLE_CORE_FOR_VIDEO_DRIVER, - "This core is not compatible with the current video driver." - ) MSG_HASH( MENU_ENUM_LABEL_VALUE_QT_RESET, "Reset" diff --git a/menu/menu_displaylist.c b/menu/menu_displaylist.c index 8af1e99b55..5437e70486 100644 --- a/menu/menu_displaylist.c +++ b/menu/menu_displaylist.c @@ -4773,9 +4773,6 @@ unsigned menu_displaylist_build_list(file_list_t *list, enum menu_displaylist_ct case DISPLAYLIST_LATENCY_SETTINGS_LIST: { menu_displaylist_build_info_t build_list[] = { - {MENU_ENUM_LABEL_VIDEO_MAX_SWAPCHAIN_IMAGES, PARSE_ONLY_UINT }, - {MENU_ENUM_LABEL_VIDEO_HARD_SYNC, PARSE_ONLY_BOOL }, - {MENU_ENUM_LABEL_VIDEO_HARD_SYNC_FRAMES, PARSE_ONLY_UINT }, {MENU_ENUM_LABEL_VIDEO_FRAME_DELAY, PARSE_ONLY_UINT }, {MENU_ENUM_LABEL_AUDIO_LATENCY, PARSE_ONLY_UINT }, {MENU_ENUM_LABEL_INPUT_POLL_TYPE_BEHAVIOR, PARSE_ONLY_UINT }, @@ -4786,6 +4783,25 @@ unsigned menu_displaylist_build_list(file_list_t *list, enum menu_displaylist_ct {MENU_ENUM_LABEL_RUN_AHEAD_HIDE_WARNINGS, PARSE_ONLY_BOOL }, }; + if (video_driver_test_all_flags(GFX_CTX_FLAGS_CUSTOMIZABLE_SWAPCHAIN_IMAGES)) + { + menu_displaylist_parse_settings_enum(list, + MENU_ENUM_LABEL_VIDEO_MAX_SWAPCHAIN_IMAGES, + PARSE_ONLY_UINT, false); + count++; + } + if (video_driver_test_all_flags(GFX_CTX_FLAGS_HARD_SYNC)) + { + menu_displaylist_parse_settings_enum(list, + MENU_ENUM_LABEL_VIDEO_HARD_SYNC, + PARSE_ONLY_BOOL, false); + count++; + menu_displaylist_parse_settings_enum(list, + MENU_ENUM_LABEL_VIDEO_HARD_SYNC_FRAMES, + PARSE_ONLY_UINT, false); + count++; + } + for (i = 0; i < ARRAY_SIZE(build_list); i++) { if (menu_displaylist_parse_settings_enum(list, @@ -7421,18 +7437,24 @@ bool menu_displaylist_ctl(enum menu_displaylist_ctl_state type, menu_displaylist_parse_settings_enum(info->list, MENU_ENUM_LABEL_VIDEO_ADAPTIVE_VSYNC, PARSE_ONLY_BOOL, false); - if (menu_displaylist_parse_settings_enum(info->list, - MENU_ENUM_LABEL_VIDEO_MAX_SWAPCHAIN_IMAGES, - PARSE_ONLY_UINT, false) == 0) + if (video_driver_test_all_flags(GFX_CTX_FLAGS_CUSTOMIZABLE_SWAPCHAIN_IMAGES)) + { + menu_displaylist_parse_settings_enum(info->list, + MENU_ENUM_LABEL_VIDEO_MAX_SWAPCHAIN_IMAGES, + PARSE_ONLY_UINT, false); count++; - if (menu_displaylist_parse_settings_enum(info->list, + } + if (video_driver_test_all_flags(GFX_CTX_FLAGS_HARD_SYNC)) + { + menu_displaylist_parse_settings_enum(info->list, MENU_ENUM_LABEL_VIDEO_HARD_SYNC, - PARSE_ONLY_BOOL, false) == 0) + PARSE_ONLY_BOOL, false); count++; - if (menu_displaylist_parse_settings_enum(info->list, + menu_displaylist_parse_settings_enum(info->list, MENU_ENUM_LABEL_VIDEO_HARD_SYNC_FRAMES, - PARSE_ONLY_UINT, false) == 0) + PARSE_ONLY_UINT, false); count++; + } if (menu_displaylist_parse_settings_enum(info->list, MENU_ENUM_LABEL_VIDEO_FRAME_DELAY, PARSE_ONLY_UINT, false) == 0) diff --git a/menu/menu_setting.c b/menu/menu_setting.c index b2181f957c..757250d497 100644 --- a/menu/menu_setting.c +++ b/menu/menu_setting.c @@ -9574,55 +9574,48 @@ static bool setting_append_list( SETTINGS_DATA_LIST_CURRENT_ADD_FLAGS(list, list_info, SD_FLAG_CMD_APPLY_AUTO); SETTINGS_DATA_LIST_CURRENT_ADD_FLAGS(list, list_info, SD_FLAG_LAKKA_ADVANCED); - if (video_driver_test_all_flags(GFX_CTX_FLAGS_CUSTOMIZABLE_SWAPCHAIN_IMAGES)) - { - CONFIG_UINT( - list, list_info, - &settings->uints.video_max_swapchain_images, - MENU_ENUM_LABEL_VIDEO_MAX_SWAPCHAIN_IMAGES, - MENU_ENUM_LABEL_VALUE_VIDEO_MAX_SWAPCHAIN_IMAGES, - DEFAULT_MAX_SWAPCHAIN_IMAGES, - &group_info, - &subgroup_info, - parent_group, - general_write_handler, - general_read_handler); - menu_settings_list_current_add_range(list, list_info, 1, 4, 1, true, true); - SETTINGS_DATA_LIST_CURRENT_ADD_FLAGS(list, list_info, SD_FLAG_CMD_APPLY_AUTO); - } + CONFIG_UINT( + list, list_info, + &settings->uints.video_max_swapchain_images, + MENU_ENUM_LABEL_VIDEO_MAX_SWAPCHAIN_IMAGES, + MENU_ENUM_LABEL_VALUE_VIDEO_MAX_SWAPCHAIN_IMAGES, + DEFAULT_MAX_SWAPCHAIN_IMAGES, + &group_info, + &subgroup_info, + parent_group, + general_write_handler, + general_read_handler); + menu_settings_list_current_add_range(list, list_info, 1, 4, 1, true, true); + SETTINGS_DATA_LIST_CURRENT_ADD_FLAGS(list, list_info, SD_FLAG_CMD_APPLY_AUTO); - if (video_driver_test_all_flags(GFX_CTX_FLAGS_HARD_SYNC)) - { - CONFIG_BOOL( - list, list_info, - &settings->bools.video_hard_sync, - MENU_ENUM_LABEL_VIDEO_HARD_SYNC, - MENU_ENUM_LABEL_VALUE_VIDEO_HARD_SYNC, - DEFAULT_HARD_SYNC, - MENU_ENUM_LABEL_VALUE_OFF, - MENU_ENUM_LABEL_VALUE_ON, - &group_info, - &subgroup_info, - parent_group, - general_write_handler, - general_read_handler, - SD_FLAG_NONE - ); + CONFIG_BOOL( + list, list_info, + &settings->bools.video_hard_sync, + MENU_ENUM_LABEL_VIDEO_HARD_SYNC, + MENU_ENUM_LABEL_VALUE_VIDEO_HARD_SYNC, + DEFAULT_HARD_SYNC, + MENU_ENUM_LABEL_VALUE_OFF, + MENU_ENUM_LABEL_VALUE_ON, + &group_info, + &subgroup_info, + parent_group, + general_write_handler, + general_read_handler, + SD_FLAG_NONE); - CONFIG_UINT( - list, list_info, - &settings->uints.video_hard_sync_frames, - MENU_ENUM_LABEL_VIDEO_HARD_SYNC_FRAMES, - MENU_ENUM_LABEL_VALUE_VIDEO_HARD_SYNC_FRAMES, - DEFAULT_HARD_SYNC_FRAMES, - &group_info, - &subgroup_info, - parent_group, - general_write_handler, - general_read_handler); - (*list)[list_info->index - 1].action_ok = &setting_action_ok_uint; - menu_settings_list_current_add_range(list, list_info, 0, 3, 1, true, true); - } + CONFIG_UINT( + list, list_info, + &settings->uints.video_hard_sync_frames, + MENU_ENUM_LABEL_VIDEO_HARD_SYNC_FRAMES, + MENU_ENUM_LABEL_VALUE_VIDEO_HARD_SYNC_FRAMES, + DEFAULT_HARD_SYNC_FRAMES, + &group_info, + &subgroup_info, + parent_group, + general_write_handler, + general_read_handler); + (*list)[list_info->index - 1].action_ok = &setting_action_ok_uint; + menu_settings_list_current_add_range(list, list_info, 0, 3, 1, true, true); if (video_driver_test_all_flags(GFX_CTX_FLAGS_ADAPTIVE_VSYNC)) { diff --git a/msg_hash.h b/msg_hash.h index 7a2db5e9c9..8d3dba037b 100644 --- a/msg_hash.h +++ b/msg_hash.h @@ -2599,7 +2599,6 @@ enum msg_hash_enums MSG_DISC_DUMP_FAILED_TO_READ_FROM_DRIVE, MSG_DISC_DUMP_FAILED_TO_WRITE_TO_DISK, MSG_NO_DISC_INSERTED, - MSG_INCOMPATIBLE_CORE_FOR_VIDEO_DRIVER, MENU_LABEL(DELETE_PLAYLIST), MSG_LAST diff --git a/retroarch.c b/retroarch.c index c597e89255..e38eb1c447 100644 --- a/retroarch.c +++ b/retroarch.c @@ -942,7 +942,7 @@ static char current_library_name[1024] = {0}; static char current_library_version[1024] = {0}; static char current_valid_extensions[1024] = {0}; static char error_string[255] = {0}; - +static char cached_video_driver[32] = {0}; #ifdef HAVE_MENU /* MENU INPUT GLOBAL VARIABLES */ @@ -4964,6 +4964,13 @@ bool command_event(enum event_command cmd, void *data) command_event_save_auto_state(); command_event_disable_overrides(); retroarch_unset_runtime_shader_preset(); + + if (cached_video_driver[0]) + { + settings_t *settings = configuration_settings; + strcpy(settings->arrays.video_driver, cached_video_driver); + cached_video_driver[0] = 0; + } if ( runloop_remaps_core_active || runloop_remaps_content_dir_active @@ -6121,6 +6128,12 @@ static void global_free(void) void main_exit(void *args) { settings_t *settings = configuration_settings; + + if (cached_video_driver[0]) + { + strcpy(settings->arrays.video_driver, cached_video_driver); + cached_video_driver[0] = 0; + } if (settings->bools.config_save_on_exit) command_event(CMD_EVENT_MENU_SAVE_CURRENT_CONFIG, NULL); @@ -7268,39 +7281,6 @@ static bool dynamic_request_hw_context(enum retro_hw_context_type type, return true; } -static bool dynamic_verify_hw_context(enum retro_hw_context_type type, - unsigned minor, unsigned major) -{ - const char *video_ident = (current_video) ? current_video->ident : NULL; - - switch (type) - { - case RETRO_HW_CONTEXT_VULKAN: - if (!string_is_equal(video_ident, "vulkan")) - return false; - break; - case RETRO_HW_CONTEXT_OPENGLES2: - case RETRO_HW_CONTEXT_OPENGLES3: - case RETRO_HW_CONTEXT_OPENGLES_VERSION: - case RETRO_HW_CONTEXT_OPENGL: - case RETRO_HW_CONTEXT_OPENGL_CORE: - if (!string_is_equal(video_ident, "gl") && - !string_is_equal(video_ident, "glcore")) - { - return false; - } - break; - case RETRO_HW_CONTEXT_DIRECT3D: - if (!(string_is_equal(video_ident, "d3d11") && major == 11)) - return false; - break; - default: - break; - } - - return true; -} - static void rarch_log_libretro(enum retro_log_level level, const char *fmt, ...) { @@ -7867,10 +7847,6 @@ static bool rarch_environment_cb(unsigned cmd, void *data) cb->context_type, cb->version_minor, cb->version_major)) return false; - if (!dynamic_verify_hw_context( - cb->context_type, cb->version_minor, cb->version_major)) - return false; - #if defined(HAVE_OPENGL) || defined(HAVE_OPENGL_CORE) if (!gl_set_core_context(cb->context_type)) { } #endif @@ -19211,6 +19187,8 @@ static bool video_driver_find_driver(void) if (hwr && hw_render_context_is_vulkan(hwr->context_type)) { RARCH_LOG("[Video]: Using HW render, Vulkan driver forced.\n"); + strcpy(cached_video_driver, settings->arrays.video_driver); + strcpy(settings->arrays.video_driver, "vulkan"); current_video = &video_vulkan; } #endif @@ -19225,9 +19203,13 @@ static bool video_driver_find_driver(void) !string_is_equal(settings->arrays.video_driver, "glcore")) { #if defined(HAVE_OPENGL_CORE) + strcpy(cached_video_driver, settings->arrays.video_driver); + strcpy(settings->arrays.video_driver, "glcore"); current_video = &video_gl_core; RARCH_LOG("[Video]: Forcing \"glcore\" driver.\n"); #else + strcpy(cached_video_driver, settings->arrays.video_driver); + strcpy(settings->arrays.video_driver, "gl"); current_video = &video_gl2; RARCH_LOG("[Video]: Forcing \"gl\" driver.\n"); #endif @@ -21281,7 +21263,8 @@ static void drivers_init(int flags) { /* Initialize menu driver */ if (flags & DRIVER_MENU_MASK) - menu_driver_init(video_is_threaded); + if (!menu_driver_init(video_is_threaded)) + RARCH_ERR("Unable to init menu driver.\n"); } #else /* Qt uses core info, even if the menu is disabled */ diff --git a/tasks/task_content.c b/tasks/task_content.c index 80fbdab9eb..eff1695e4e 100644 --- a/tasks/task_content.c +++ b/tasks/task_content.c @@ -589,41 +589,6 @@ static bool content_load(content_ctx_info_t *info) char **rarch_argv_ptr = (char**)info->argv; int *rarch_argc_ptr = (int*)&info->argc; struct rarch_main_wrap *wrap_args = NULL; - core_info_t core_info = {0}; - core_info_list_t *core_info_list = NULL; - gfx_ctx_ident_t ident_info = {0}; - - video_context_driver_get_ident(&ident_info); - - /* only check for supported hw api on X11/GLX and Windows since that is where it is currently implemented */ -#ifdef HAVE_X11 - if (!string_is_empty(ident_info.ident) && string_is_equal(ident_info.ident, "x")) -#else -#if defined(_WIN32) && !defined(_XBOX) - if (!string_is_empty(ident_info.ident) && string_is_equal(ident_info.ident, "wgl")) -#endif -#endif - { - core_info_get_list(&core_info_list); - - if (core_info_list) - { - if (core_info_list_get_info(core_info_list, &core_info, path_get(RARCH_PATH_CORE))) - { - if (!core_info_hw_api_supported(&core_info)) - { - RARCH_ERR("This core is not compatible with the current video driver.\n"); - runloop_msg_queue_push( - msg_hash_to_str(MSG_INCOMPATIBLE_CORE_FOR_VIDEO_DRIVER), - 100, 250, true, NULL, - MESSAGE_QUEUE_ICON_DEFAULT, MESSAGE_QUEUE_CATEGORY_INFO); - return false; - } - else - RARCH_LOG("This core is compatible with the current video driver.\n"); - } - } - } wrap_args = (struct rarch_main_wrap*) calloc(1, sizeof(*wrap_args));