From dfa7cc869c7c00a124ff3f2170c5de6809ee1ea9 Mon Sep 17 00:00:00 2001 From: cdozdil Date: Mon, 1 Jun 2026 22:24:29 +0300 Subject: [PATCH] Improved auto FSR3.X/4 selection --- OptiScaler/State.h | 13 +++++++++++++ OptiScaler/Util.cpp | 27 +++++++++++++++++++++++++++ OptiScaler/fsr4/FSR4Upgrade.cpp | 19 +++++++++++++++++-- 3 files changed, 57 insertions(+), 2 deletions(-) diff --git a/OptiScaler/State.h b/OptiScaler/State.h index db13c644..c748bcfe 100644 --- a/OptiScaler/State.h +++ b/OptiScaler/State.h @@ -10,6 +10,18 @@ #include #include +typedef enum WindowsVersion +{ + Unknown = 0, + WindowsXP, + WindowsVista, + Windows7, + Windows8, + Windows8_1, + Windows10, + Windows11, +} WindowsVersion; + typedef enum API { NotSelected = 0, @@ -89,6 +101,7 @@ class State std::string GameVersion; GameEngineType GameEngine = GameEngineType::Other; ankerl::unordered_dense::map DeviceAdapterNames; + WindowsVersion WindowsVer = WindowsVersion::Unknown; bool NvngxDx11Inited = false; bool NvngxDx12Inited = false; diff --git a/OptiScaler/Util.cpp b/OptiScaler/Util.cpp index f9594450..c6938ed3 100644 --- a/OptiScaler/Util.cpp +++ b/OptiScaler/Util.cpp @@ -97,19 +97,46 @@ std::string Util::GetWindowsName(const OSVERSIONINFOW& os) DWORD build = os.dwBuildNumber; if (major == 10 && build >= 22000) + { + State::Instance().WindowsVer = WindowsVersion::Windows11; return "Windows 11"; + } + if (major == 10) + { + State::Instance().WindowsVer = WindowsVersion::Windows10; return "Windows 10"; + } + if (major == 6 && minor == 3) + { + State::Instance().WindowsVer = WindowsVersion::Windows8_1; return "Windows 8.1"; + } + if (major == 6 && minor == 2) + { + State::Instance().WindowsVer = WindowsVersion::Windows8; return "Windows 8"; + } + if (major == 6 && minor == 1) + { + State::Instance().WindowsVer = WindowsVersion::Windows7; return "Windows 7"; + } + if (major == 6 && minor == 0) + { + State::Instance().WindowsVer = WindowsVersion::WindowsVista; return "Windows Vista"; + } + if (major == 5 && minor == 1) + { + State::Instance().WindowsVer = WindowsVersion::WindowsXP; return "Windows XP"; + } return "Unknown Windows Version"; } diff --git a/OptiScaler/fsr4/FSR4Upgrade.cpp b/OptiScaler/fsr4/FSR4Upgrade.cpp index 5ec54ec5..13bbf034 100644 --- a/OptiScaler/fsr4/FSR4Upgrade.cpp +++ b/OptiScaler/fsr4/FSR4Upgrade.cpp @@ -186,8 +186,23 @@ void CheckForGPU() if (!Config::Instance()->Dx12Upscaler.has_value()) { - LOG_INFO("Setting Dx12Upscaler to fsr31 because RDNA4 GPU is detected"); - Config::Instance()->Dx12Upscaler.set_volatile_value("fsr31"); + if (State::Instance().WindowsVer == WindowsVersion::Windows11) + { + LOG_INFO("Setting Dx12Upscaler to fsr31 because RDNA4 GPU is detected"); + Config::Instance()->Dx12Upscaler.set_volatile_value("fsr31"); + } + else + { + if (KernelBaseProxy::GetModuleHandleW_()(L"D3D12Core.dll") != nullptr) + { + LOG_INFO("Setting Dx12Upscaler to fsr31 because RDNA4 GPU is detected"); + Config::Instance()->Dx12Upscaler.set_volatile_value("fsr31"); + } + else + { + LOG_WARN("RDNA4 GPU is detected but Agility SDK is not detected!"); + } + } } } }