Merge pull request #6469 from alphanu1/master

CRT Switchres Capabilities
This commit is contained in:
Twinaphex 2018-04-15 16:56:15 +02:00 committed by GitHub
commit a2516d23a3
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
16 changed files with 558 additions and 9 deletions

View File

@ -205,6 +205,7 @@ OBJ += frontend/frontend.o \
gfx/video_coord_array.o \
gfx/video_display_server.o \
gfx/video_driver.o \
gfx/video_crt_switch.o \
camera/camera_driver.o \
wifi/wifi_driver.o \
location/location_driver.o \

112
README.md
View File

@ -144,3 +144,115 @@ To configure joypads, use the built-in menu or the `retroarch-joyconfig` command
## Compiling and installing
Instructions for compiling and installing RetroArch can be found in the [Libretro/RetroArch Documentation Center](https://docs.libretro.com/).
## CRT 15Khz Resolution Switching
CRT Switch res will turn on, on the fly. However, you will need to restart retroarch to disable it. With CRT SwitchRes enable Retroarch will start in 2560 x 480 @ 60.
If you are running windows, before enabling the CRT SwitchRes options pleasae make sure you have installed CRTEmudriver and installed some modelines. The minimum modelins for all games to switch correctly are:
- 2560 x 192 @ 60.000000
- 2560 x 200 @ 60.000000
- 2560 x 240 @ 60.000000
- 2560 x 224 @ 60.000000
- 2560 x 237 @ 60.000000
- 2560 x 256 @ 50.000000
- 2560 x 254 @ 55.000000
- 2560 x 448 @ 60.000000
- 2560 x 480 @ 60.000000
Install these modelines replacing 2560 with your desired super resuloution. The above resolutions are NTSC only so if you would be playing any PAL content please add pal modelines:
- 2560 x 192 @ 50.000000
- 2560 x 200 @ 50.000000
- 2560 x 240 @ 50.000000
- 2560 x 224 @ 50.000000
- 2560 x 288 @ 50.000000
- 2560 x 237 @ 50.000000
- 2560 x 254 @ 55.000000
- 2560 x 448 @ 50.000000
- 2560 x 480 @ 50.000000
Some games will require heigher PAL resolutions which should also be installed:
- 2560 x 512 @ 50.000000
- 2560 x 576 @ 50.000000
Ideally install all these modelines and everything will work great.
## Super Resolutions
The default super resolution is 2560. It is displayed just under the CRT switch option, which can be found in video settings. This can be changed within the retroarch.cfg. The only compatible resolutions are 1920, 2560 and 3840. Any other resolutions will be ignored and native swithing will be activated.
## Native Resolutions
If native reolutions are activeted you will need a whole new set of modelines:
- 512 x 240 @ 50.006977 SNESpal
- 512 x 224 @ 50.006977 SNESpal
- 512 x 448 @ 50.006977 SNESpal
- 512 x 240 @ 60.098812 SNESntsc
- 512 x 224 @ 60.098812 SNESntsc
- 512 x 448 @ 60.098812 SNESntsc
- 256 x 240 @ 50.006977 SNESpal
- 256 x 448 @ 50.006977 SNESpal
- 256 x 240 @ 60.098812 SNESntsc
- 256 x 448 @ 60.098812 SNESntsc
- 320 x 240 @ 59.922745 MDntsc
- 320 x 448 @ 59.922745 MDntp
- 320 x 480 @ 59.922745 MDntsc
- 256 x 192 @ 59.922745 MDntsc
- 320 x 224 @ 59.922745 MDntsc
- 256 x 224 @ 59.922745 MDntsc
- 320 x 288 @ 49.701458 MDpal
- 320 x 576 @ 49.701458 MDpal
- 256 x 192 @ 49.701458 MDpal
- 320 x 224 @ 49.701458 MDpal
- 320 x 240 @ 49.701458 MDpal
- 320 x 448 @ 49.701458 MDpal
- 320 x 480 @ 49.701458 MDpal
- 256 x 224 @ 49.701458 MDpal
- 256 x 288 @ 49.701458 MSYSpal
- 256 x 240 @ 60.098812 NESntsc
- 256 x 240 @ 50.006977 NESpal
- 640 x 480 @ 60.130001 N64ntsc
- 640 x 237 @ 60.130001 N64ntsc
- 640 x 240 @ 60.130001 N64ntsc
- 640 x 480 @ 50.000000 N64pal
- 640 x 576 @ 50.000000 n64pal
- 640 x 288 @ 50.000000 n64pal
- 256 x 252 @ 49.759998 PSXpal
- 384 x 252 @ 49.759998 PSXpal
- 640 x 540 @ 49.759998 PSXpal
- 320 x 252 @ 49.759998 PSXpal
- 640 x 252 @ 49.759998 PSXpal
- 384 x 240 @ 59.941002 PSXntsc
- 256 x 480 @ 59.941002 PSXntsc
- 352 x 240 @ 59.820000 Saturn/SGFX_NTSCp
- 704 x 240 @ 59.820000 SaturnNTSCp
- 352 x 480 @ 59.820000 SaturnNTSCi
- 704 x 480 @ 59.820000 SaturnNTSCi
- 352 x 288 @ 49.701458 SaturnPALp
- 704 x 288 @ 49.701458 SaturnPALp
- 352 x 576 @ 49.701458 SaturnPALi
- 704 x 576 @ 49.701458 SaturnPALi
- 240 x 160 @ 59.730000 GBA
- 320 x 200 @ 60.000000 Doom
// Arcade
- 400 x 254 @ 54.706841 MK
- 384 x 224 @ 59.637405 CPS1
These modelines are more acurate giving exact hz. However, some games may have unwanted results. This is due to mid-scanline resolution chages on the orgiginal hardware. For the best results super resolutions are the way to go.
## CRT resolution switching & Mame
Some arecade resolutions can be alot different. There is resolution detection to ensure mame games will be diplayed in the closest available resolution but drawn at their native resolution within this resolution. Meaning that the mame game will look just like the original hardware.
Mame roms that run in a vertical aspect like DoDonPachi need to be roted within mame before rolution swithing and aspect correction will work. Do this before enableing CRT switchRes so that Retroarch will run in your desktop resolution. Once you have roted any games that may need it switch CRT SwitchRes on.

View File

@ -67,6 +67,10 @@ static bool bundle_assets_extract_enable = false;
static bool materialui_icons_enable = true;
#endif
static const bool crt_switch_resolution = false;
static const int crt_switch_resolution_super = 2560;
static const bool def_history_list_enable = true;
static const bool def_playlist_entry_remove = true;
static const bool def_playlist_entry_rename = true;

View File

@ -1244,6 +1244,7 @@ static struct config_bool_setting *populate_settings_bool(settings_t *settings,
SETTING_BOOL("video_vsync", &settings->bools.video_vsync, true, vsync, false);
SETTING_BOOL("video_hard_sync", &settings->bools.video_hard_sync, true, hard_sync, false);
SETTING_BOOL("video_black_frame_insertion", &settings->bools.video_black_frame_insertion, true, black_frame_insertion, false);
SETTING_BOOL("crt_switch_resolution", &settings->bools.crt_switch_resolution, true, crt_switch_resolution, false);
SETTING_BOOL("video_disable_composition", &settings->bools.video_disable_composition, true, disable_composition, false);
SETTING_BOOL("pause_nonactive", &settings->bools.pause_nonactive, true, pause_nonactive, false);
SETTING_BOOL("video_gpu_screenshot", &settings->bools.video_gpu_screenshot, true, gpu_screenshot, false);
@ -1483,6 +1484,7 @@ static struct config_uint_setting *populate_settings_uint(settings_t *settings,
#endif
SETTING_UINT("audio_out_rate", &settings->uints.audio_out_rate, true, out_rate, false);
SETTING_UINT("custom_viewport_width", &settings->video_viewport_custom.width, false, 0 /* TODO */, false);
SETTING_UINT("crt_switch_resolution_super", &settings->uints.crt_switch_resolution_super, true, crt_switch_resolution_super, false);
SETTING_UINT("custom_viewport_height", &settings->video_viewport_custom.height, false, 0 /* TODO */, false);
SETTING_UINT("custom_viewport_x", (unsigned*)&settings->video_viewport_custom.x, false, 0 /* TODO */, false);
SETTING_UINT("custom_viewport_y", (unsigned*)&settings->video_viewport_custom.y, false, 0 /* TODO */, false);

View File

@ -95,6 +95,7 @@ typedef struct settings
bool video_statistics_show;
bool video_framecount_show;
bool video_msg_bgcolor_enable;
bool crt_switch_resolution;
/* Audio */
bool audio_enable;
@ -336,6 +337,7 @@ typedef struct settings
unsigned video_window_x;
unsigned video_window_y;
unsigned video_window_opacity;
unsigned crt_switch_resolution_super;
unsigned video_monitor_index;
unsigned video_fullscreen_x;
unsigned video_fullscreen_y;

294
gfx/video_crt_switch.c Normal file
View File

@ -0,0 +1,294 @@
/* CRT SwitchRes Core
* Copyright (C) 2018 Alphanu / Ben Templeman.
*
* RetroArch - A frontend for libretro.
* Copyright (C) 2010-2014 - Hans-Kristian Arntzen
* Copyright (C) 2011-2017 - Daniel De Matteis
*
* RetroArch is free software: you can redistribute it and/or modify it under the terms
* of the GNU General Public License as published by the Free Software Found-
* ation, either version 3 of the License, or (at your option) any later version.
*
* RetroArch is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY;
* without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR
* PURPOSE. See the GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License along with RetroArch.
* If not, see <http://www.gnu.org/licenses/>.
*/
#include <stddef.h>
#include <string.h>
#include <stdlib.h>
#if defined(_WIN32)
#include <windows.h>
#endif
#include "video_driver.h"
#include "video_crt_switch.h"
static float ra_tmp_core_hz;
static int ra_core_width;
static int ra_core_height;
static int ra_tmp_width;
static int ra_tmp_height;
static float fly_aspect;
static float ra_core_hz;
static int ra_set_core_hz;
static int orig_width;
static int orig_height;
static int first_run;
void crt_switch_res_core(int width, int height, float hz)
{
/* ben_core_hz float passed from with in void video_driver_monitor_adjust_system_rates(void) */
ra_core_width = width;
ra_core_height = height;
ra_core_hz = hz;
crt_check_first_run();
if (ra_tmp_height != ra_core_height || ra_core_width != ra_tmp_width)
{ /* detect resolution change and switch */
crt_screen_setup_aspect(width,height);
}
ra_tmp_height = ra_core_height;
ra_tmp_width = ra_core_width;
if (video_driver_get_aspect_ratio() != fly_aspect)
{ /* check aspect is correct else change */
video_driver_set_aspect_ratio_value((float)fly_aspect);
crt_poke_video();
}
}
void crt_check_first_run()
{ /* ruin of first boot to get current display resolution */
if (first_run != 1)
{
#if defined(_WIN32)
orig_height = GetSystemMetrics(SM_CYSCREEN);
orig_width = GetSystemMetrics(SM_CXSCREEN);
#endif
}
first_run = 1;
}
void crt_screen_setup_aspect(int width, int height)
{ /* create correct aspect to fit video if resolution does not exist */
switch_crt_hz();
/* get original resolution of core */
if (height == 4)
{
if (width < 1920)
{
width = 640;
}/* detect menu only */
height = 480;
crt_aspect_ratio_switch(width,height);
}
if (height < 191 && height != 144)
{
crt_aspect_ratio_switch(width,height);
height = 200;
}
if (height > 191)
{
crt_aspect_ratio_switch(width,height);
}
if (height == 144 && ra_set_core_hz == 50)
{
height = 288;
crt_aspect_ratio_switch(width,height);
}
if (height > 200 && height < 224)
{
crt_aspect_ratio_switch(width,height);
height = 224;
}
if (height > 224 && height < 240)
{
crt_aspect_ratio_switch(width,height);
height = 240;
}
if (height > 240 && height < 255 )
{
crt_aspect_ratio_switch(width,height);
height = 254;
}
if (height == 528 && ra_set_core_hz == 60)
{
crt_aspect_ratio_switch(width,height);
height = 480;
}
if (height >= 240 && height < 255 && ra_set_core_hz == 55)
{
crt_aspect_ratio_switch(width,height);
height = 254;
}
switch_res_crt(width, height);
}
void switch_res_crt(int width, int height){
if ( height > 100)
{
crt_switch_res(width, height,0,ra_set_core_hz);
crt_poke_video();
}
}
void crt_aspect_ratio_switch(int width,int height)
{ /* send aspect float to videeo_driver */
fly_aspect = (float)width/height;
video_driver_set_aspect_ratio_value((float)fly_aspect);
}
void switch_crt_hz()
{ /* set hz float an int for windows switching */
if (ra_core_hz != ra_tmp_core_hz)
{
if (ra_core_hz < 53 )
{
ra_set_core_hz = 50;
}
if (ra_core_hz >= 53 && ra_core_hz < 57)
{
ra_set_core_hz = 55;
}
if (ra_core_hz >= 57 )
{
ra_set_core_hz = 60;
}
video_monitor_set_refresh_rate(ra_set_core_hz);
ra_tmp_core_hz = ra_core_hz;
}
}
void crt_video_restore()
{
crt_switch_res(orig_width, orig_height,0,60);
}
void crt_switch_res(int width, int height, int f_restore,int ra_hz)
{ /* windows function to swith resolutions */
#if defined(_WIN32)
DEVMODE curDevmode;
DEVMODE devmode;
DWORD flags = 0;
int iModeNum;
int depth = 0;
int freq;
LONG res;
if (f_restore == 0)
{
freq = ra_hz;
}
else
{
freq = 0;
}
EnumDisplaySettings(NULL, ENUM_CURRENT_SETTINGS, &curDevmode);
if (width == curDevmode.dmPelsWidth)
{
width = 0; /* used to stop superresolution bug */
}
if (width == 0)
{
width = curDevmode.dmPelsWidth;
}
if (height == 0)
{
height = curDevmode.dmPelsHeight;
}
if (depth == 0)
{
depth = curDevmode.dmBitsPerPel;
}
if (freq == 0)
{
freq = curDevmode.dmDisplayFrequency;
}
for (iModeNum = 0; ; iModeNum++)
{
if (EnumDisplaySettings(NULL, iModeNum, &devmode))
{
if (devmode.dmPelsWidth != width)
{
continue;
}
if (devmode.dmPelsHeight != height)
{
continue;
}
if (devmode.dmBitsPerPel != depth)
{
continue;
}
if (devmode.dmDisplayFrequency != freq)
{
continue;
}
devmode.dmFields |= DM_PELSWIDTH | DM_PELSHEIGHT | DM_BITSPERPEL | DM_DISPLAYFREQUENCY;
res = ChangeDisplaySettings(&devmode, CDS_TEST);
switch (res)
{
case DISP_CHANGE_SUCCESSFUL:
res = ChangeDisplaySettings(&devmode, flags);
switch (res)
{
case DISP_CHANGE_SUCCESSFUL:
return;
case DISP_CHANGE_NOTUPDATED:
return;
default:
break;
}
break;
case DISP_CHANGE_RESTART:
break;
default:
break;
}
}
else
{
break;
}
}
#endif
#if defined(linux)
#endif
}

27
gfx/video_crt_switch.h Normal file
View File

@ -0,0 +1,27 @@
/* CRT SwitchRes Core
* Copyright (C) 2018 Alphanu / Ben Templeman.
*
* RetroArch - A frontend for libretro.
* Copyright (C) 2010-2014 - Hans-Kristian Arntzen
* Copyright (C) 2011-2017 - Daniel De Matteis
*
* RetroArch is free software: you can redistribute it and/or modify it under the terms
* of the GNU General Public License as published by the Free Software Found-
* ation, either version 3 of the License, or (at your option) any later version.
*
* RetroArch is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY;
* without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR
* PURPOSE. See the GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License along with RetroArch.
* If not, see <http://www.gnu.org/licenses/>.
*/
void crt_check_first_run();
void crt_switch_res_core(int width, int height, float hz);
void crt_screen_setup_aspect(int width, int height);
void switch_res_crt(int width, int height);
void crt_aspect_ratio_switch(int width,int height);
void switch_crt_hz();
void crt_video_restore();
void crt_switch_res(int width, int height, int f_restore,int ra_hz);

View File

@ -52,6 +52,7 @@
#include "video_thread_wrapper.h"
#include "video_driver.h"
#include "video_display_server.h"
#include "video_crt_switch.h"
#include "../frontend/frontend_driver.h"
#include "../record/record_driver.h"
@ -118,6 +119,10 @@
#define video_driver_context_unlock() ((void)0)
#endif
static bool crt_switching_active;
static float video_driver_core_hz;
typedef struct video_pixel_scaler
{
struct scaler_ctx *scaler;
@ -1415,13 +1420,19 @@ void video_driver_monitor_adjust_system_rates(void)
const struct retro_system_timing *info = (const struct retro_system_timing*)&video_driver_av_info.timing;
rarch_ctl(RARCH_CTL_UNSET_NONBLOCK_FORCED, NULL);
video_driver_core_hz = info->fps;
if (!info || info->fps <= 0.0)
return;
timing_skew = fabs(1.0f - info->fps / video_refresh_rate);
if (crt_switching_active == true)
{
timing_skew = fabs(1.0f - info->fps / video_driver_core_hz);
}
else
{
timing_skew = fabs(1.0f - info->fps / video_refresh_rate);
}
/* We don't want to adjust pitch too much. If we have extreme cases,
* just don't readjust at all. */
if (timing_skew <= settings->floats.audio_max_timing_skew)
@ -1430,10 +1441,16 @@ void video_driver_monitor_adjust_system_rates(void)
RARCH_LOG("[Video]: Timings deviate too much. Will not adjust. (Display = %.2f Hz, Game = %.2f Hz)\n",
video_refresh_rate,
(float)info->fps);
if (info->fps <= video_refresh_rate)
return;
if (crt_switching_active == true){
if (info->fps <= video_driver_core_hz)
return;
}
else
{
if (info->fps <= video_refresh_rate)
return;
}
/* We won't be able to do VSync reliably when game FPS > monitor FPS. */
rarch_ctl(RARCH_CTL_SET_NONBLOCK_FORCED, NULL);
RARCH_LOG("[Video]: Game FPS > Monitor FPS. Cannot rely on VSync.\n");
@ -1561,6 +1578,7 @@ static void video_driver_lock_new(void)
void video_driver_destroy(void)
{
video_display_server_destroy();
crt_video_restore();
video_driver_cb_has_focus = null_driver_has_focus;
video_driver_use_rgba = false;
video_driver_data_own = false;
@ -2584,6 +2602,31 @@ void video_driver_frame(const void *data, unsigned width,
/* Display the FPS, with a higher priority. */
if (video_info.fps_show)
runloop_msg_queue_push(video_info.fps_text, 2, 1, true);
/* trigger set resolution*/
if (video_info.crt_switch_resolution == true){
crt_switching_active = true;
if (video_info.crt_switch_resolution_super == 2560){
width = 2560;
}
if (video_info.crt_switch_resolution_super == 3840){
width = 3840;
}
if (video_info.crt_switch_resolution_super == 1920){
width = 1920;
}
crt_switch_res_core(width, height, video_driver_core_hz);
} else if (video_info.crt_switch_resolution == false){
crt_switching_active = false;
}
/* trigger set resolution*/
}
void crt_poke_video(){
video_driver_poke->apply_state_changes(video_driver_data);
}
void video_driver_display_type_set(enum rarch_display_type type)
@ -2676,8 +2719,9 @@ void video_driver_build_info(video_frame_info_t *video_info)
settings = config_get_ptr();
custom_vp = &settings->video_viewport_custom;
video_info->refresh_rate = settings->floats.video_refresh_rate;
video_info->black_frame_insertion =
settings->bools.video_black_frame_insertion;
video_info->crt_switch_resolution = settings->bools.crt_switch_resolution;
video_info->crt_switch_resolution_super = settings->uints.crt_switch_resolution_super;
video_info->black_frame_insertion = settings->bools.video_black_frame_insertion;
video_info->hard_sync = settings->bools.video_hard_sync;
video_info->hard_sync_frames = settings->uints.video_hard_sync_frames;
video_info->fps_show = settings->bools.video_fps_show;

View File

@ -71,6 +71,12 @@ RETRO_BEGIN_DECLS
#define MAX_VARIABLES 64
/* Added for resolution wswitching */
void crt_poke_video();
/* Added for resolution wswitching */
enum
{
TEXTURES = 8,
@ -403,6 +409,7 @@ typedef struct video_frame_info
bool black_frame_insertion;
bool hard_sync;
bool fps_show;
bool crt_switch_resolution;
bool statistics_show;
bool framecount_show;
bool scale_integer;
@ -428,6 +435,7 @@ typedef struct video_frame_info
unsigned aspect_ratio_idx;
unsigned max_swapchain_images;
unsigned monitor_index;
unsigned crt_switch_resolution_super;
unsigned width;
unsigned height;
unsigned xmb_theme;

View File

@ -798,6 +798,7 @@ AUDIO
DRIVERS
============================================================ */
#include "../gfx/video_driver.c"
#include "../gfx/video_crt_switch.c"
#include "../gfx/video_display_server.c"
#include "../gfx/video_coord_array.c"
#include "../input/input_driver.c"

View File

@ -1095,6 +1095,10 @@ MSG_HASH(MENU_ENUM_LABEL_USE_THIS_DIRECTORY,
"use_this_directory")
MSG_HASH(MENU_ENUM_LABEL_VIDEO_ALLOW_ROTATE,
"video_allow_rotate")
MSG_HASH(MENU_ENUM_LABEL_CRT_SWITCH_RESOLUTION,
"crt_switch_resolution")
MSG_HASH(MENU_ENUM_LABEL_CRT_SWITCH_RESOLUTION_SUPER,
"crt_switch_resolution_super")
MSG_HASH(MENU_ENUM_LABEL_VIDEO_ASPECT_RATIO,
"video_aspect_ratio")
MSG_HASH(MENU_ENUM_LABEL_VIDEO_ASPECT_RATIO_AUTO,

View File

@ -890,6 +890,13 @@ int menu_hash_get_help_us_enum(enum msg_hash_enums msg, char *s, size_t len)
strlcpy(s, msg_hash_to_str(MENU_ENUM_LABEL_VALUE_NO_INFORMATION_AVAILABLE), len);
}
break;
case MENU_ENUM_LABEL_CRT_SWITCH_RESOLUTION: snprintf(s, len, "SET CRT");
break;
case MENU_ENUM_LABEL_CRT_SWITCH_RESOLUTION_SUPER: snprintf(s, len, "SET CRT SUPER");
break;
case MENU_ENUM_LABEL_VIDEO_SHADER_PRESET:
snprintf(s, len,
"Load Shader Preset. \n"

View File

@ -3460,6 +3460,13 @@ MSG_HASH(MENU_ENUM_SUBLABEL_AUDIO_RESAMPLER_QUALITY,
"Lower this value to favor performance/lower latency over audio quality, increase if you want better audio quality at the expense of performance/lower latency.")
MSG_HASH(MENU_ENUM_LABEL_VALUE_SHADER_WATCH_FOR_CHANGES,
"Watch shader files for changes")
MSG_HASH(MENU_ENUM_SUBLABEL_CRT_SWITCH_RESOLUTION, "CRT SwitchRes")
MSG_HASH(MENU_ENUM_LABEL_VALUE_CRT_SWITCH_RESOLUTION, "CRT SwitchRes")
MSG_HASH(MENU_ENUM_SUBLABEL_CRT_SWITCH_RESOLUTION_SUPER, "CRT Super Resolution")
MSG_HASH(MENU_ENUM_LABEL_VALUE_CRT_SWITCH_RESOLUTION_SUPER, "CRT Super Resolution")
MSG_HASH(MENU_ENUM_SUBLABEL_SHADER_WATCH_FOR_CHANGES,
"Auto-apply changes made to shader files on disk.")
MSG_HASH(MENU_ENUM_LABEL_VALUE_VIDEO_WINDOW_SHOW_DECORATIONS,

View File

@ -5833,6 +5833,12 @@ bool menu_displaylist_ctl(enum menu_displaylist_ctl_state type, void *data)
menu_displaylist_parse_settings_enum(menu, info,
MENU_ENUM_LABEL_SCREEN_RESOLUTION,
PARSE_ACTION, false);
menu_displaylist_parse_settings_enum(menu, info,
MENU_ENUM_LABEL_CRT_SWITCH_RESOLUTION,
PARSE_ONLY_BOOL, false);
menu_displaylist_parse_settings_enum(menu, info,
MENU_ENUM_LABEL_CRT_SWITCH_RESOLUTION_SUPER,
PARSE_ONLY_UINT, false);
menu_displaylist_parse_settings_enum(menu, info,
MENU_ENUM_LABEL_PAL60_ENABLE,
PARSE_ONLY_BOOL, false);

View File

@ -2997,6 +2997,34 @@ static bool setting_append_list(
general_write_handler,
general_read_handler,
SD_FLAG_NONE);
CONFIG_BOOL(
list, list_info,
&settings->bools.crt_switch_resolution,
MENU_ENUM_LABEL_CRT_SWITCH_RESOLUTION,
MENU_ENUM_LABEL_VALUE_CRT_SWITCH_RESOLUTION,
crt_switch_resolution,
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.crt_switch_resolution_super,
MENU_ENUM_LABEL_CRT_SWITCH_RESOLUTION_SUPER,
MENU_ENUM_LABEL_VALUE_CRT_SWITCH_RESOLUTION_SUPER,
crt_switch_resolution_super,
&group_info,
&subgroup_info,
parent_group,
general_write_handler,
general_read_handler);
CONFIG_BOOL(
list, list_info,

View File

@ -665,6 +665,8 @@ enum msg_hash_enums
MENU_LABEL(INPUT_UNIFIED_MENU_CONTROLS),
/* Video */
MENU_LABEL(CRT_SWITCH_RESOLUTION),
MENU_LABEL(CRT_SWITCH_RESOLUTION_SUPER),
MENU_LABEL(VIDEO_FONT_ENABLE),
MENU_LABEL(VIDEO_FONT_PATH),
MENU_LABEL(VIDEO_FONT_SIZE),