From e11c910c396c9e7c7988b8222f574dad6fd277d0 Mon Sep 17 00:00:00 2001 From: alphanu1 <37101891+alphanu1@users.noreply.github.com> Date: Tue, 12 Feb 2019 15:58:41 +0000 Subject: [PATCH 1/5] Fix native naming after new additions CRT dynamic width changes Change menu detection width Using alternative variables for CRT width and height see output Add files via upload Add files via upload Add files via upload Add files via upload Add files via upload Add files via upload Add files via upload Add files via upload Add files via upload Add files via upload Add files via upload Update video_crt_switch.c Update video_crt_switch.c Update video_display_server.h Update video_display_server.c Update dispserv_win32.c Update dispserv_x11.c Update menu_cbs_ok.c X centring on the fly X centring on the fly Update dispserv_x11.c X centring on the fly Update dispserv_win32.c Fix dispserv_win32.c Fix dispserv_win32.c --- gfx/display_servers/dispserv_win32.c | 4 ++-- gfx/display_servers/dispserv_x11.c | 17 +++++++++------ gfx/video_crt_switch.c | 32 ++++++++++++++++++---------- gfx/video_display_server.c | 4 ++-- gfx/video_display_server.h | 4 ++-- gfx/video_driver.c | 3 ++- menu/cbs/menu_cbs_ok.c | 2 +- menu/menu_setting.c | 3 ++- 8 files changed, 43 insertions(+), 26 deletions(-) diff --git a/gfx/display_servers/dispserv_win32.c b/gfx/display_servers/dispserv_win32.c index f06aea3487..ff8ab2d5c4 100644 --- a/gfx/display_servers/dispserv_win32.c +++ b/gfx/display_servers/dispserv_win32.c @@ -116,7 +116,7 @@ static void win32_display_server_destroy(void *data) if (win32_orig_width > 0 && win32_orig_height > 0) video_display_server_set_resolution(win32_orig_width, win32_orig_height, - win32_orig_refresh, (float)win32_orig_refresh, crt_center, 0); + win32_orig_refresh, (float)win32_orig_refresh, crt_center, 0, 0); #ifdef HAS_TASKBAR_EXT if (g_taskbarList) @@ -210,7 +210,7 @@ static bool win32_display_server_set_window_decorations(void *data, bool on) } static bool win32_display_server_set_resolution(void *data, - unsigned width, unsigned height, int int_hz, float hz, int center, int monitor_index) + unsigned width, unsigned height, int int_hz, float hz, int center, int monitor_index, int xoffset) { DEVMODE curDevmode; int iModeNum; diff --git a/gfx/display_servers/dispserv_x11.c b/gfx/display_servers/dispserv_x11.c index 715cb9752d..e67361535a 100644 --- a/gfx/display_servers/dispserv_x11.c +++ b/gfx/display_servers/dispserv_x11.c @@ -44,7 +44,9 @@ static char new_mode[250] = {0}; static char xrandr[250] = {0}; static char fbset[150] = {0}; static char output[500] = {0}; -static char output4[500] = {0}; +static char output4[500] = {0}; +static char crt_name[10] = {0}; +static int crt_name_id = 0; static bool crt_en = false; static unsigned crtid = 20; static XRRModeInfo crt_rrmode; @@ -127,7 +129,7 @@ static bool x11_display_server_set_window_decorations(void *data, bool on) } static bool x11_display_server_set_resolution(void *data, - unsigned width, unsigned height, int int_hz, float hz, int center, int monitor_index) + unsigned width, unsigned height, int int_hz, float hz, int center, int monitor_index, int xoffset) { int screen; Window window; @@ -150,6 +152,9 @@ static bool x11_display_server_set_resolution(void *data, float pixel_clock = 0; crt_en = true; + crt_name_id += 1; + snprintf(crt_name, sizeof(crt_name), "CRT%d", crt_name_id); + snprintf(old_mode, sizeof(old_mode), "%s", new_mode); @@ -161,7 +166,7 @@ static bool x11_display_server_set_resolution(void *data, video_monitor_set_refresh_rate(hz); /* following code is the mode line generator */ - hsp = (width * 1.140) + x_offset; + hsp = (width * 1.140) - (xoffset*4); hfp = width * 1.055; pwidth = width; @@ -228,20 +233,20 @@ static bool x11_display_server_set_resolution(void *data, /* create interlaced newmode from modline variables */ if (height < 300) { - snprintf(xrandr, sizeof(xrandr), "xrandr --newmode \"CRT_%dx%d_%0.2f\" %f %d %d %d %d %d %d %d %d -hsync -vsync", width, height, hz, pixel_clock, + snprintf(xrandr, sizeof(xrandr), "xrandr --newmode \"%s_%dx%d_%0.2f\" %f %d %d %d %d %d %d %d %d -hsync -vsync",crt_name, width, height, hz, pixel_clock, width, hfp, hsp, hbp, height, vfp, vsp, vbp); system(xrandr); } /* create interlaced newmode from modline variables */ if (height > 300) { - snprintf(xrandr, sizeof(xrandr), "xrandr --newmode \"CRT_%dx%d_%0.2f\" %f %d %d %d %d %d %d %d %d interlace -hsync -vsync", width, height, hz, pixel_clock, + snprintf(xrandr, sizeof(xrandr), "xrandr --newmode \"%s_%dx%d_%0.2f\" %f %d %d %d %d %d %d %d %d interlace -hsync -vsync",crt_name, width, height, hz, pixel_clock, width, hfp, hsp, hbp, height, vfp, vsp, vbp); system(xrandr); } /* variable for new mode */ - snprintf(new_mode, sizeof(new_mode), "CRT_%dx%d_%0.2f", width, height, hz); + snprintf(new_mode, sizeof(new_mode), "%s_%dx%d_%0.2f",crt_name, width, height, hz); /* need to run loops for DVI0 - DVI-2 and VGA0 - VGA-2 outputs to * add and delete modes */ diff --git a/gfx/video_crt_switch.c b/gfx/video_crt_switch.c index 494315653c..b6e83698fc 100644 --- a/gfx/video_crt_switch.c +++ b/gfx/video_crt_switch.c @@ -41,6 +41,7 @@ static unsigned ra_set_core_hz = 0; static unsigned orig_width = 0; static unsigned orig_height = 0; static int crt_center_adjust = 0; +static int crt_tmp_center_adjust = 0; static bool first_run = true; @@ -97,7 +98,7 @@ void crt_aspect_ratio_switch(unsigned width, unsigned height) static void switch_res_crt(unsigned width, unsigned height) { video_display_server_set_resolution(width, height, - ra_set_core_hz, ra_core_hz, crt_center_adjust, crt_index); + ra_set_core_hz, ra_core_hz, crt_center_adjust, crt_index, crt_center_adjust); #if defined(HAVE_VIDEOCORE) crt_rpi_switch(width, height, ra_core_hz); video_monitor_set_refresh_rate(ra_core_hz); @@ -119,7 +120,7 @@ static void crt_screen_setup_aspect(unsigned width, unsigned height) if (height == 4) { /* detect menu only */ - if (width < 1920) + if (width < 700) width = 320; height = 240; @@ -181,13 +182,19 @@ void crt_switch_res_core(unsigned width, unsigned height, { /* ra_core_hz float passed from within * void video_driver_monitor_adjust_system_rates(void) */ + if (width == 4 ) + { + width = 320; + height = 240; + } - ra_core_width = width; ra_core_height = height; ra_core_hz = hz; if (dynamic == true) ra_core_width = crt_compute_dynamic_width(width); + else + ra_core_width = width; crt_center_adjust = crt_switch_center_adjust; crt_index = monitor_index; @@ -206,12 +213,13 @@ void crt_switch_res_core(unsigned width, unsigned height, /* Detect resolution change and switch */ if ( (ra_tmp_height != ra_core_height) || - (ra_core_width != ra_tmp_width) + (ra_core_width != ra_tmp_width) || (crt_center_adjust != crt_tmp_center_adjust) ) - crt_screen_setup_aspect(width, height); + crt_screen_setup_aspect(ra_core_width, ra_core_height); ra_tmp_height = ra_core_height; ra_tmp_width = ra_core_width; + crt_tmp_center_adjust = crt_center_adjust; /* Check if aspect is correct, if not change */ if (video_driver_get_aspect_ratio() != fly_aspect) @@ -231,20 +239,22 @@ void crt_video_restore(void) int crt_compute_dynamic_width(int width) { - double p_clock = 18000000; + double p_clock = 15000000; int min_height = 261; int dynamic_width = 0; #if defined(HAVE_VIDEOCORE) double p_clock = 32000000; #endif - for (int i =1; i < 10; i++) + for (int i =0; i < 10; i++) { - dynamic_width = (width*0.5)*i; + dynamic_width = (width*1.5)*i; if ((dynamic_width * min_height * ra_core_hz) > p_clock) - return dynamic_width; + break; + + } - return width; + return dynamic_width; } #if defined(HAVE_VIDEOCORE) @@ -296,7 +306,7 @@ static void crt_rpi_switch(int width, int height, float hz) roundw = 1.34; hfp = width * 0.065; - hsp = width * 0.1433-hfp; + hsp = width * 0.1433-hfp+(crt_center_adjust*4); hbp = width * 0.3-hsp-hfp; diff --git a/gfx/video_display_server.c b/gfx/video_display_server.c index 31d1b3a5b0..065e5e16c6 100644 --- a/gfx/video_display_server.c +++ b/gfx/video_display_server.c @@ -90,10 +90,10 @@ bool video_display_server_set_window_decorations(bool on) } bool video_display_server_set_resolution(unsigned width, unsigned height, - int int_hz, float hz, int center, int monitor_index) + int int_hz, float hz, int center, int monitor_index, int xoffset) { if (current_display_server && current_display_server->set_resolution) - return current_display_server->set_resolution(current_display_server_data, width, height, int_hz, hz, center, monitor_index); + return current_display_server->set_resolution(current_display_server_data, width, height, int_hz, hz, center, monitor_index, xoffset); return false; } diff --git a/gfx/video_display_server.h b/gfx/video_display_server.h index 8cb3be269f..55de52ba6d 100644 --- a/gfx/video_display_server.h +++ b/gfx/video_display_server.h @@ -41,7 +41,7 @@ typedef struct video_display_server bool (*set_window_progress)(void *data, int progress, bool finished); bool (*set_window_decorations)(void *data, bool on); bool (*set_resolution)(void *data, unsigned width, - unsigned height, int int_hz, float hz, int center, int monitor_index); + unsigned height, int int_hz, float hz, int center, int monitor_index, int xoffset); void *(*get_resolution_list)(void *data, unsigned *size); const char *(*get_output_options)(void *data); @@ -60,7 +60,7 @@ bool video_display_server_set_window_decorations(bool on); bool video_display_server_set_resolution( unsigned width, unsigned height, - int int_hz, float hz, int center, int monitor_index); + int int_hz, float hz, int center, int monitor_index, int xoffset); void *video_display_server_get_resolution_list(unsigned *size); diff --git a/gfx/video_driver.c b/gfx/video_driver.c index 28ee36f792..9ad45bd950 100644 --- a/gfx/video_driver.c +++ b/gfx/video_driver.c @@ -2648,11 +2648,12 @@ void video_driver_frame(const void *data, unsigned width, width = 3840; if (video_info.crt_switch_resolution_super == 1920) width = 1920; + if (video_info.crt_switch_resolution_super == 1) video_driver_crt_dynamic_super_width = true; else video_driver_crt_dynamic_super_width = false; - + crt_switch_res_core(width, height, video_driver_core_hz, video_info.crt_switch_resolution, video_info.crt_switch_center_adjust, video_info.monitor_index, video_driver_crt_dynamic_super_width); } else if (!video_info.crt_switch_resolution) diff --git a/menu/cbs/menu_cbs_ok.c b/menu/cbs/menu_cbs_ok.c index 466f949b30..3b58c68cbe 100644 --- a/menu/cbs/menu_cbs_ok.c +++ b/menu/cbs/menu_cbs_ok.c @@ -4725,7 +4725,7 @@ static int action_ok_push_dropdown_item_resolution(const char *path, refreshrate = strtoul(pch, NULL, 0); if (video_display_server_set_resolution(width, height, - refreshrate, (float)refreshrate, 0, 0)) + refreshrate, (float)refreshrate, 0, 0, 0)) { settings_t *settings = config_get_ptr(); diff --git a/menu/menu_setting.c b/menu/menu_setting.c index d2bd18bc49..d95b3bdf88 100644 --- a/menu/menu_setting.c +++ b/menu/menu_setting.c @@ -1195,10 +1195,11 @@ static void setting_get_string_representation_crt_switch_resolution_super( return; if (*setting->value.target.unsigned_integer == 0) - strlcpy(s, msg_hash_to_str(MSG_NATIVE), len); + strlcpy(s, "NATIVE", len); else snprintf(s, len, "%d", *setting->value.target.unsigned_integer); /* TO DO make 1 read as DYNAMIC */ + if (*setting->value.target.unsigned_integer == 1) strlcpy(s, "DYNAMIC", len); else From 45dae7533341939fadcec9955003c8bae8b895c1 Mon Sep 17 00:00:00 2001 From: alphanu1 Date: Tue, 12 Feb 2019 21:44:07 +0000 Subject: [PATCH 2/5] Update dispserv_x11.c Update dispserv_x11.c New backporch for super res Update dispserv_x11.c Update dispserv_x11.c Update dispserv_x11.c update backporch & menu naming Update menu_setting.c Update menu_setting.c Update menu_setting.c Update menu_setting.c --- gfx/display_servers/dispserv_x11.c | 15 ++++++++++++--- menu/menu_setting.c | 6 +----- 2 files changed, 13 insertions(+), 8 deletions(-) diff --git a/gfx/display_servers/dispserv_x11.c b/gfx/display_servers/dispserv_x11.c index e67361535a..fb72aca43e 100644 --- a/gfx/display_servers/dispserv_x11.c +++ b/gfx/display_servers/dispserv_x11.c @@ -166,8 +166,6 @@ static bool x11_display_server_set_resolution(void *data, video_monitor_set_refresh_rate(hz); /* following code is the mode line generator */ - hsp = (width * 1.140) - (xoffset*4); - hfp = width * 1.055; pwidth = width; if (height < 400 && width > 400) @@ -184,7 +182,18 @@ static bool x11_display_server_set_resolution(void *data, if (roundw < 1.20) roundw = 1.34; - hbp = width * roundw - 8; + if (width < 700) + { + hfp = width * 1.055; + hbp = width * roundw - 8; + }else { + hfp = (width * 1.055)+8; + hbp = (width * roundw) + (width /16); + xoffset = xoffset*2; + } + + hsp = (width * 1.140) - (xoffset*4); + hmax = hbp; if (height < 241) diff --git a/menu/menu_setting.c b/menu/menu_setting.c index 63ca9fc1f1..998db2c36d 100644 --- a/menu/menu_setting.c +++ b/menu/menu_setting.c @@ -1196,11 +1196,7 @@ static void setting_get_string_representation_crt_switch_resolution_super( if (*setting->value.target.unsigned_integer == 0) strlcpy(s, "NATIVE", len); - else - snprintf(s, len, "%d", *setting->value.target.unsigned_integer); -/* TO DO make 1 read as DYNAMIC */ - - if (*setting->value.target.unsigned_integer == 1) + else if (*setting->value.target.unsigned_integer == 1) strlcpy(s, "DYNAMIC", len); else snprintf(s, len, "%d", *setting->value.target.unsigned_integer); From 45a2b5d9b3b40c39c336d6e66681a9c5fc16db45 Mon Sep 17 00:00:00 2001 From: alphanu1 Date: Tue, 12 Feb 2019 22:06:50 +0000 Subject: [PATCH 3/5] Update dispserv_x11.c --- gfx/display_servers/dispserv_x11.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/gfx/display_servers/dispserv_x11.c b/gfx/display_servers/dispserv_x11.c index fb72aca43e..797ada5935 100644 --- a/gfx/display_servers/dispserv_x11.c +++ b/gfx/display_servers/dispserv_x11.c @@ -187,7 +187,7 @@ static bool x11_display_server_set_resolution(void *data, hfp = width * 1.055; hbp = width * roundw - 8; }else { - hfp = (width * 1.055)+8; + hfp = (width * 1.055) + (width / 48); hbp = (width * roundw) + (width /16); xoffset = xoffset*2; } From 4ded3ad9832b561adf0d8bdc7dc195148bddae79 Mon Sep 17 00:00:00 2001 From: alphanu1 Date: Tue, 12 Feb 2019 22:41:46 +0000 Subject: [PATCH 4/5] Update dispserv_x11.c --- gfx/display_servers/dispserv_x11.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/gfx/display_servers/dispserv_x11.c b/gfx/display_servers/dispserv_x11.c index 797ada5935..e74b93b320 100644 --- a/gfx/display_servers/dispserv_x11.c +++ b/gfx/display_servers/dispserv_x11.c @@ -187,8 +187,8 @@ static bool x11_display_server_set_resolution(void *data, hfp = width * 1.055; hbp = width * roundw - 8; }else { - hfp = (width * 1.055) + (width / 48); - hbp = (width * roundw) + (width /16); + hfp = (width * 1.055) + (width / 40); + hbp = (width * roundw) + (width /24); xoffset = xoffset*2; } From 7d07130942cea80e536e4aadc2f847dc5d0a2b5c Mon Sep 17 00:00:00 2001 From: alphanu1 <37101891+alphanu1@users.noreply.github.com> Date: Wed, 13 Feb 2019 15:33:10 +0000 Subject: [PATCH 5/5] Update video_crt_switch.c --- gfx/video_crt_switch.c | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/gfx/video_crt_switch.c b/gfx/video_crt_switch.c index 56cf854203..085dfd8cd7 100644 --- a/gfx/video_crt_switch.c +++ b/gfx/video_crt_switch.c @@ -42,6 +42,7 @@ static unsigned orig_width = 0; static unsigned orig_height = 0; static int crt_center_adjust = 0; static int crt_tmp_center_adjust = 0; +static double p_clock = 0; static bool first_run = true; @@ -239,12 +240,12 @@ void crt_video_restore(void) int crt_compute_dynamic_width(int width) { - double p_clock = 15000000; + p_clock = 15000000; int min_height = 261; int dynamic_width = 0; #if defined(HAVE_VIDEOCORE) - double p_clock = 32000000; + p_clock = 32000000; #endif