From feb9a2e4f2f95c04ce2a4e482b410ad03b552b60 Mon Sep 17 00:00:00 2001 From: cdozdila Date: Mon, 5 May 2025 00:21:04 +0300 Subject: [PATCH] Added FlipMetering disabling option --- OptiScaler.ini | 10 ++++++++++ OptiScaler/Config.cpp | 2 ++ OptiScaler/Config.h | 1 + OptiScaler/nvapi/NvApiHooks.cpp | 7 +++++++ 4 files changed, 20 insertions(+) diff --git a/OptiScaler.ini b/OptiScaler.ini index c1ddab16..bafc4e19 100644 --- a/OptiScaler.ini +++ b/OptiScaler.ini @@ -96,6 +96,11 @@ AlwaysTrackHeaps=auto ; true or false - Default (auto) is false HudfixTrackRelease=auto +; CBV Track mode +; 0 = Don't Track | 1 = Track After Upscale | 2 = Always Track +; true or false - Default (auto) is 0 +HudfixCBVTrackMode=auto + ; Makes a copy of Depth to be used with Hudfix FG call ; Setting it false most probably cause occasional garbling ; true or false - Default (auto) is true @@ -538,6 +543,11 @@ LoadReshade=auto ; true or false - Default (auto) is false for Nvidia, true for others OverrideNvapiDll=auto +; Disable FlipMatering +; Fix the thick frametime graph caused by Nvidia's Flip Metering when using NukemFG, needs Fakenvapi to work +; true or false - Default (auto) is false for Nvidia, true for others +DisableFlipMetering=auto + ; If nvapi override enabled and file path defined here ; will try to load it from here, otherwise will check current folder for nvapi64.dll ; Default (auto) is local folder diff --git a/OptiScaler/Config.cpp b/OptiScaler/Config.cpp index 5322df28..af8391c5 100644 --- a/OptiScaler/Config.cpp +++ b/OptiScaler/Config.cpp @@ -371,6 +371,7 @@ bool Config::Reload(std::filesystem::path iniPath) { OverrideNvapiDll.set_from_config(readBool("NvApi", "OverrideNvapiDll")); NvapiDllPath.set_from_config(readWString("NvApi", "NvapiDllPath", true)); + DisableFlipMetering.set_from_config(readBool("NvApi", "DisableFlipMetering")); } // Spoofing @@ -806,6 +807,7 @@ bool Config::SaveIni() { ini.SetValue("NvApi", "OverrideNvapiDll", GetBoolValue(Instance()->OverrideNvapiDll.value_for_config()).c_str()); ini.SetValue("NvApi", "NvapiDllPath", wstring_to_string(Instance()->NvapiDllPath.value_for_config_or(L"auto")).c_str()); + ini.SetValue("NvApi", "DisableFlipMetering", GetBoolValue(Instance()->DisableFlipMetering.value_for_config()).c_str()); } // DRS diff --git a/OptiScaler/Config.h b/OptiScaler/Config.h index f036880a..de57bacc 100644 --- a/OptiScaler/Config.h +++ b/OptiScaler/Config.h @@ -292,6 +292,7 @@ public: // NVAPI Override CustomOptional OverrideNvapiDll{ false }; CustomOptional NvapiDllPath; + CustomOptional DisableFlipMetering{ false }; // Spoofing CustomOptional DxgiSpoofing{ true }; diff --git a/OptiScaler/nvapi/NvApiHooks.cpp b/OptiScaler/nvapi/NvApiHooks.cpp index ab0ee49d..3b333cd0 100644 --- a/OptiScaler/nvapi/NvApiHooks.cpp +++ b/OptiScaler/nvapi/NvApiHooks.cpp @@ -69,6 +69,13 @@ void* __stdcall NvApiHooks::hkNvAPI_QueryInterface(unsigned int InterfaceId) //LOG_DEBUG("counter: {} InterfaceId: {:X}", ++qiCounter, (uint32_t)InterfaceId); + // Disable flip metering + if (InterfaceId == 0xF3148C42 && Config::Instance()->DisableFlipMetering.value_or(!State::Instance().isRunningOnNvidia)) + { + LOG_INFO("FlipMetering is disabled!"); + return nullptr; + } + if (InterfaceId == GET_ID(NvAPI_D3D_SetSleepMode) || InterfaceId == GET_ID(NvAPI_D3D_Sleep) || InterfaceId == GET_ID(NvAPI_D3D_GetLatency) ||