From f9e360525454c8e3c43b981e19475d1eb7ccd6a7 Mon Sep 17 00:00:00 2001 From: lightningterror Date: Fri, 17 Jan 2020 00:52:17 +0100 Subject: [PATCH] gsdx-gui: Add an option in hw hacks to control the half bottom detection. Automatic, Force Disabled, Force Enabled. Automatic - automatically determinate if a game needs the half screen fix. Force Disabled - fully disables the half bottom fix. It will help Xenosaga games. Force Enabled - fully enables the half bottom fix. Will help Lord of the Rings Two Towers, Superman Shadows of Apokolips, Midnight Club 3. --- plugins/GSdx/GSdx.cpp | 7 ++-- plugins/GSdx/GSdx.h | 2 +- plugins/GSdx/GSdx.rc | 60 ++++++++++++++------------- plugins/GSdx/Window/GSLinuxDialog.cpp | 13 ++++-- plugins/GSdx/Window/GSSetting.cpp | 5 +++ plugins/GSdx/Window/GSSetting.h | 1 + plugins/GSdx/Window/GSSettingsDlg.cpp | 16 +++++-- plugins/GSdx/resource.h | 2 + 8 files changed, 65 insertions(+), 41 deletions(-) diff --git a/plugins/GSdx/GSdx.cpp b/plugins/GSdx/GSdx.cpp index d62dffc17e..de48b5ba6e 100644 --- a/plugins/GSdx/GSdx.cpp +++ b/plugins/GSdx/GSdx.cpp @@ -266,9 +266,9 @@ void GSdxApp::Init() m_gs_trifilter.push_back(GSSetting(static_cast(TriFiltering::PS2), "Trilinear", "")); m_gs_trifilter.push_back(GSSetting(static_cast(TriFiltering::Forced), "Trilinear", "Ultra/Slow")); - m_gs_gl_ext.push_back(GSSetting(-1, "Automatic", "Default")); - m_gs_gl_ext.push_back(GSSetting(0, "Force-Disabled", "")); - m_gs_gl_ext.push_back(GSSetting(1, "Force-Enabled", "")); + m_gs_generic_list.push_back(GSSetting(-1, "Automatic", "Default")); + m_gs_generic_list.push_back(GSSetting(0, "Force-Disabled", "")); + m_gs_generic_list.push_back(GSSetting(1, "Force-Enabled", "")); m_gs_hack.push_back(GSSetting(0, "Off", "Default")); m_gs_hack.push_back(GSSetting(1, "Half", "")); @@ -359,7 +359,6 @@ void GSdxApp::Init() #else m_default_configuration["linux_replay"] = "1"; #endif - m_default_configuration["aa1"] = "0"; m_default_configuration["accurate_date"] = "1"; m_default_configuration["accurate_blending_unit"] = "1"; diff --git a/plugins/GSdx/GSdx.h b/plugins/GSdx/GSdx.h index 1a1ffc40e9..7c6de69565 100644 --- a/plugins/GSdx/GSdx.h +++ b/plugins/GSdx/GSdx.h @@ -72,8 +72,8 @@ public: std::vector m_gs_max_anisotropy; std::vector m_gs_bifilter; std::vector m_gs_trifilter; - std::vector m_gs_gl_ext; std::vector m_gs_hack; + std::vector m_gs_generic_list; std::vector m_gs_offset_hack; std::vector m_gs_hw_mipmapping; std::vector m_gs_crc_level; diff --git a/plugins/GSdx/GSdx.rc b/plugins/GSdx/GSdx.rc index a2d14c2759..b505b591cf 100644 --- a/plugins/GSdx/GSdx.rc +++ b/plugins/GSdx/GSdx.rc @@ -111,13 +111,13 @@ IDB_NULL BITMAP "res\\logo-null.bmp" // Dialog // -IDD_HACKS DIALOGEX 0, 0, 210, 274 +IDD_HACKS DIALOGEX 0, 0, 210, 289 STYLE DS_SETFONT | DS_MODALFRAME | DS_FIXEDSYS | WS_POPUP | WS_CAPTION | WS_SYSMENU CAPTION "Advanced Settings & Hacks" FONT 8, "MS Shell Dlg", 400, 0, 0x1 BEGIN // Rendering Hacks: - GROUPBOX "Rendering Hacks",IDC_STATIC,7,7,196,99,0,WS_EX_TRANSPARENT + GROUPBOX "Rendering Hacks",IDC_STATIC,7,7,196,114,0,WS_EX_TRANSPARENT // Column one - HW Hacks CONTROL "Alpha Stencil",IDC_ALPHASTENCIL,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,14,19,57,8 CONTROL "Auto Flush",IDC_AUTO_FLUSH_HW,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,14,32,55,8 @@ -130,40 +130,42 @@ BEGIN CONTROL "Preload Frame Data",IDC_PRELOAD_GS,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,106,58,80,8 // Columns end // - RTEXT "Trilinear Filtering:",IDC_TRI_FILTER_TEXT,16,73,60,8 - COMBOBOX IDC_TRI_FILTER,80,70,116,63,CBS_DROPDOWNLIST | WS_VSCROLL | WS_TABSTOP - RTEXT "Skipdraw Range:",IDC_SKIPDRAWHACK_TEXT,14,88,62,8 - EDITTEXT IDC_SKIPDRAWOFFSETEDIT,80,85,58,14,ES_RIGHT | ES_AUTOHSCROLL | ES_NUMBER + RTEXT "Half-screen Fix:",IDC_HALF_SCREEN_TS_TEXT,14,73,62,8 + COMBOBOX IDC_HALF_SCREEN_TS,80,70,116,63,CBS_DROPDOWNLIST | WS_VSCROLL | WS_TABSTOP + RTEXT "Trilinear Filtering:",IDC_TRI_FILTER_TEXT,16,88,60,8 + COMBOBOX IDC_TRI_FILTER,80,85,116,63,CBS_DROPDOWNLIST | WS_VSCROLL | WS_TABSTOP + RTEXT "Skipdraw Range:",IDC_SKIPDRAWHACK_TEXT,14,103,62,8 + EDITTEXT IDC_SKIPDRAWOFFSETEDIT,80,100,58,14,ES_RIGHT | ES_AUTOHSCROLL | ES_NUMBER CONTROL "",IDC_SKIPDRAWOFFSET,"msctls_updown32",UDS_SETBUDDYINT | UDS_ALIGNRIGHT | UDS_AUTOBUDDY | UDS_ARROWKEYS | UDS_NOTHOUSANDS,0,0,11,14 - EDITTEXT IDC_SKIPDRAWHACKEDIT,138,85,58,14,ES_RIGHT | ES_AUTOHSCROLL | ES_NUMBER + EDITTEXT IDC_SKIPDRAWHACKEDIT,138,100,58,14,ES_RIGHT | ES_AUTOHSCROLL | ES_NUMBER CONTROL "",IDC_SKIPDRAWHACK,"msctls_updown32",UDS_SETBUDDYINT | UDS_ALIGNRIGHT | UDS_AUTOBUDDY | UDS_ARROWKEYS | UDS_NOTHOUSANDS,0,0,11,14 // Upscaling Hacks: - GROUPBOX "Upscaling Hacks",IDC_STATIC,7,109,196,75,0,WS_EX_TRANSPARENT - CONTROL "Align Sprite",IDC_ALIGN_SPRITE,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,14,121,55,8 - CONTROL "Merge Sprite",IDC_MERGE_PP_SPRITE,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,71,121,55,8 - CONTROL "Wild Arms Offset",IDC_WILDHACK,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,130,121,70,8 - RTEXT "Half-pixel Offset:",IDC_OFFSETHACK_TEXT,14,136,62,8 - COMBOBOX IDC_OFFSETHACK,80,133,116,63,CBS_DROPDOWNLIST | WS_VSCROLL | WS_TABSTOP - RTEXT "Round Sprite:",IDC_ROUND_SPRITE_TEXT,30,151,46,8 - COMBOBOX IDC_ROUND_SPRITE,80,148,116,63,CBS_DROPDOWNLIST | WS_VSCROLL | WS_TABSTOP - RTEXT "Texture Offsets:",IDC_TCOFFSET_TEXT,14,166,62,8 - RTEXT "X:",IDC_TCOFFSETX_TEXT,81,166,10,8 - EDITTEXT IDC_TCOFFSETX2,94,163,44,14,ES_RIGHT | ES_AUTOHSCROLL | ES_NUMBER + GROUPBOX "Upscaling Hacks",IDC_STATIC,7,124,196,75,0,WS_EX_TRANSPARENT + CONTROL "Align Sprite",IDC_ALIGN_SPRITE,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,14,136,55,8 + CONTROL "Merge Sprite",IDC_MERGE_PP_SPRITE,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,71,136,55,8 + CONTROL "Wild Arms Offset",IDC_WILDHACK,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,130,136,70,8 + RTEXT "Half-pixel Offset:",IDC_OFFSETHACK_TEXT,14,151,62,8 + COMBOBOX IDC_OFFSETHACK,80,148,116,63,CBS_DROPDOWNLIST | WS_VSCROLL | WS_TABSTOP + RTEXT "Round Sprite:",IDC_ROUND_SPRITE_TEXT,30,166,46,8 + COMBOBOX IDC_ROUND_SPRITE,80,163,116,63,CBS_DROPDOWNLIST | WS_VSCROLL | WS_TABSTOP + RTEXT "Texture Offsets:",IDC_TCOFFSET_TEXT,14,181,62,8 + RTEXT "X:",IDC_TCOFFSETX_TEXT,81,181,10,8 + EDITTEXT IDC_TCOFFSETX2,94,178,44,14,ES_RIGHT | ES_AUTOHSCROLL | ES_NUMBER CONTROL "",IDC_TCOFFSETX,"msctls_updown32",UDS_SETBUDDYINT | UDS_ALIGNRIGHT | UDS_AUTOBUDDY | UDS_ARROWKEYS | UDS_NOTHOUSANDS,0,0,11,14 - RTEXT "Y:",IDC_TCOFFSETY_TEXT,139,166,10,8 - EDITTEXT IDC_TCOFFSETY2,152,163,44,14,ES_RIGHT | ES_AUTOHSCROLL | ES_NUMBER + RTEXT "Y:",IDC_TCOFFSETY_TEXT,139,181,10,8 + EDITTEXT IDC_TCOFFSETY2,152,178,44,14,ES_RIGHT | ES_AUTOHSCROLL | ES_NUMBER CONTROL "",IDC_TCOFFSETY,"msctls_updown32",UDS_SETBUDDYINT | UDS_ALIGNRIGHT | UDS_AUTOBUDDY | UDS_ARROWKEYS | UDS_NOTHOUSANDS,0,0,11,14 // OpenGL Advanced Settings: - GROUPBOX "OpenGL Advanced Settings",IDC_STATIC,7,187,196,61,0,WS_EX_TRANSPARENT - RTEXT "Geometry Shader:",IDC_GEOMETRY_SHADER_TEXT,14,201,62,8 - COMBOBOX IDC_GEOMETRY_SHADER_OVERRIDE,80,198,116,63,CBS_DROPDOWNLIST | WS_VSCROLL | WS_TABSTOP - RTEXT "Image Load Store:",IDC_IMAGE_LOAD_STORE_TEXT,14,216,62,8 - COMBOBOX IDC_IMAGE_LOAD_STORE,80,213,116,63,CBS_DROPDOWNLIST | WS_VSCROLL | WS_TABSTOP - RTEXT "Sparse Texture:",IDC_SPARSE_TEXTURE_TEXT,14,231,62,8 - COMBOBOX IDC_SPARSE_TEXTURE,80,228,116,63,CBS_DROPDOWNLIST | WS_VSCROLL | WS_TABSTOP + GROUPBOX "OpenGL Advanced Settings",IDC_STATIC,7,202,196,61,0,WS_EX_TRANSPARENT + RTEXT "Geometry Shader:",IDC_GEOMETRY_SHADER_TEXT,14,216,62,8 + COMBOBOX IDC_GEOMETRY_SHADER_OVERRIDE,80,213,116,63,CBS_DROPDOWNLIST | WS_VSCROLL | WS_TABSTOP + RTEXT "Image Load Store:",IDC_IMAGE_LOAD_STORE_TEXT,14,231,62,8 + COMBOBOX IDC_IMAGE_LOAD_STORE,80,228,116,63,CBS_DROPDOWNLIST | WS_VSCROLL | WS_TABSTOP + RTEXT "Sparse Texture:",IDC_SPARSE_TEXTURE_TEXT,14,246,62,8 + COMBOBOX IDC_SPARSE_TEXTURE,80,243,116,63,CBS_DROPDOWNLIST | WS_VSCROLL | WS_TABSTOP // General Settings: - DEFPUSHBUTTON "OK",IDOK,52,254,50,14 - DEFPUSHBUTTON "Cancel",IDCANCEL,108,254,50,14 + DEFPUSHBUTTON "OK",IDOK,52,269,50,14 + DEFPUSHBUTTON "Cancel",IDCANCEL,108,269,50,14 END IDD_SHADER DIALOGEX 0, 0, 248, 230 diff --git a/plugins/GSdx/Window/GSLinuxDialog.cpp b/plugins/GSdx/Window/GSLinuxDialog.cpp index 1cf283b807..9bfaab9880 100644 --- a/plugins/GSdx/Window/GSLinuxDialog.cpp +++ b/plugins/GSdx/Window/GSLinuxDialog.cpp @@ -317,11 +317,11 @@ void populate_hw_table(GtkWidget* hw_table) void populate_gl_table(GtkWidget* gl_table) { GtkWidget* gl_gs_label = left_label("Geometry Shader:"); - GtkWidget* gl_gs_combo = CreateComboBoxFromVector(theApp.m_gs_gl_ext, "override_geometry_shader"); + GtkWidget* gl_gs_combo = CreateComboBoxFromVector(theApp.m_gs_generic_list, "override_geometry_shader"); GtkWidget* gl_ils_label = left_label("Image Load Store:"); - GtkWidget* gl_ils_combo = CreateComboBoxFromVector(theApp.m_gs_gl_ext, "override_GL_ARB_shader_image_load_store"); + GtkWidget* gl_ils_combo = CreateComboBoxFromVector(theApp.m_gs_generic_list, "override_GL_ARB_shader_image_load_store"); GtkWidget* gl_sps_label = left_label("Sparse Texture:"); - GtkWidget* gl_sps_combo = CreateComboBoxFromVector(theApp.m_gs_gl_ext, "override_GL_ARB_sparse_texture"); + GtkWidget* gl_sps_combo = CreateComboBoxFromVector(theApp.m_gs_generic_list, "override_GL_ARB_sparse_texture"); AddTooltip(gl_gs_label, gl_gs_combo, IDC_GEOMETRY_SHADER_OVERRIDE); AddTooltip(gl_ils_label, gl_ils_combo, IDC_IMAGE_LOAD_STORE); @@ -462,6 +462,8 @@ void populate_hack_table(GtkWidget* hack_table) GtkWidget* stretch_hack_label = left_label("Round Sprite:"); GtkWidget* trilinear_box = CreateComboBoxFromVector(theApp.m_gs_trifilter, "UserHacks_TriFilter"); GtkWidget* trilinear_label = left_label("Trilinear Filtering:"); + GtkWidget* half_screen_ts_box = CreateComboBoxFromVector(theApp.m_gs_generic_list, "UserHacks_Half_Bottom_Override"); + GtkWidget* half_screen_ts_label = left_label("Half-screen Fix:"); // Reuse windows helper string :) AddTooltip(hack_offset_label, IDC_OFFSETHACK); @@ -485,6 +487,8 @@ void populate_hack_table(GtkWidget* hack_table) AddTooltip(hack_wrap_mem, IDC_MEMORY_WRAPPING); AddTooltip(trilinear_box, IDC_TRI_FILTER); AddTooltip(trilinear_label, IDC_TRI_FILTER); + AddTooltip(half_screen_ts_box, IDC_HALF_SCREEN_TS); + AddTooltip(half_screen_ts_label, IDC_HALF_SCREEN_TS); s_table_line = 0; @@ -495,7 +499,8 @@ void populate_hack_table(GtkWidget* hack_table) InsertWidgetInTable(hack_table , hack_depth_check , hack_merge_sprite); InsertWidgetInTable(hack_table , hack_safe_features , preload_gs_check); InsertWidgetInTable(hack_table , hack_fast_inv , hack_wild_check); - // Other upscaling hacks + // Other hacks + InsertWidgetInTable(hack_table , half_screen_ts_label, half_screen_ts_box); InsertWidgetInTable(hack_table , trilinear_label , trilinear_box); InsertWidgetInTable(hack_table , hack_offset_label , hack_offset_box); InsertWidgetInTable(hack_table , stretch_hack_label , stretch_hack_box ); diff --git a/plugins/GSdx/Window/GSSetting.cpp b/plugins/GSdx/Window/GSSetting.cpp index c04946e943..b952e8f374 100644 --- a/plugins/GSdx/Window/GSSetting.cpp +++ b/plugins/GSdx/Window/GSSetting.cpp @@ -37,6 +37,11 @@ const char* dialog_message(int ID, bool* updateText) { " Rendering is smoother but it could generate a few glitches. If upscaling is enabled, this setting is recommended over 'Bilinear Forced'\n\n" "Bilinear Forced:\nAlways enable interpolation. Rendering is smoother but it could generate some glitches.\n\n" "Bilinear PS2:\nUse same mode as the PS2. It is the more accurate option."; + case IDC_HALF_SCREEN_TS: + return "Control the half-screen fix detection on texture shuffling.\n\n" + "Automatic:\nUses an algorithm to automatically enable or disable the detection.\n\n" + "Force-Disabled:\nDisables the detection. Will cause visual bugs in many games. It helps Xenosaga games.\n\n" + "Force-Enabled:\nAlways enables the detection. Use it when a game has half-screen issues."; case IDC_TRI_FILTER: return "Control the texture tri-filtering of the emulation.\n\n" "None:\nNo extra trilinear filtering.\n\n" diff --git a/plugins/GSdx/Window/GSSetting.h b/plugins/GSdx/Window/GSSetting.h index 3bd200dd33..582464fb67 100644 --- a/plugins/GSdx/Window/GSSetting.h +++ b/plugins/GSdx/Window/GSSetting.h @@ -43,6 +43,7 @@ const char* dialog_message(int ID, bool* updateText = NULL); #ifndef _WIN32 enum { IDC_FILTER, + IDC_HALF_SCREEN_TS, IDC_TRI_FILTER, IDC_SKIPDRAWHACK, IDC_SKIPDRAWHACKEDIT, diff --git a/plugins/GSdx/Window/GSSettingsDlg.cpp b/plugins/GSdx/Window/GSSettingsDlg.cpp index 36ad5bafb9..0b14170744 100644 --- a/plugins/GSdx/Window/GSSettingsDlg.cpp +++ b/plugins/GSdx/Window/GSSettingsDlg.cpp @@ -640,12 +640,13 @@ void GSHacksDlg::OnInit() CheckDlgButton(m_hWnd, IDC_MEMORY_WRAPPING, theApp.GetConfigB("wrap_gs_mem")); CheckDlgButton(m_hWnd, IDC_MERGE_PP_SPRITE, theApp.GetConfigB("UserHacks_merge_pp_sprite")); + ComboBoxInit(IDC_HALF_SCREEN_TS, theApp.m_gs_generic_list, theApp.GetConfigI("UserHacks_Half_Bottom_Override")); ComboBoxInit(IDC_TRI_FILTER, theApp.m_gs_trifilter, theApp.GetConfigI("UserHacks_TriFilter")); ComboBoxInit(IDC_OFFSETHACK, theApp.m_gs_offset_hack, theApp.GetConfigI("UserHacks_HalfPixelOffset")); ComboBoxInit(IDC_ROUND_SPRITE, theApp.m_gs_hack, theApp.GetConfigI("UserHacks_round_sprite_offset")); - ComboBoxInit(IDC_GEOMETRY_SHADER_OVERRIDE, theApp.m_gs_gl_ext, theApp.GetConfigI("override_geometry_shader")); - ComboBoxInit(IDC_IMAGE_LOAD_STORE, theApp.m_gs_gl_ext, theApp.GetConfigI("override_GL_ARB_shader_image_load_store")); - ComboBoxInit(IDC_SPARSE_TEXTURE, theApp.m_gs_gl_ext, theApp.GetConfigI("override_GL_ARB_sparse_texture")); + ComboBoxInit(IDC_GEOMETRY_SHADER_OVERRIDE, theApp.m_gs_generic_list, theApp.GetConfigI("override_geometry_shader")); + ComboBoxInit(IDC_IMAGE_LOAD_STORE, theApp.m_gs_generic_list, theApp.GetConfigI("override_GL_ARB_shader_image_load_store")); + ComboBoxInit(IDC_SPARSE_TEXTURE, theApp.m_gs_generic_list, theApp.GetConfigI("override_GL_ARB_sparse_texture")); SendMessage(GetDlgItem(m_hWnd, IDC_SKIPDRAWOFFSET), UDM_SETRANGE, 0, MAKELPARAM(10000, 0)); SendMessage(GetDlgItem(m_hWnd, IDC_SKIPDRAWOFFSET), UDM_SETPOS, 0, MAKELPARAM(theApp.GetConfigI("UserHacks_SkipDraw_Offset"), 0)); @@ -666,6 +667,10 @@ void GSHacksDlg::OnInit() EnableWindow(GetDlgItem(m_hWnd, IDC_SAFE_FEATURES), hwhacks); EnableWindow(GetDlgItem(m_hWnd, IDC_MEMORY_WRAPPING), hwhacks); + // Half-screen bottom hack: + EnableWindow(GetDlgItem(m_hWnd, IDC_HALF_SCREEN_TS), hwhacks); + EnableWindow(GetDlgItem(m_hWnd, IDC_HALF_SCREEN_TS_TEXT), hwhacks); + // Skipdraw hack: EnableWindow(GetDlgItem(m_hWnd, IDC_SKIPDRAWHACK_TEXT), hwhacks); EnableWindow(GetDlgItem(m_hWnd, IDC_SKIPDRAWOFFSETEDIT), hwhacks); @@ -726,6 +731,7 @@ void GSHacksDlg::OnInit() AddTooltip(IDC_AUTO_FLUSH_HW); AddTooltip(IDC_SAFE_FEATURES); AddTooltip(IDC_MEMORY_WRAPPING); + AddTooltip(IDC_HALF_SCREEN_TS); AddTooltip(IDC_TRI_FILTER); AddTooltip(IDC_MERGE_PP_SPRITE); AddTooltip(IDC_GEOMETRY_SHADER_OVERRIDE); @@ -782,6 +788,10 @@ bool GSHacksDlg::OnMessage(UINT message, WPARAM wParam, LPARAM lParam) case IDOK: { INT_PTR data; + if (ComboBoxGetSelData(IDC_HALF_SCREEN_TS, data)) + { + theApp.SetConfig("UserHacks_Half_Bottom_Override", (int)data); + } if (ComboBoxGetSelData(IDC_TRI_FILTER, data)) { theApp.SetConfig("UserHacks_TriFilter", (int)data); diff --git a/plugins/GSdx/resource.h b/plugins/GSdx/resource.h index 51a5e7a5ca..14c778b452 100644 --- a/plugins/GSdx/resource.h +++ b/plugins/GSdx/resource.h @@ -101,6 +101,8 @@ #define IDC_SKIPDRAWHACKEDIT 2126 #define IDC_SKIPDRAWOFFSET 2127 #define IDC_SKIPDRAWOFFSETEDIT 2128 +#define IDC_HALF_SCREEN_TS 2129 +#define IDC_HALF_SCREEN_TS_TEXT 2130 // Shader: #define IDC_SHADEBOOST 2140 #define IDC_FXAA 2141