From b5f49e3046443a81a0dd8622bc203f10fc9c5187 Mon Sep 17 00:00:00 2001 From: Toni Wilen Date: Wed, 9 Jul 2025 18:55:43 +0300 Subject: [PATCH] Optional native/RTG autoswitch disable. --- cfgfile.cpp | 9 +++++++++ gfxboard.cpp | 11 ++++++++++- include/gfxboard.h | 1 + include/options.h | 1 + od-win32/resources/resource.h | 1 + od-win32/resources/winuae.rc | 5 +++-- od-win32/win32gui.cpp | 10 ++++++++++ 7 files changed, 35 insertions(+), 3 deletions(-) diff --git a/cfgfile.cpp b/cfgfile.cpp index d8810b37..42ae3c6e 100644 --- a/cfgfile.cpp +++ b/cfgfile.cpp @@ -2905,6 +2905,11 @@ void cfgfile_save_options (struct zfile *f, struct uae_prefs *p, int type) _tcscat(tmp2, _T(",")); _stprintf(tmp2 + _tcslen(tmp2), _T("monitor=%d"), rbc->monitor_id); } + if (!rbc->autoswitch) { + if (tmp2) + _tcscat(tmp2, _T(",")); + _tcscat(tmp2 + _tcslen(tmp2), _T("noautoswitch")); + } if (tmp2[0]) { if (i > 0) _stprintf(tmp, _T("gfxcard%d_options"), i + 1); @@ -6265,6 +6270,10 @@ static int cfgfile_parse_hardware (struct uae_prefs *p, const TCHAR *option, TCH rbc->monitor_id = _tstol(s); xfree(s); } + rbc->autoswitch = !cfgfile_option_find(value, _T("noautoswitch")); + if (cfgfile_option_find(value, _T("autoswitch"))) { + rbc->autoswitch = true; + } return 1; } if (i > 0) diff --git a/gfxboard.cpp b/gfxboard.cpp index 18429635..1682921d 100644 --- a/gfxboard.cpp +++ b/gfxboard.cpp @@ -1743,7 +1743,7 @@ void gfxboard_vsync_handler(bool full_redraw_required, bool redraw_required) } } #endif - if (!gb->board->hasswitcher && gb->vram) { + if ((!gb->board->hasswitcher && gb->rbc->autoswitch) && gb->vram) { bool svga_on(void *p); bool on = svga_on(gb->pcemobject2); set_monswitch(gb, on); @@ -4727,6 +4727,15 @@ int gfxboard_get_configtype(struct rtgboardconfig *rbc) return gb->board->configtype; } +bool gfxboard_get_switcher(struct rtgboardconfig *rbc) +{ + int type = rbc->rtgmem_type; + if (type < GFXBOARD_HARDWARE) + return true; + const struct gfxboard *b = find_board(type); + return b->hasswitcher; +} + bool gfxboard_need_byteswap (struct rtgboardconfig *rbc) { int type = rbc->rtgmem_type; diff --git a/include/gfxboard.h b/include/gfxboard.h index 9aa8ec7f..c298c8c4 100644 --- a/include/gfxboard.h +++ b/include/gfxboard.h @@ -16,6 +16,7 @@ extern int gfxboard_get_vram_min (struct rtgboardconfig*); extern int gfxboard_get_vram_max (struct rtgboardconfig*); extern bool gfxboard_need_byteswap (struct rtgboardconfig*); extern int gfxboard_get_autoconfig_size(struct rtgboardconfig*); +extern bool gfxboard_get_switcher(struct rtgboardconfig *rbc); extern double gfxboard_get_vsync (void); extern void gfxboard_refresh (int monid); extern int gfxboard_toggle (int monid, int mode, int msg); diff --git a/include/options.h b/include/options.h index fffe17ec..48bdcd2c 100644 --- a/include/options.h +++ b/include/options.h @@ -440,6 +440,7 @@ struct rtgboardconfig uae_u32 rtgmem_size; int device_order; int monitor_id; + bool autoswitch; }; struct boardloadfile { diff --git a/od-win32/resources/resource.h b/od-win32/resources/resource.h index 70aaf734..67cfd967 100644 --- a/od-win32/resources/resource.h +++ b/od-win32/resources/resource.h @@ -1273,6 +1273,7 @@ #define IDC_RTG_INTEGERSCALE 1801 #define IDC_INFOBOX_TEXT2 1802 #define IDC_INPUTMAPOUTM 1802 +#define IDC_RTG_SWITCHER 1802 #define IDC_INFOBOX_TEXT1 1803 #define IDC_INFOBOX_TEXT3 1804 #define IDC_CD_EJECT 1804 diff --git a/od-win32/resources/winuae.rc b/od-win32/resources/winuae.rc index 1fbfc0dd..493533dc 100644 --- a/od-win32/resources/winuae.rc +++ b/od-win32/resources/winuae.rc @@ -1263,12 +1263,12 @@ BEGIN CONTROL "",IDC_P96MEM,"msctls_trackbar32",TBS_AUTOTICKS | TBS_TOP | WS_TABSTOP,88,94,103,20 EDITTEXT IDC_P96RAM,201,97,40,12,ES_CENTER | ES_READONLY CONTROL "Scale if smaller than display size setting",IDC_RTG_SCALE, - "Button",BS_AUTOCHECKBOX | WS_TABSTOP,25,130,175,10 + "Button",BS_AUTOCHECKBOX | WS_TABSTOP,25,130,162,10 CONTROL "Always scale in windowed mode",IDC_RTG_SCALE_ALLOW, "Button",BS_AUTOCHECKBOX | WS_TABSTOP,25,143,162,10 CONTROL "Always center",IDC_RTG_CENTER,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,25,156,162,10 CONTROL "Integer scaling",IDC_RTG_INTEGERSCALE,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,25,169,161,10 - CONTROL "Multithreaded",IDC_RTG_THREAD,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,195,143,83,10 + CONTROL "Multithreaded",IDC_RTG_THREAD,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,195,143,96,10 CONTROL "Hardware sprite emulation",IDC_RTG_HWSPRITE,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,195,156,96,10 CONTROL "Hardware vertical blank interrupt",IDC_RTG_VBINTERRUPT, "Button",BS_AUTOCHECKBOX | WS_TABSTOP,195,169,129,10 @@ -1284,6 +1284,7 @@ BEGIN COMBOBOX IDC_RTG_BUFFERCNT,153,227,84,150,CBS_DROPDOWNLIST | CBS_HASSTRINGS | WS_VSCROLL | WS_TABSTOP CTEXT "Aspect ratio:",IDC_STATIC,282,212,83,10,SS_CENTERIMAGE COMBOBOX IDC_RTG_SCALE_ASPECTRATIO,282,227,84,150,CBS_DROPDOWNLIST | CBS_HASSTRINGS | WS_VSCROLL | WS_TABSTOP + CONTROL "Native/RTG autoswitch",IDC_RTG_SWITCHER,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,195,130,95,10 END IDD_INPUTMAP DIALOGEX 0, 0, 421, 293 diff --git a/od-win32/win32gui.cpp b/od-win32/win32gui.cpp index 1b6b5db6..bda77075 100644 --- a/od-win32/win32gui.cpp +++ b/od-win32/win32gui.cpp @@ -11563,6 +11563,7 @@ static INT_PTR CALLBACK Expansion2DlgProc(HWND hDlg, UINT msg, WPARAM wParam, LP static void enable_for_expansiondlg(HWND hDlg) { + struct rtgboardconfig *rbc = &workprefs.rtgboards[gui_rtg_index]; int z3 = true; int en; @@ -11600,6 +11601,8 @@ static void enable_for_expansiondlg(HWND hDlg) ew(hDlg, IDC_RTG_VBINTERRUPT, rtg3); ew(hDlg, IDC_RTG_THREAD, rtg3 && en); ew(hDlg, IDC_RTG_HWSPRITE, rtg3); + + ew(hDlg, IDC_RTG_SWITCHER, rbc->rtgmem_size > 0 && !gfxboard_get_switcher(rbc)); } static void values_to_expansiondlg(HWND hDlg) @@ -11712,6 +11715,7 @@ static void values_to_expansiondlg(HWND hDlg) CheckDlgButton(hDlg, IDC_RTG_VBINTERRUPT, workprefs.rtg_hardwareinterrupt); CheckDlgButton(hDlg, IDC_RTG_HWSPRITE, workprefs.rtg_hardwaresprite); CheckDlgButton(hDlg, IDC_RTG_THREAD, workprefs.rtg_multithread); + CheckDlgButton(hDlg, IDC_RTG_SWITCHER, rbc->rtgmem_size > 0 && (rbc->autoswitch || gfxboard_get_switcher(rbc) || rbc->rtgmem_type < GFXBOARD_HARDWARE)); xSendDlgItemMessage(hDlg, IDC_RTG_SCALE_ASPECTRATIO, CB_SETCURSEL, (workprefs.win32_rtgscaleaspectratio == 0) ? 0 : @@ -11863,6 +11867,12 @@ static INT_PTR CALLBACK ExpansionDlgProc (HWND hDlg, UINT msg, WPARAM wParam, LP case IDC_RTG_THREAD: workprefs.rtg_multithread = ischecked(hDlg, IDC_RTG_THREAD); break; + case IDC_RTG_SWITCHER: + { + struct rtgboardconfig *rbc = &workprefs.rtgboards[gui_rtg_index]; + rbc->autoswitch = ischecked(hDlg, IDC_RTG_SWITCHER); + break; + } } if (HIWORD (wParam) == CBN_SELENDOK || HIWORD (wParam) == CBN_KILLFOCUS || HIWORD (wParam) == CBN_EDITCHANGE) { uae_u32 mask = workprefs.picasso96_modeflags; -- 2.47.3