diff --git a/config.def.h b/config.def.h index 2dfa1c76d3..579cfe4312 100644 --- a/config.def.h +++ b/config.def.h @@ -951,6 +951,12 @@ static const bool video_3ds_lcd_bottom = true; static const unsigned video_3ds_display_mode = CTR_VIDEO_MODE_3D; #endif +#ifdef WIIU +/* On Wii U, whether to optimize for the native TV resolution + * or exactly 2x the Wii U GamePad resolution. */ +#define DEFAULT_WIIU_PREFER_DRC false +#endif + /* AUDIO */ /* Will enable audio or not. */ diff --git a/configuration.c b/configuration.c index d2549ef617..6bcae50599 100644 --- a/configuration.c +++ b/configuration.c @@ -1980,6 +1980,10 @@ static struct config_bool_setting *populate_settings_bool( SETTING_BOOL("video_3ds_lcd_bottom", &settings->bools.video_3ds_lcd_bottom, true, video_3ds_lcd_bottom, false); #endif +#ifdef WIIU + SETTING_BOOL("video_wiiu_prefer_drc", &settings->bools.video_wiiu_prefer_drc, true, DEFAULT_WIIU_PREFER_DRC, false); +#endif + SETTING_BOOL("playlist_use_old_format", &settings->bools.playlist_use_old_format, true, DEFAULT_PLAYLIST_USE_OLD_FORMAT, false); SETTING_BOOL("playlist_compression", &settings->bools.playlist_compression, true, DEFAULT_PLAYLIST_COMPRESSION, false); SETTING_BOOL("content_runtime_log", &settings->bools.content_runtime_log, true, DEFAULT_CONTENT_RUNTIME_LOG, false); diff --git a/configuration.h b/configuration.h index 4dfae63259..6ee240a491 100644 --- a/configuration.h +++ b/configuration.h @@ -565,6 +565,7 @@ typedef struct settings bool video_memory_show; bool video_msg_bgcolor_enable; bool video_3ds_lcd_bottom; + bool video_wiiu_prefer_drc; bool video_notch_write_over_enable; #ifdef HAVE_VIDEO_LAYOUT bool video_layout_enable; diff --git a/gfx/drivers/gx2_gfx.c b/gfx/drivers/gx2_gfx.c index 5b7b362bbf..d81d2db5b3 100644 --- a/gfx/drivers/gx2_gfx.c +++ b/gfx/drivers/gx2_gfx.c @@ -195,6 +195,7 @@ static void *wiiu_gfx_init(const video_info_t *video, wiiu_video_t *wiiu = (wiiu_video_t*)calloc(1, sizeof(*wiiu)); settings_t *settings = config_get_ptr(); const char *input_joypad_driver = settings->arrays.input_joypad_driver; + bool prefer_drc = settings->bools.video_wiiu_prefer_drc; if (!wiiu) return NULL; @@ -251,8 +252,16 @@ static void *wiiu_gfx_init(const video_info_t *video, memset(&wiiu->color_buffer, 0, sizeof(GX2ColorBuffer)); wiiu->color_buffer.surface.dim = GX2_SURFACE_DIM_TEXTURE_2D; - wiiu->color_buffer.surface.width = wiiu->render_mode.width; - wiiu->color_buffer.surface.height = wiiu->render_mode.height; + if (wiiu->render_mode.height != 480 && prefer_drc) + { + wiiu->color_buffer.surface.width = 1708; + wiiu->color_buffer.surface.height = 960; + } + else + { + wiiu->color_buffer.surface.width = wiiu->render_mode.width; + wiiu->color_buffer.surface.height = wiiu->render_mode.height; + } wiiu->color_buffer.surface.depth = 1; wiiu->color_buffer.surface.mipLevels = 1; wiiu->color_buffer.surface.format = GX2_SURFACE_FORMAT_UNORM_R8_G8_B8_A8; @@ -436,18 +445,28 @@ static void *wiiu_gfx_init(const video_info_t *video, GX2SetTVEnable(GX2_ENABLE); GX2SetDRCEnable(GX2_ENABLE); - wiiu->keep_aspect = true; - wiiu->should_resize = true; - wiiu->smooth = video->smooth; - wiiu->vsync = video->vsync; + wiiu->keep_aspect = true; + wiiu->should_resize = true; + wiiu->smooth = video->smooth; + wiiu->vsync = video->vsync; GX2SetSwapInterval(!!video->vsync); - wiiu->vp.x = 0; - wiiu->vp.y = 0; - wiiu->vp.width = wiiu->render_mode.width; - wiiu->vp.height = wiiu->render_mode.height; - wiiu->vp.full_width = wiiu->render_mode.width; - wiiu->vp.full_height = wiiu->render_mode.height; + wiiu->vp.x = 0; + wiiu->vp.y = 0; + if (wiiu->render_mode.height != 480 && prefer_drc) + { + wiiu->vp.width = 1708; + wiiu->vp.height = 960; + wiiu->vp.full_width = 1708; + wiiu->vp.full_height = 960; + } + else + { + wiiu->vp.width = wiiu->render_mode.width; + wiiu->vp.height = wiiu->render_mode.height; + wiiu->vp.full_width = wiiu->render_mode.width; + wiiu->vp.full_height = wiiu->render_mode.height; + } video_driver_set_size(wiiu->vp.width, wiiu->vp.height); driver_ctl(RARCH_DRIVER_CTL_SET_REFRESH_RATE, &refresh_rate); diff --git a/intl/msg_hash_lbl.h b/intl/msg_hash_lbl.h index 2aa44f98fa..eca517f388 100644 --- a/intl/msg_hash_lbl.h +++ b/intl/msg_hash_lbl.h @@ -3424,6 +3424,12 @@ MSG_HASH( MENU_ENUM_LABEL_VIDEO_MONITOR_INDEX, "video_monitor_index" ) +#if defined(WIIU) +MSG_HASH( + MENU_ENUM_LABEL_VIDEO_WIIU_PREFER_DRC, + "video_wiiu_prefer_drc" + ) +#endif MSG_HASH( MENU_ENUM_LABEL_VIDEO_WINDOW_OFFSET_X, "video_window_offset_x" diff --git a/intl/msg_hash_us.h b/intl/msg_hash_us.h index 25a87d8e4e..ce71734753 100644 --- a/intl/msg_hash_us.h +++ b/intl/msg_hash_us.h @@ -1540,6 +1540,16 @@ MSG_HASH( MENU_ENUM_SUBLABEL_VIDEO_MONITOR_INDEX, "Select which display screen to use." ) +#if defined (WIIU) +MSG_HASH( + MENU_ENUM_LABEL_VALUE_VIDEO_WIIU_PREFER_DRC, + "Optimize for Wii U GamePad (Restart Required)" + ) +MSG_HASH( + MENU_ENUM_SUBLABEL_VIDEO_WIIU_PREFER_DRC, + "Use an exact 2x scale of the GamePad as the viewport. Disable to display at the native TV resolution." + ) +#endif MSG_HASH( MENU_ENUM_LABEL_VALUE_VIDEO_ROTATION, "Video Rotation" diff --git a/menu/cbs/menu_cbs_sublabel.c b/menu/cbs/menu_cbs_sublabel.c index 7f9762ca52..93437a6e91 100644 --- a/menu/cbs/menu_cbs_sublabel.c +++ b/menu/cbs/menu_cbs_sublabel.c @@ -1076,6 +1076,10 @@ DEFAULT_SUBLABEL_MACRO(action_bind_sublabel_video_3ds_lcd_bottom, MENU DEFAULT_SUBLABEL_MACRO(action_bind_sublabel_video_3ds_display_mode, MENU_ENUM_SUBLABEL_VIDEO_3DS_DISPLAY_MODE) #endif +#if defined (WIIU) +DEFAULT_SUBLABEL_MACRO(action_bind_sublabel_video_wiiu_prefer_drc, MENU_ENUM_SUBLABEL_VIDEO_WIIU_PREFER_DRC) +#endif + #if defined(GEKKO) DEFAULT_SUBLABEL_MACRO(action_bind_sublabel_video_overscan_correction_top, MENU_ENUM_SUBLABEL_VIDEO_OVERSCAN_CORRECTION_TOP) DEFAULT_SUBLABEL_MACRO(action_bind_sublabel_video_overscan_correction_bottom, MENU_ENUM_SUBLABEL_VIDEO_OVERSCAN_CORRECTION_BOTTOM) @@ -4483,6 +4487,11 @@ int menu_cbs_init_bind_sublabel(menu_file_list_cbs_t *cbs, BIND_ACTION_SUBLABEL(cbs, action_bind_sublabel_video_3ds_display_mode); break; #endif +#if defined(WIIU) + case MENU_ENUM_LABEL_VIDEO_WIIU_PREFER_DRC: + BIND_ACTION_SUBLABEL(cbs, action_bind_sublabel_video_wiiu_prefer_drc); + break; +#endif #if defined(GEKKO) case MENU_ENUM_LABEL_VIDEO_OVERSCAN_CORRECTION_TOP: BIND_ACTION_SUBLABEL(cbs, action_bind_sublabel_video_overscan_correction_top); diff --git a/menu/menu_displaylist.c b/menu/menu_displaylist.c index 19f788cb74..facf9ddaad 100644 --- a/menu/menu_displaylist.c +++ b/menu/menu_displaylist.c @@ -8014,6 +8014,13 @@ unsigned menu_displaylist_build_list( PARSE_ONLY_UINT, false) == 0) count++; +#if defined(WIIU) + if (MENU_DISPLAYLIST_PARSE_SETTINGS_ENUM(list, + MENU_ENUM_LABEL_VIDEO_WIIU_PREFER_DRC, + PARSE_ONLY_BOOL, false) == 0) + count++; +#endif + #if defined(GEKKO) || defined(PS2) || !defined(__PSL1GHT__) && defined(__PS3__) if (true) #else diff --git a/menu/menu_setting.c b/menu/menu_setting.c index 166667506e..6faad4d102 100644 --- a/menu/menu_setting.c +++ b/menu/menu_setting.c @@ -11268,6 +11268,23 @@ static bool setting_append_list( } #endif +#ifdef WIIU + CONFIG_BOOL( + list, list_info, + &settings->bools.video_wiiu_prefer_drc, + MENU_ENUM_LABEL_VIDEO_WIIU_PREFER_DRC, + MENU_ENUM_LABEL_VALUE_VIDEO_WIIU_PREFER_DRC, + DEFAULT_WIIU_PREFER_DRC, + 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); +#endif + if (video_driver_has_windowed()) { CONFIG_ACTION( diff --git a/msg_hash.h b/msg_hash.h index 51a72f88fb..6072a04a40 100644 --- a/msg_hash.h +++ b/msg_hash.h @@ -1121,6 +1121,7 @@ enum msg_hash_enums MENU_LABEL(VIDEO_SWAP_INTERVAL), MENU_LABEL(VIDEO_FULLSCREEN), MENU_LABEL(VIDEO_MONITOR_INDEX), + MENU_LABEL(VIDEO_WIIU_PREFER_DRC), MENU_LABEL(VIDEO_WINDOW_SCALE), MENU_LABEL(VIDEO_WINDOW_OFFSET_X), MENU_LABEL(VIDEO_WINDOW_OFFSET_Y),