From 4cbdbaabdbed2a90046a26394f6109595728bc1a Mon Sep 17 00:00:00 2001 From: Stenzek Date: Fri, 31 Mar 2023 23:19:07 +1000 Subject: [PATCH] GS/HW: Add NativePaletteDraw upscaling fix --- pcsx2-qt/Settings/GraphicsSettingsWidget.cpp | 1 + pcsx2-qt/Settings/GraphicsSettingsWidget.ui | 21 +++++++++++++------- pcsx2/Config.h | 1 + pcsx2/Docs/gamedb-schema.json | 5 +++++ pcsx2/Frontend/FullscreenUI.cpp | 2 ++ pcsx2/Frontend/ImGuiOverlays.cpp | 2 ++ pcsx2/GS/Renderers/HW/GSRendererHW.cpp | 12 +++++++++++ pcsx2/GameDatabase.cpp | 8 ++++++++ pcsx2/GameDatabase.h | 1 + pcsx2/Pcsx2Config.cpp | 4 ++++ 10 files changed, 50 insertions(+), 7 deletions(-) diff --git a/pcsx2-qt/Settings/GraphicsSettingsWidget.cpp b/pcsx2-qt/Settings/GraphicsSettingsWidget.cpp index ec42af854c..4f1bab08db 100644 --- a/pcsx2-qt/Settings/GraphicsSettingsWidget.cpp +++ b/pcsx2-qt/Settings/GraphicsSettingsWidget.cpp @@ -235,6 +235,7 @@ GraphicsSettingsWidget::GraphicsSettingsWidget(SettingsDialog* dialog, QWidget* SettingWidgetBinder::BindWidgetToBoolSetting(sif, m_ui.mergeSprite, "EmuCore/GS", "UserHacks_merge_pp_sprite", false); SettingWidgetBinder::BindWidgetToBoolSetting(sif, m_ui.wildHack, "EmuCore/GS", "UserHacks_WildHack", false); SettingWidgetBinder::BindWidgetToBoolSetting(sif, m_ui.bilinearHack, "EmuCore/GS", "UserHacks_BilinearHack", false); + SettingWidgetBinder::BindWidgetToBoolSetting(sif, m_ui.nativePaletteDraw, "EmuCore/GS", "UserHacks_NativePaletteDraw", false); ////////////////////////////////////////////////////////////////////////// // Texture Replacements ////////////////////////////////////////////////////////////////////////// diff --git a/pcsx2-qt/Settings/GraphicsSettingsWidget.ui b/pcsx2-qt/Settings/GraphicsSettingsWidget.ui index e8c1679349..dc1f65fc00 100644 --- a/pcsx2-qt/Settings/GraphicsSettingsWidget.ui +++ b/pcsx2-qt/Settings/GraphicsSettingsWidget.ui @@ -1224,13 +1224,6 @@ - - - - Merge Sprite - - - @@ -1252,6 +1245,20 @@ + + + + Merge Sprite + + + + + + + Unscaled Palette Texture Draws + + + diff --git a/pcsx2/Config.h b/pcsx2/Config.h index b6f4d11038..86fc19cc99 100644 --- a/pcsx2/Config.h +++ b/pcsx2/Config.h @@ -678,6 +678,7 @@ struct Pcsx2Config UserHacks_MergePPSprite : 1, UserHacks_WildHack : 1, UserHacks_BilinearHack : 1, + UserHacks_NativePaletteDraw : 1, UserHacks_TargetPartialInvalidation : 1, UserHacks_EstimateTextureRegion : 1, FXAA : 1, diff --git a/pcsx2/Docs/gamedb-schema.json b/pcsx2/Docs/gamedb-schema.json index f18b980725..37c4540da3 100644 --- a/pcsx2/Docs/gamedb-schema.json +++ b/pcsx2/Docs/gamedb-schema.json @@ -176,6 +176,11 @@ "minimum": 0, "maximum": 1 }, + "nativePaletteDraw": { + "type": "integer", + "minimum": 0, + "maximum": 1 + }, "estimateTextureRegion": { "type": "integer", "minimum": 0, diff --git a/pcsx2/Frontend/FullscreenUI.cpp b/pcsx2/Frontend/FullscreenUI.cpp index 3a7c77db9b..6b0360b019 100644 --- a/pcsx2/Frontend/FullscreenUI.cpp +++ b/pcsx2/Frontend/FullscreenUI.cpp @@ -3241,6 +3241,8 @@ void FullscreenUI::DrawGraphicsSettingsPage() DrawToggleSetting(bsi, "Bilinear Upscale", "Can smooth out textures due to be bilinear filtered when upscaling. E.g. Brave sun glare.", "EmuCore/GS", "UserHacks_BilinearHack", false, manual_hw_fixes); + DrawToggleSetting(bsi, "Unscaled Palette Texture Draws", "Can fix some broken effects which rely on pixel perfect precision.", + "EmuCore/GS", "UserHacks_NativePaletteDraw", false, manual_hw_fixes); } } diff --git a/pcsx2/Frontend/ImGuiOverlays.cpp b/pcsx2/Frontend/ImGuiOverlays.cpp index 89c06dab99..1ec8309d41 100644 --- a/pcsx2/Frontend/ImGuiOverlays.cpp +++ b/pcsx2/Frontend/ImGuiOverlays.cpp @@ -417,6 +417,8 @@ void ImGuiManager::DrawSettingsOverlay() APPEND("WA "); if (GSConfig.UserHacks_BilinearHack) APPEND("BLU "); + if (GSConfig.UserHacks_NativePaletteDraw) + APPEND("NPD "); if (GSConfig.UserHacks_MergePPSprite) APPEND("MS "); if (GSConfig.UserHacks_AlignSpriteX) diff --git a/pcsx2/GS/Renderers/HW/GSRendererHW.cpp b/pcsx2/GS/Renderers/HW/GSRendererHW.cpp index a9b2806195..e6e06ee243 100644 --- a/pcsx2/GS/Renderers/HW/GSRendererHW.cpp +++ b/pcsx2/GS/Renderers/HW/GSRendererHW.cpp @@ -1793,6 +1793,18 @@ void GSRendererHW::Draw() // Ensure draw rect is clamped to framebuffer size. Necessary for updating valid area. m_r = m_r.rintersect(GSVector4i::loadh(t_size)); + float target_scale = GetTextureScaleFactor(); + + // This upscaling hack is for games which construct P8 textures by drawing a bunch of small sprites in C32, + // then reinterpreting it as P8. We need to keep the off-screen intermediate textures at native resolution, + // but not propagate that through to the normal render targets. Test Case: Crash Wrath of Cortex. + if (no_ds && src && !m_channel_shuffle && GSConfig.UserHacks_NativePaletteDraw && src->m_from_target && + src->m_scale == 1.0f && (src->m_TEX0.PSM == PSM_PSMT8 || src->m_TEX0.TBP0 == m_context->FRAME.Block())) + { + GL_CACHE("Using native resolution for target based on texture source"); + target_scale = 1.0f; + } + GSTextureCache::Target* rt = nullptr; GIFRegTEX0 FRAME_TEX0; if (!no_rt) diff --git a/pcsx2/GameDatabase.cpp b/pcsx2/GameDatabase.cpp index 9f38cf75de..ab4b110b73 100644 --- a/pcsx2/GameDatabase.cpp +++ b/pcsx2/GameDatabase.cpp @@ -353,6 +353,7 @@ static const char* s_gs_hw_fix_names[] = { "mergeSprite", "wildArmsHack", "bilinearUpscale", + "nativePaletteDraw", "estimateTextureRegion", "PCRTCOffsets", "PCRTCOverscan", @@ -593,6 +594,9 @@ bool GameDatabaseSchema::GameEntry::configMatchesHWFix(const Pcsx2Config::GSOpti case GSHWFixId::BilinearUpscale: return (config.UpscaleMultiplier <= 1.0f || static_cast(config.UserHacks_BilinearHack) == value); + case GSHWFixId::NativePaletteDraw: + return (config.UpscaleMultiplier <= 1.0f || static_cast(config.UserHacks_NativePaletteDraw) == value); + case GSHWFixId::EstimateTextureRegion: return (static_cast(config.UserHacks_EstimateTextureRegion) == value); @@ -739,6 +743,10 @@ u32 GameDatabaseSchema::GameEntry::applyGSHardwareFixes(Pcsx2Config::GSOptions& config.UserHacks_BilinearHack = (value > 0); break; + case GSHWFixId::NativePaletteDraw: + config.UserHacks_NativePaletteDraw = (value > 0); + break; + case GSHWFixId::EstimateTextureRegion: config.UserHacks_EstimateTextureRegion = (value > 0); break; diff --git a/pcsx2/GameDatabase.h b/pcsx2/GameDatabase.h index 33f27ac66a..0930fd3889 100644 --- a/pcsx2/GameDatabase.h +++ b/pcsx2/GameDatabase.h @@ -72,6 +72,7 @@ namespace GameDatabaseSchema MergeSprite, WildArmsHack, BilinearUpscale, + NativePaletteDraw, EstimateTextureRegion, PCRTCOffsets, PCRTCOverscan, diff --git a/pcsx2/Pcsx2Config.cpp b/pcsx2/Pcsx2Config.cpp index 6894c491b4..cb9cb098a1 100644 --- a/pcsx2/Pcsx2Config.cpp +++ b/pcsx2/Pcsx2Config.cpp @@ -444,6 +444,7 @@ Pcsx2Config::GSOptions::GSOptions() UserHacks_MergePPSprite = false; UserHacks_WildHack = false; UserHacks_BilinearHack = false; + UserHacks_NativePaletteDraw = false; DumpReplaceableTextures = false; DumpReplaceableMipmaps = false; @@ -659,6 +660,7 @@ void Pcsx2Config::GSOptions::LoadSave(SettingsWrapper& wrap) GSSettingBoolEx(UserHacks_MergePPSprite, "UserHacks_merge_pp_sprite"); GSSettingBoolEx(UserHacks_WildHack, "UserHacks_WildHack"); GSSettingBoolEx(UserHacks_BilinearHack, "UserHacks_BilinearHack"); + GSSettingBoolEx(UserHacks_NativePaletteDraw, "UserHacks_NativePaletteDraw"); GSSettingIntEnumEx(UserHacks_TextureInsideRt, "UserHacks_TextureInsideRt"); GSSettingBoolEx(UserHacks_TargetPartialInvalidation, "UserHacks_TargetPartialInvalidation"); GSSettingBoolEx(UserHacks_EstimateTextureRegion, "UserHacks_EstimateTextureRegion"); @@ -778,6 +780,7 @@ void Pcsx2Config::GSOptions::MaskUserHacks() UserHacks_MergePPSprite = false; UserHacks_WildHack = false; UserHacks_BilinearHack = false; + UserHacks_NativePaletteDraw = false; UserHacks_DisableSafeFeatures = false; UserHacks_HalfBottomOverride = -1; UserHacks_HalfPixelOffset = 0; @@ -810,6 +813,7 @@ void Pcsx2Config::GSOptions::MaskUpscalingHacks() UserHacks_MergePPSprite = false; UserHacks_WildHack = false; UserHacks_BilinearHack = false; + UserHacks_NativePaletteDraw = false; UserHacks_HalfPixelOffset = 0; UserHacks_RoundSprite = 0; UserHacks_TCOffsetX = 0;