diff --git a/OptiScaler.ini b/OptiScaler.ini index b28b4bbc..f943a7d1 100644 --- a/OptiScaler.ini +++ b/OptiScaler.ini @@ -89,6 +89,10 @@ VelocityValidNow=auto ; true or false - Default (auto) is false HudlessValidNow=auto +; If source tags more than one hudless only use first one +; true or false - Default (auto) is false +OnlyAcceptFirstHudless=auto + diff --git a/OptiScaler/Config.cpp b/OptiScaler/Config.cpp index 141fca69..4eeb5973 100644 --- a/OptiScaler/Config.cpp +++ b/OptiScaler/Config.cpp @@ -117,6 +117,7 @@ bool Config::Reload(std::filesystem::path iniPath) FGDepthValidNow.set_from_config(readBool("FrameGen", "DepthValidNow")); FGVelocityValidNow.set_from_config(readBool("FrameGen", "VelocityValidNow")); FGHudlessValidNow.set_from_config(readBool("FrameGen", "HudlessValidNow")); + FGOnlyAcceptFirstHudless.set_from_config(readBool("FrameGen", "OnlyAcceptFirstHudless")); } // FSR FG @@ -712,6 +713,8 @@ bool Config::SaveIni() GetBoolValue(Instance()->FGVelocityValidNow.value_for_config()).c_str()); ini.SetValue("FrameGen", "HudlessValidNow", GetBoolValue(Instance()->FGHudlessValidNow.value_for_config()).c_str()); + ini.SetValue("FrameGen", "OnlyAcceptFirstHudless", + GetBoolValue(Instance()->FGOnlyAcceptFirstHudless.value_for_config()).c_str()); } // FSR FG output diff --git a/OptiScaler/Config.h b/OptiScaler/Config.h index 69b6dd3a..38a5d9a2 100644 --- a/OptiScaler/Config.h +++ b/OptiScaler/Config.h @@ -402,6 +402,7 @@ class Config CustomOptional FGDepthValidNow { false }; CustomOptional FGVelocityValidNow { false }; CustomOptional FGHudlessValidNow { false }; + CustomOptional FGOnlyAcceptFirstHudless { false }; // OptiFG CustomOptional FGEnabled { false }; diff --git a/OptiScaler/Util.cpp b/OptiScaler/Util.cpp index f433878e..e9b10332 100644 --- a/OptiScaler/Util.cpp +++ b/OptiScaler/Util.cpp @@ -192,7 +192,7 @@ std::optional Util::NvngxPath() if (ls == ERROR_SUCCESS) { - wchar_t regNGXCorePath[260]; + wchar_t regNGXCorePath[260] {}; DWORD NGXCorePathSize = 260; ls = RegQueryValueExW(regNGXCore, L"NGXPath", nullptr, nullptr, (LPBYTE) regNGXCorePath, &NGXCorePathSize); @@ -272,7 +272,7 @@ HWND Util::GetProcessWindow() return hwnd; } -inline std::string LogLastError() +static inline std::string LogLastError() { DWORD errorCode = GetLastError(); LPWSTR errorBuffer = nullptr; diff --git a/OptiScaler/framegen/ffx/FSRFG_Dx12.cpp b/OptiScaler/framegen/ffx/FSRFG_Dx12.cpp index 52c68922..286368ab 100644 --- a/OptiScaler/framegen/ffx/FSRFG_Dx12.cpp +++ b/OptiScaler/framegen/ffx/FSRFG_Dx12.cpp @@ -1136,8 +1136,17 @@ bool FSRFG_Dx12::SetResource(Dx12Resource* inputResource) return false; } - if (type == FG_ResourceType::HudlessColor && Config::Instance()->FGDisableHudless.value_or_default()) - return false; + if (type == FG_ResourceType::HudlessColor) + { + if (Config::Instance()->FGDisableHudless.value_or_default()) + return false; + + if (!_noHudless[fIndex] && Config::Instance()->FGOnlyAcceptFirstHudless.value_or_default() && + inputResource->validity != FG_ResourceValidity::UntilPresentFromDispatch) + { + return false; + } + } if (type == FG_ResourceType::UIColor && Config::Instance()->FGDisableUI.value_or_default()) return false; diff --git a/OptiScaler/framegen/xefg/XeFG_Dx12.cpp b/OptiScaler/framegen/xefg/XeFG_Dx12.cpp index 6211d14f..1681e9e3 100644 --- a/OptiScaler/framegen/xefg/XeFG_Dx12.cpp +++ b/OptiScaler/framegen/xefg/XeFG_Dx12.cpp @@ -1026,6 +1026,12 @@ bool XeFG_Dx12::SetResource(Dx12Resource* inputResource) { return false; } + + if (!_noHudless[fIndex] && Config::Instance()->FGOnlyAcceptFirstHudless.value_or_default() && + inputResource->validity != FG_ResourceValidity::UntilPresentFromDispatch) + { + return false; + } } if (type == FG_ResourceType::UIColor) diff --git a/OptiScaler/hooks/FG_Hooks.cpp b/OptiScaler/hooks/FG_Hooks.cpp index 28a26b3d..12789c91 100644 --- a/OptiScaler/hooks/FG_Hooks.cpp +++ b/OptiScaler/hooks/FG_Hooks.cpp @@ -18,7 +18,7 @@ #include -bool CheckForFGStatus() +static bool CheckForFGStatus() { // Need to check overlay menu parameter, goes to places it shouldn't go // if (!Config::Instance()->OverlayMenu.value_or_default()) diff --git a/OptiScaler/menu/menu_common.cpp b/OptiScaler/menu/menu_common.cpp index e8eb6f1f..73a8fe92 100644 --- a/OptiScaler/menu/menu_common.cpp +++ b/OptiScaler/menu/menu_common.cpp @@ -3255,6 +3255,14 @@ bool MenuCommon::RenderMenu() ShowHelpMarker("Will use more VRAM but some games might need this"); + ImGui::SameLine(0.0f, 16.0f); + + bool firstHudless = config->FGOnlyAcceptFirstHudless.value_or_default(); + if (ImGui::Checkbox("Only Accept First Hudless", &firstHudless)) + config->FGOnlyAcceptFirstHudless = firstHudless; + + ShowHelpMarker("If source tags more than one hudless only use first one"); + if (bool skipReset = config->FGSkipReset.value_or_default(); ImGui::Checkbox("Skip Reset", &skipReset)) {