From 7edc4e2cb3817203489613d02042ed38085da223 Mon Sep 17 00:00:00 2001 From: Stenzek Date: Thu, 11 May 2023 20:41:26 +1000 Subject: [PATCH] GS: Remove CRC hack levels Replace it with a boolean "Disable Render Fixes" option. --- pcsx2-qt/Settings/GraphicsSettingsWidget.cpp | 11 +- pcsx2-qt/Settings/GraphicsSettingsWidget.ui | 180 ++++++++----------- pcsx2/Config.h | 12 +- pcsx2/Frontend/FullscreenUI.cpp | 5 +- pcsx2/Frontend/ImGuiOverlays.cpp | 4 +- pcsx2/GS/GS.cpp | 8 +- pcsx2/GS/GSState.cpp | 2 +- pcsx2/GS/GSUtil.cpp | 5 - pcsx2/GS/GSUtil.h | 1 - pcsx2/GS/Renderers/HW/GSHwHack.cpp | 103 +++++------ pcsx2/GS/Renderers/HW/GSHwHack.h | 1 - pcsx2/Pcsx2Config.cpp | 5 +- pcsx2/VMManager.cpp | 2 - 13 files changed, 132 insertions(+), 207 deletions(-) diff --git a/pcsx2-qt/Settings/GraphicsSettingsWidget.cpp b/pcsx2-qt/Settings/GraphicsSettingsWidget.cpp index 7d2b86c48b..ca8d3623e1 100644 --- a/pcsx2-qt/Settings/GraphicsSettingsWidget.cpp +++ b/pcsx2-qt/Settings/GraphicsSettingsWidget.cpp @@ -181,8 +181,6 @@ GraphicsSettingsWidget::GraphicsSettingsWidget(SettingsDialog* dialog, QWidget* ////////////////////////////////////////////////////////////////////////// // HW Renderer Fixes ////////////////////////////////////////////////////////////////////////// - SettingWidgetBinder::BindWidgetToIntSetting( - sif, m_ui.crcFixLevel, "EmuCore/GS", "crc_hack_level", static_cast(CRCHackLevel::Automatic), -1); SettingWidgetBinder::BindWidgetToIntSetting(sif, m_ui.halfScreenFix, "EmuCore/GS", "UserHacks_Half_Bottom_Override", -1, -1); SettingWidgetBinder::BindWidgetToIntSetting(sif, m_ui.cpuSpriteRenderBW, "EmuCore/GS", "UserHacks_CPUSpriteRenderBW", 0); SettingWidgetBinder::BindWidgetToIntSetting(sif, m_ui.cpuSpriteRenderLevel, "EmuCore/GS", "UserHacks_CPUSpriteRenderLevel", 0); @@ -194,6 +192,7 @@ GraphicsSettingsWidget::GraphicsSettingsWidget(SettingsDialog* dialog, QWidget* SettingWidgetBinder::BindWidgetToBoolSetting(sif, m_ui.frameBufferConversion, "EmuCore/GS", "UserHacks_CPU_FB_Conversion", false); SettingWidgetBinder::BindWidgetToBoolSetting(sif, m_ui.disableDepthEmulation, "EmuCore/GS", "UserHacks_DisableDepthSupport", false); SettingWidgetBinder::BindWidgetToBoolSetting(sif, m_ui.disableSafeFeatures, "EmuCore/GS", "UserHacks_Disable_Safe_Features", false); + SettingWidgetBinder::BindWidgetToBoolSetting(sif, m_ui.disableRenderFixes, "EmuCore/GS", "UserHacks_DisableRenderFixes", false); SettingWidgetBinder::BindWidgetToBoolSetting(sif, m_ui.preloadFrameData, "EmuCore/GS", "preload_frame_with_gs_data", false); SettingWidgetBinder::BindWidgetToBoolSetting( sif, m_ui.disablePartialInvalidation, "EmuCore/GS", "UserHacks_DisablePartialInvalidation", false); @@ -471,9 +470,6 @@ GraphicsSettingsWidget::GraphicsSettingsWidget(SettingsDialog* dialog, QWidget* "Unscaled: Native Dithering / Lowest dithering effect does not increase size of squares when upscaling.
" "Scaled: Upscaling-aware / Highest dithering effect.")); - dialog->registerWidgetHelp(m_ui.crcFixLevel, tr("CRC Fix Level"), tr("Automatic (Default)"), - tr("Control the number of Auto-CRC fixes and hacks applied to games.")); - dialog->registerWidgetHelp(m_ui.blending, tr("Blending Accuracy"), tr("Basic (Recommended)"), tr("Control the accuracy level of the GS blending unit emulation.
" "The higher the setting, the more blending is emulated in the shader accurately, and the higher the speed penalty will " @@ -545,6 +541,9 @@ GraphicsSettingsWidget::GraphicsSettingsWidget(SettingsDialog* dialog, QWidget* "Disables accurate GS Memory Clearing to be done on the CPU, and let the GPU handle it, which can help Kingdom Hearts " "games.")); + dialog->registerWidgetHelp( + m_ui.disableRenderFixes, tr("Disable Render Fixes"), tr("Unchecked"), tr("This option disables game-specific render fixes.")); + dialog->registerWidgetHelp(m_ui.disablePartialInvalidation, tr("Disable Partial Source Invalidation"), tr("Unchecked"), tr("By default, the texture cache handles partial invalidations. Unfortunately it is very costly to compute CPU wise. " "This hack replaces the partial invalidation with a complete deletion of the texture to reduce the CPU load. " @@ -1051,7 +1050,6 @@ void GraphicsSettingsWidget::resetManualHardwareFixes() check_bool("EmuCore/GS", "UserHacks", false); - check_int("EmuCore/GS", "crc_hack_level", static_cast(CRCHackLevel::Automatic)); check_int("EmuCore/GS", "UserHacks_Half_Bottom_Override", -1); check_int("EmuCore/GS", "UserHacks_CPUSpriteRenderBW", 0); check_int("EmuCore/GS", "UserHacks_CPUCLUTRender", 0); @@ -1062,6 +1060,7 @@ void GraphicsSettingsWidget::resetManualHardwareFixes() check_bool("EmuCore/GS", "UserHacks_CPU_FB_Conversion", false); check_bool("EmuCore/GS", "UserHacks_DisableDepthSupport", false); check_bool("EmuCore/GS", "UserHacks_Disable_Safe_Features", false); + check_bool("EmuCore/GS", "UserHacks_DisableRenderFixes", false); check_bool("EmuCore/GS", "preload_frame_with_gs_data", false); check_bool("EmuCore/GS", "UserHacks_DisablePartialInvalidation", false); check_int("EmuCore/GS", "UserHacks_TextureInsideRt", static_cast(GSTextureInRtMode::Disabled)); diff --git a/pcsx2-qt/Settings/GraphicsSettingsWidget.ui b/pcsx2-qt/Settings/GraphicsSettingsWidget.ui index 375f6f1735..2f25abfdc2 100644 --- a/pcsx2-qt/Settings/GraphicsSettingsWidget.ui +++ b/pcsx2-qt/Settings/GraphicsSettingsWidget.ui @@ -781,54 +781,13 @@ - - - CRC Fix Level: - - - - - - - - Automatic (Default) - - - - - None (Debug) - - - - - Minimum (Debug) - - - - - Partial (OpenGL) - - - - - Full (Direct3D) - - - - - Aggressive - - - - - Half Screen Fix: - + @@ -847,14 +806,14 @@ - + CPU Sprite Render Size: - + @@ -936,14 +895,14 @@ - + Software CLUT Render: - + 0 (Disabled) @@ -968,14 +927,14 @@ - + GPU Target CLUT: - + @@ -994,40 +953,14 @@ - - - - Texture Inside RT: - - - - - - - - Disabled (Default) - - - - - Inside Target - - - - - Merge Targets - - - - - + Auto Flush: - + @@ -1046,14 +979,40 @@ - + + + + Texture Inside RT: + + + + + + + + Disabled (Default) + + + + + Inside Target + + + + + Merge Targets + + + + + Skipdraw Range: - + @@ -1071,7 +1030,7 @@ - + @@ -1094,45 +1053,52 @@ - - + + - Estimate Texture Region + Target Partial Invalidation - - - - Frame Buffer Conversion - - - - - - - GPU Palette Conversion - - - - - - - Preload Frame Data - - - - + Read Targets When Closing - - + + - Target Partial Invalidation + Preload Frame Data + + + + + + + GPU Palette Conversion + + + + + + + Frame Buffer Conversion + + + + + + + Estimate Texture Region + + + + + + + Disable Render Fixes diff --git a/pcsx2/Config.h b/pcsx2/Config.h index dfcc3ff7f8..2f696d73f6 100644 --- a/pcsx2/Config.h +++ b/pcsx2/Config.h @@ -288,16 +288,6 @@ enum class HWMipmapLevel : s8 Full }; -enum class CRCHackLevel : s8 -{ - Automatic = -1, - Off, - Minimum, - Partial, - Full, - Aggressive -}; - enum class AccBlendLevel : u8 { Minimum, @@ -685,6 +675,7 @@ struct Pcsx2Config UserHacks_DisableDepthSupport : 1, UserHacks_DisablePartialInvalidation : 1, UserHacks_DisableSafeFeatures : 1, + UserHacks_DisableRenderFixes : 1, UserHacks_MergePPSprite : 1, UserHacks_WildHack : 1, UserHacks_BilinearHack : 1, @@ -742,7 +733,6 @@ struct Pcsx2Config HWMipmapLevel HWMipmap = HWMipmapLevel::Automatic; AccBlendLevel AccurateBlendingUnit = AccBlendLevel::Basic; - CRCHackLevel CRCHack = CRCHackLevel::Automatic; BiFiltering TextureFiltering = BiFiltering::PS2; TexturePreloadingLevel TexturePreloading = TexturePreloadingLevel::Full; GSDumpCompressionMethod GSDumpCompression = GSDumpCompressionMethod::Zstandard; diff --git a/pcsx2/Frontend/FullscreenUI.cpp b/pcsx2/Frontend/FullscreenUI.cpp index 3b1ee639b4..bef2c6711b 100644 --- a/pcsx2/Frontend/FullscreenUI.cpp +++ b/pcsx2/Frontend/FullscreenUI.cpp @@ -3185,9 +3185,6 @@ void FullscreenUI::DrawGraphicsSettingsPage() static constexpr const char* s_auto_flush_options[] = { "Disabled (Default)", "Enabled (Sprites Only)", "Enabled (All Primitives)"}; - DrawIntListSetting(bsi, "CRC Fix Level", "Applies manual fixes to difficult-to-emulate effects in the hardware renderers.", - "EmuCore/GS", "crc_hack_level", static_cast(CRCHackLevel::Automatic), s_crc_fix_options, std::size(s_crc_fix_options), - -1); DrawIntListSetting(bsi, "Half-Bottom Override", "Control the half-screen fix detection on texture shuffling.", "EmuCore/GS", "UserHacks_Half_Bottom_Override", -1, s_generic_options, std::size(s_generic_options), -1); DrawIntListSetting(bsi, "CPU Sprite Render Size", "Uses software renderer to draw texture decompression-like sprites.", @@ -3208,6 +3205,8 @@ void FullscreenUI::DrawGraphicsSettingsPage() "UserHacks_DisableDepthSupport", false, manual_hw_fixes); DrawToggleSetting(bsi, "Disable Safe Features", "This option disables multiple safe features.", "EmuCore/GS", "UserHacks_Disable_Safe_Features", false, manual_hw_fixes); + DrawToggleSetting(bsi, "Disable Render Features", "This option disables game-specific render fixes.", "EmuCore/GS", + "UserHacks_DisableRenderFixes", false, manual_hw_fixes); DrawToggleSetting(bsi, "Preload Frame", "Uploads GS data when rendering a new frame to reproduce some effects accurately.", "EmuCore/GS", "preload_frame_with_gs_data", false, manual_hw_fixes); DrawToggleSetting(bsi, "Disable Partial Invalidation", diff --git a/pcsx2/Frontend/ImGuiOverlays.cpp b/pcsx2/Frontend/ImGuiOverlays.cpp index 655fc930d3..c4aba3530e 100644 --- a/pcsx2/Frontend/ImGuiOverlays.cpp +++ b/pcsx2/Frontend/ImGuiOverlays.cpp @@ -392,8 +392,6 @@ void ImGuiManager::DrawSettingsOverlay() APPEND("AF={} ", EmuConfig.GS.MaxAnisotropy); if (GSConfig.Dithering != 2) APPEND("DI={} ", GSConfig.Dithering); - if (EmuConfig.GS.CRCHack != CRCHackLevel::Automatic) - APPEND("CRC={} ", static_cast(EmuConfig.GS.CRCHack)); if (GSConfig.UserHacks_HalfBottomOverride >= 0) APPEND("HBO={} ", GSConfig.UserHacks_HalfBottomOverride); if (GSConfig.UserHacks_HalfPixelOffset > 0) @@ -436,6 +434,8 @@ void ImGuiManager::DrawSettingsOverlay() APPEND("TPI "); if (GSConfig.UserHacks_DisableSafeFeatures) APPEND("DSF "); + if (GSConfig.UserHacks_DisableRenderFixes) + APPEND("DRF "); if (GSConfig.PreloadFrameWithGSData) APPEND("PLFD "); if (GSConfig.UserHacks_EstimateTextureRegion) diff --git a/pcsx2/GS/GS.cpp b/pcsx2/GS/GS.cpp index a6370a832d..7c24d09040 100644 --- a/pcsx2/GS/GS.cpp +++ b/pcsx2/GS/GS.cpp @@ -774,8 +774,7 @@ void GSUpdateConfig(const Pcsx2Config::GSOptions& new_config) } // Options which aren't using the global struct yet, so we need to recreate all GS objects. - if ( - GSConfig.SWExtraThreads != old_config.SWExtraThreads || + if (GSConfig.SWExtraThreads != old_config.SWExtraThreads || GSConfig.SWExtraThreadsHeight != old_config.SWExtraThreadsHeight) { if (!GSreopen(false, true, old_config)) @@ -784,10 +783,7 @@ void GSUpdateConfig(const Pcsx2Config::GSOptions& new_config) return; } - // This is where we would do finer-grained checks in the future. - // For example, flushing the texture cache when mipmap settings change. - - if (GSConfig.CRCHack != old_config.CRCHack || + if (GSConfig.UserHacks_DisableRenderFixes != old_config.UserHacks_DisableRenderFixes || GSConfig.UpscaleMultiplier != old_config.UpscaleMultiplier || GSConfig.GetSkipCountFunctionId != old_config.GetSkipCountFunctionId || GSConfig.BeforeDrawFunctionId != old_config.BeforeDrawFunctionId) diff --git a/pcsx2/GS/GSState.cpp b/pcsx2/GS/GSState.cpp index dbeccc8292..261c51d83a 100644 --- a/pcsx2/GS/GSState.cpp +++ b/pcsx2/GS/GSState.cpp @@ -2587,7 +2587,7 @@ void GSState::SetGameCRC(u32 crc) void GSState::UpdateCRCHacks() { - m_game = CRC::Lookup((GSConfig.CRCHack != CRCHackLevel::Off) ? m_crc : 0); + m_game = CRC::Lookup(GSConfig.UserHacks_DisableRenderFixes ? 0 : m_crc); } // diff --git a/pcsx2/GS/GSUtil.cpp b/pcsx2/GS/GSUtil.cpp index 576a21cc00..1f12d21f58 100644 --- a/pcsx2/GS/GSUtil.cpp +++ b/pcsx2/GS/GSUtil.cpp @@ -196,11 +196,6 @@ u32 GSUtil::GetChannelMask(u32 spsm) } } -CRCHackLevel GSUtil::GetRecommendedCRCHackLevel(GSRendererType type) -{ - return (type == GSRendererType::DX11 || type == GSRendererType::DX12) ? CRCHackLevel::Full : CRCHackLevel::Partial; -} - GSRendererType GSUtil::GetPreferredRenderer() { #if defined(__APPLE__) diff --git a/pcsx2/GS/GSUtil.h b/pcsx2/GS/GSUtil.h index 29208d50c0..2da5ea1573 100644 --- a/pcsx2/GS/GSUtil.h +++ b/pcsx2/GS/GSUtil.h @@ -35,7 +35,6 @@ public: static bool HasSameSwizzleBits(u32 spsm, u32 dpsm); static u32 GetChannelMask(u32 spsm); - static CRCHackLevel GetRecommendedCRCHackLevel(GSRendererType type); static GSRendererType GetPreferredRenderer(); }; diff --git a/pcsx2/GS/Renderers/HW/GSHwHack.cpp b/pcsx2/GS/Renderers/HW/GSHwHack.cpp index 7221586d22..415b7f2659 100644 --- a/pcsx2/GS/Renderers/HW/GSHwHack.cpp +++ b/pcsx2/GS/Renderers/HW/GSHwHack.cpp @@ -19,11 +19,6 @@ #include "GS/GSGL.h" static bool s_nativeres; -static CRCHackLevel s_crc_hack_level = CRCHackLevel::Full; - -#define CRC_Partial (s_crc_hack_level >= CRCHackLevel::Partial) -#define CRC_Full (s_crc_hack_level >= CRCHackLevel::Full) -#define CRC_Aggressive (s_crc_hack_level >= CRCHackLevel::Aggressive) #define RPRIM r.PRIM #define RCONTEXT r.m_context @@ -64,11 +59,13 @@ bool GSHwHack::GSC_DeathByDegreesTekkenNinaWilliams(GSRendererHW& r, int& skip) // Upscaling issue similar to Tekken 5. skip = 1; // Animation pane } - else if (CRC_Aggressive && RFBP == 0x3500 && RTPSM == PSMT8 && RFBMSK == 0xFFFF00FF) +#if 0 + else if (RFBP == 0x3500 && RTPSM == PSMT8 && RFBMSK == 0xFFFF00FF) { // Needs to be further tested so put it on Aggressive for now, likely channel shuffle. skip = 4; // Underwater white fog } +#endif } else { @@ -532,10 +529,6 @@ bool GSHwHack::GSC_SteambotChronicles(GSRendererHW& r, int& skip) { skip = 100; // deletes most others(too high deletes the buggy sea completely;c, too low causes glitches to be visible) } - else if (CRC_Aggressive && RFBP != 0) - { - skip = 19; // "speedhack", makes the game very light, vaporized water can disappear when not looked at directly, possibly some interface still, other value to try: 6 breaks menu background, possibly nothing(?) during gameplay, but it's slower, hence not much of a speedhack anymore - } } } @@ -1006,66 +999,62 @@ bool GSHwHack::OI_HauntingGround(GSRendererHW& r, GSTexture* rt, GSTexture* ds, #undef RZMSK #undef RZTST -#undef CRC_Partial -#undef CRC_Full -#undef CRC_Aggressive - //////////////////////////////////////////////////////////////////////////////// -#define CRC_F(name, level) { #name, &GSHwHack::name, level } +#define CRC_F(name) { #name, &GSHwHack::name } const GSHwHack::Entry GSHwHack::s_get_skip_count_functions[] = { - CRC_F(GSC_GodHand, CRCHackLevel::Partial), - CRC_F(GSC_KnightsOfTheTemple2, CRCHackLevel::Partial), - CRC_F(GSC_Kunoichi, CRCHackLevel::Partial), - CRC_F(GSC_Manhunt2, CRCHackLevel::Partial), - CRC_F(GSC_MidnightClub3, CRCHackLevel::Partial), - CRC_F(GSC_SacredBlaze, CRCHackLevel::Partial), - CRC_F(GSC_SakuraTaisen, CRCHackLevel::Partial), - CRC_F(GSC_SakuraWarsSoLongMyLove, CRCHackLevel::Partial), - CRC_F(GSC_Simple2000Vol114, CRCHackLevel::Partial), - CRC_F(GSC_SFEX3, CRCHackLevel::Partial), - CRC_F(GSC_TalesOfLegendia, CRCHackLevel::Partial), - CRC_F(GSC_TalesofSymphonia, CRCHackLevel::Partial), - CRC_F(GSC_UrbanReign, CRCHackLevel::Partial), - CRC_F(GSC_ZettaiZetsumeiToshi2, CRCHackLevel::Partial), - CRC_F(GSC_BlackAndBurnoutSky, CRCHackLevel::Partial), - CRC_F(GSC_BlueTongueGames, CRCHackLevel::Partial), - CRC_F(GSC_Battlefield2, CRCHackLevel::Partial), - CRC_F(GSC_NFSUndercover, CRCHackLevel::Partial), - CRC_F(GSC_PolyphonyDigitalGames, CRCHackLevel::Partial), + CRC_F(GSC_GodHand), + CRC_F(GSC_KnightsOfTheTemple2), + CRC_F(GSC_Kunoichi), + CRC_F(GSC_Manhunt2), + CRC_F(GSC_MidnightClub3), + CRC_F(GSC_SacredBlaze), + CRC_F(GSC_SakuraTaisen), + CRC_F(GSC_SakuraWarsSoLongMyLove), + CRC_F(GSC_Simple2000Vol114), + CRC_F(GSC_SFEX3), + CRC_F(GSC_TalesOfLegendia), + CRC_F(GSC_TalesofSymphonia), + CRC_F(GSC_UrbanReign), + CRC_F(GSC_ZettaiZetsumeiToshi2), + CRC_F(GSC_BlackAndBurnoutSky), + CRC_F(GSC_BlueTongueGames), + CRC_F(GSC_Battlefield2), + CRC_F(GSC_NFSUndercover), + CRC_F(GSC_PolyphonyDigitalGames), // Channel Effect - CRC_F(GSC_GiTS, CRCHackLevel::Partial), - CRC_F(GSC_SteambotChronicles, CRCHackLevel::Partial), + CRC_F(GSC_GiTS), + CRC_F(GSC_SteambotChronicles), // Depth Issue - CRC_F(GSC_BurnoutGames, CRCHackLevel::Partial), + CRC_F(GSC_BurnoutGames), // Half Screen bottom issue - CRC_F(GSC_Tekken5, CRCHackLevel::Partial), + CRC_F(GSC_Tekken5), // Texture shuffle - CRC_F(GSC_DeathByDegreesTekkenNinaWilliams, CRCHackLevel::Partial), // + Upscaling issues + CRC_F(GSC_DeathByDegreesTekkenNinaWilliams), // + Upscaling issues // Upscaling hacks - CRC_F(GSC_UltramanFightingEvolution, CRCHackLevel::Partial), + CRC_F(GSC_UltramanFightingEvolution), // Accurate Blending - CRC_F(GSC_GetawayGames, CRCHackLevel::Partial), + CRC_F(GSC_GetawayGames), }; const GSHwHack::Entry GSHwHack::s_before_draw_functions[] = { - CRC_F(OI_PointListPalette, CRCHackLevel::Minimum), - CRC_F(OI_BigMuthaTruckers, CRCHackLevel::Minimum), - CRC_F(OI_DBZBTGames, CRCHackLevel::Minimum), - CRC_F(OI_FFX, CRCHackLevel::Minimum), - CRC_F(OI_RozenMaidenGebetGarden, CRCHackLevel::Minimum), - CRC_F(OI_SonicUnleashed, CRCHackLevel::Minimum), - CRC_F(OI_ArTonelico2, CRCHackLevel::Minimum), - CRC_F(OI_BurnoutGames, CRCHackLevel::Minimum), - CRC_F(OI_Battlefield2, CRCHackLevel::Minimum), - CRC_F(OI_HauntingGround, CRCHackLevel::Minimum) + CRC_F(OI_PointListPalette), + CRC_F(OI_BigMuthaTruckers), + CRC_F(OI_DBZBTGames), + CRC_F(OI_FFX), + CRC_F(OI_RozenMaidenGebetGarden), + CRC_F(OI_SonicUnleashed), + CRC_F(OI_ArTonelico2), + CRC_F(OI_BurnoutGames), + CRC_F(OI_Battlefield2), + CRC_F(OI_HauntingGround) }; #undef CRC_F @@ -1096,28 +1085,22 @@ void GSRendererHW::UpdateCRCHacks() { GSRenderer::UpdateCRCHacks(); - const CRCHackLevel real_level = (GSConfig.CRCHack == CRCHackLevel::Automatic) ? - GSUtil::GetRecommendedCRCHackLevel(GSConfig.Renderer) : GSConfig.CRCHack; - m_nativeres = (GSConfig.UpscaleMultiplier == 1.0f); s_nativeres = m_nativeres; - s_crc_hack_level = real_level; m_gsc = nullptr; m_oi = nullptr; - if (real_level != CRCHackLevel::Off) + if (!GSConfig.UserHacks_DisableRenderFixes) { if (GSConfig.GetSkipCountFunctionId >= 0 && - static_cast(GSConfig.GetSkipCountFunctionId) < std::size(GSHwHack::s_get_skip_count_functions) && - real_level >= GSHwHack::s_get_skip_count_functions[GSConfig.GetSkipCountFunctionId].level) + static_cast(GSConfig.GetSkipCountFunctionId) < std::size(GSHwHack::s_get_skip_count_functions)) { m_gsc = GSHwHack::s_get_skip_count_functions[GSConfig.GetSkipCountFunctionId].ptr; } if (GSConfig.BeforeDrawFunctionId >= 0 && - static_cast(GSConfig.BeforeDrawFunctionId) < std::size(GSHwHack::s_before_draw_functions) && - real_level >= GSHwHack::s_before_draw_functions[GSConfig.BeforeDrawFunctionId].level) + static_cast(GSConfig.BeforeDrawFunctionId) < std::size(GSHwHack::s_before_draw_functions)) { m_oi = GSHwHack::s_before_draw_functions[GSConfig.BeforeDrawFunctionId].ptr; } diff --git a/pcsx2/GS/Renderers/HW/GSHwHack.h b/pcsx2/GS/Renderers/HW/GSHwHack.h index b18c875f48..1afafd8de8 100644 --- a/pcsx2/GS/Renderers/HW/GSHwHack.h +++ b/pcsx2/GS/Renderers/HW/GSHwHack.h @@ -61,7 +61,6 @@ public: { const char* name; F ptr; - CRCHackLevel level; }; static const Entry s_get_skip_count_functions[]; diff --git a/pcsx2/Pcsx2Config.cpp b/pcsx2/Pcsx2Config.cpp index c1d2c38168..8244ce2bf3 100644 --- a/pcsx2/Pcsx2Config.cpp +++ b/pcsx2/Pcsx2Config.cpp @@ -445,6 +445,7 @@ Pcsx2Config::GSOptions::GSOptions() UserHacks_DisableDepthSupport = false; UserHacks_DisablePartialInvalidation = false; UserHacks_DisableSafeFeatures = false; + UserHacks_DisableRenderFixes = false; UserHacks_MergePPSprite = false; UserHacks_WildHack = false; UserHacks_BilinearHack = false; @@ -506,7 +507,6 @@ bool Pcsx2Config::GSOptions::OptionsAreEqual(const GSOptions& right) const OpEqu(HWMipmap) && OpEqu(AccurateBlendingUnit) && - OpEqu(CRCHack) && OpEqu(TextureFiltering) && OpEqu(TexturePreloading) && OpEqu(GSDumpCompression) && @@ -662,6 +662,7 @@ void Pcsx2Config::GSOptions::LoadSave(SettingsWrapper& wrap) GSSettingBoolEx(UserHacks_DisableDepthSupport, "UserHacks_DisableDepthSupport"); GSSettingBoolEx(UserHacks_DisablePartialInvalidation, "UserHacks_DisablePartialInvalidation"); GSSettingBoolEx(UserHacks_DisableSafeFeatures, "UserHacks_Disable_Safe_Features"); + GSSettingBoolEx(UserHacks_DisableRenderFixes, "UserHacks_DisableRenderFixes"); GSSettingBoolEx(UserHacks_MergePPSprite, "UserHacks_merge_pp_sprite"); GSSettingBoolEx(UserHacks_WildHack, "UserHacks_WildHack"); GSSettingBoolEx(UserHacks_BilinearHack, "UserHacks_BilinearHack"); @@ -703,7 +704,6 @@ void Pcsx2Config::GSOptions::LoadSave(SettingsWrapper& wrap) GSSettingIntEnumEx(HWMipmap, "mipmap_hw"); GSSettingIntEnumEx(AccurateBlendingUnit, "accurate_blending_unit"); - GSSettingIntEnumEx(CRCHack, "crc_hack_level"); GSSettingIntEnumEx(TextureFiltering, "filter"); GSSettingIntEnumEx(TexturePreloading, "texture_preloading"); GSSettingIntEnumEx(GSDumpCompression, "GSDumpCompression"); @@ -787,6 +787,7 @@ void Pcsx2Config::GSOptions::MaskUserHacks() UserHacks_BilinearHack = false; UserHacks_NativePaletteDraw = false; UserHacks_DisableSafeFeatures = false; + UserHacks_DisableRenderFixes = false; UserHacks_HalfBottomOverride = -1; UserHacks_HalfPixelOffset = 0; UserHacks_RoundSprite = 0; diff --git a/pcsx2/VMManager.cpp b/pcsx2/VMManager.cpp index c157b5c7eb..e3f83872fa 100644 --- a/pcsx2/VMManager.cpp +++ b/pcsx2/VMManager.cpp @@ -1949,8 +1949,6 @@ void VMManager::WarnAboutUnsafeSettings() messages += ICON_FA_PAGER " Trilinear filtering is not set to automatic. This may break rendering in some games.\n"; if (EmuConfig.GS.AccurateBlendingUnit <= AccBlendLevel::Minimum) messages += ICON_FA_BLENDER " Blending is below basic, this may break effects in some games.\n"; - if (EmuConfig.GS.CRCHack != CRCHackLevel::Automatic) - messages += ICON_FA_FIRST_AID " CRC Fix Level is not set to default, this may break effects in some games.\n"; if (EmuConfig.GS.HWDownloadMode != GSHardwareDownloadMode::Enabled) messages += ICON_FA_DOWNLOAD " Hardware Download Mode is not set to Accurate, this may break rendering in some games.\n"; if (EmuConfig.Cpu.sseMXCSR.GetRoundMode() != SSEround_Chop)