From 3410c976e72bdf7fc01823c4da81cba6bbaaeeff Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Micha=C5=82=20Lewandowski?=
<49685661+FakeMichau@users.noreply.github.com>
Date: Sun, 9 Feb 2025 17:16:47 +0100
Subject: [PATCH] Rework nvapi code and deal with externally overridden DLSS
presets (#199)
* Clean up nvapi
* Fix up fakenvapi
* Clean up nvapi hooks
* Minor fixes
* Don't log reflex calls by default
* Add warning and config for externally overridden DLSS presets
* Add missing value_for_config()
* Add support for the "Latest" preset
* Fix typo in the config
---
OptiScaler.ini | 2 +-
OptiScaler/Config.cpp | 30 +-
OptiScaler/OptiScaler.vcxproj | 4 +
OptiScaler/OptiScaler.vcxproj.filters | 12 +
OptiScaler/State.h | 4 +-
OptiScaler/hooks/HooksDx.cpp | 5 +-
OptiScaler/hooks/HooksDx.h | 3 -
OptiScaler/menu/menu_common.cpp | 40 +-
OptiScaler/nvapi/NvApiHooks.cpp | 142 ++
OptiScaler/nvapi/NvApiHooks.h | 141 +-
OptiScaler/nvapi/NvApiTypes.cpp | 32 +
OptiScaler/nvapi/NvApiTypes.h | 26 +-
OptiScaler/nvapi/ReflexHooks.cpp | 206 +++
OptiScaler/nvapi/ReflexHooks.h | 217 +--
OptiScaler/nvapi/fakenvapi.cpp | 64 +
OptiScaler/nvapi/fakenvapi.h | 82 +-
.../upscalers/fsr31/FSR31Feature_Dx11On12.h | 3 +-
.../upscalers/fsr31/FSR31Feature_Dx12.h | 3 +-
OptiScaler/upscalers/fsr31/FSR31Feature_Vk.h | 1 +
external/nvapi/NvApiDriverSettings.h | 1322 +++++++++++++++++
external/nvapi/nvapi_interface.h | 546 +++++++
21 files changed, 2430 insertions(+), 455 deletions(-)
create mode 100644 OptiScaler/nvapi/NvApiHooks.cpp
create mode 100644 OptiScaler/nvapi/NvApiTypes.cpp
create mode 100644 OptiScaler/nvapi/ReflexHooks.cpp
create mode 100644 OptiScaler/nvapi/fakenvapi.cpp
create mode 100644 external/nvapi/NvApiDriverSettings.h
create mode 100644 external/nvapi/nvapi_interface.h
diff --git a/OptiScaler.ini b/OptiScaler.ini
index f29965cf..6860332c 100644
--- a/OptiScaler.ini
+++ b/OptiScaler.ini
@@ -319,7 +319,7 @@ RenderPresetUltraPerformance=auto
; -------------------------------------------------------
-[DLSSG]
+[Nukems]
; -------------------------------------------------------
; Fix broken visuals in some games (mostly non-UE) on AMD GPUs under Windows
; Can cause stutters so best to use only when necessary
diff --git a/OptiScaler/Config.cpp b/OptiScaler/Config.cpp
index 51d7c5c8..aadff569 100644
--- a/OptiScaler/Config.cpp
+++ b/OptiScaler/Config.cpp
@@ -135,25 +135,27 @@ bool Config::Reload(std::filesystem::path iniPath)
RenderPresetOverride.set_from_config(readBool("DLSS", "RenderPresetOverride"));
- if (auto setting = readInt("DLSS", "RenderPresetForAll"); setting.has_value() && setting >= 0 && setting <= 15)
+ constexpr size_t presetCount = 17;
+
+ if (auto setting = readInt("DLSS", "RenderPresetForAll"); setting.has_value() && setting >= 0 && (setting < presetCount || setting == 0x00FFFFFF))
RenderPresetForAll.set_from_config(setting);
- if (auto setting = readInt("DLSS", "RenderPresetDLAA"); setting.has_value() && setting >= 0 && setting <= 15)
+ if (auto setting = readInt("DLSS", "RenderPresetDLAA"); setting.has_value() && setting >= 0 && (setting < presetCount || setting == 0x00FFFFFF))
RenderPresetDLAA.set_from_config(setting);
- if (auto setting = readInt("DLSS", "RenderPresetUltraQuality"); setting.has_value() && setting >= 0 && setting <= 15)
+ if (auto setting = readInt("DLSS", "RenderPresetUltraQuality"); setting.has_value() && setting >= 0 && (setting < presetCount || setting == 0x00FFFFFF))
RenderPresetUltraQuality.set_from_config(setting);
- if (auto setting = readInt("DLSS", "RenderPresetQuality"); setting.has_value() && setting >= 0 && setting <= 15)
+ if (auto setting = readInt("DLSS", "RenderPresetQuality"); setting.has_value() && setting >= 0 && (setting < presetCount || setting == 0x00FFFFFF))
RenderPresetQuality.set_from_config(setting);
- if (auto setting = readInt("DLSS", "RenderPresetBalanced"); setting.has_value() && setting >= 0 && setting <= 15)
+ if (auto setting = readInt("DLSS", "RenderPresetBalanced"); setting.has_value() && setting >= 0 && (setting < presetCount || setting == 0x00FFFFFF))
RenderPresetBalanced.set_from_config(setting);
- if (auto setting = readInt("DLSS", "RenderPresetPerformance"); setting.has_value() && setting >= 0 && setting <= 15)
+ if (auto setting = readInt("DLSS", "RenderPresetPerformance"); setting.has_value() && setting >= 0 && (setting < presetCount || setting == 0x00FFFFFF))
RenderPresetPerformance.set_from_config(setting);
- if (auto setting = readInt("DLSS", "RenderPresetUltraPerformance"); setting.has_value() && setting >= 0 && setting <= 15)
+ if (auto setting = readInt("DLSS", "RenderPresetUltraPerformance"); setting.has_value() && setting >= 0 && (setting < presetCount || setting == 0x00FFFFFF))
RenderPresetUltraPerformance.set_from_config(setting);
}
@@ -613,13 +615,13 @@ bool Config::SaveIni()
ini.SetValue("DLSS", "LibraryPath", wstring_to_string(Instance()->NvngxPath.value_for_config_or(L"auto")).c_str());
ini.SetValue("DLSS", "NVNGX_DLSS_Library", wstring_to_string(Instance()->NVNGX_DLSS_Library.value_for_config_or(L"auto")).c_str());
ini.SetValue("DLSS", "RenderPresetOverride", GetBoolValue(Instance()->RenderPresetOverride.value_for_config()).c_str());
- ini.SetValue("DLSS", "RenderPresetForAll", GetIntValue(Instance()->RenderPresetForAll).c_str());
- ini.SetValue("DLSS", "RenderPresetDLAA", GetIntValue(Instance()->RenderPresetDLAA).c_str());
- ini.SetValue("DLSS", "RenderPresetUltraQuality", GetIntValue(Instance()->RenderPresetUltraQuality).c_str());
- ini.SetValue("DLSS", "RenderPresetQuality", GetIntValue(Instance()->RenderPresetQuality).c_str());
- ini.SetValue("DLSS", "RenderPresetBalanced", GetIntValue(Instance()->RenderPresetBalanced).c_str());
- ini.SetValue("DLSS", "RenderPresetPerformance", GetIntValue(Instance()->RenderPresetPerformance).c_str());
- ini.SetValue("DLSS", "RenderPresetUltraPerformance", GetIntValue(Instance()->RenderPresetUltraPerformance).c_str());
+ ini.SetValue("DLSS", "RenderPresetForAll", GetIntValue(Instance()->RenderPresetForAll.value_for_config()).c_str());
+ ini.SetValue("DLSS", "RenderPresetDLAA", GetIntValue(Instance()->RenderPresetDLAA.value_for_config()).c_str());
+ ini.SetValue("DLSS", "RenderPresetUltraQuality", GetIntValue(Instance()->RenderPresetUltraQuality.value_for_config()).c_str());
+ ini.SetValue("DLSS", "RenderPresetQuality", GetIntValue(Instance()->RenderPresetQuality.value_for_config()).c_str());
+ ini.SetValue("DLSS", "RenderPresetBalanced", GetIntValue(Instance()->RenderPresetBalanced.value_for_config()).c_str());
+ ini.SetValue("DLSS", "RenderPresetPerformance", GetIntValue(Instance()->RenderPresetPerformance.value_for_config()).c_str());
+ ini.SetValue("DLSS", "RenderPresetUltraPerformance", GetIntValue(Instance()->RenderPresetUltraPerformance.value_for_config()).c_str());
}
// Nukems
diff --git a/OptiScaler/OptiScaler.vcxproj b/OptiScaler/OptiScaler.vcxproj
index 14e01a88..7ea3ddf5 100644
--- a/OptiScaler/OptiScaler.vcxproj
+++ b/OptiScaler/OptiScaler.vcxproj
@@ -415,6 +415,10 @@ copy NUL "$(SolutionDir)x64\Release\a\!! EXTRACT ALL FILES TO GAME FOLDER !!" /Y
+
+
+
+
diff --git a/OptiScaler/OptiScaler.vcxproj.filters b/OptiScaler/OptiScaler.vcxproj.filters
index 4281fd29..fae65156 100644
--- a/OptiScaler/OptiScaler.vcxproj.filters
+++ b/OptiScaler/OptiScaler.vcxproj.filters
@@ -608,6 +608,18 @@
Source Files
+
+ Source Files
+
+
+ Source Files
+
+
+ Source Files
+
+
+ Source Files
+
diff --git a/OptiScaler/State.h b/OptiScaler/State.h
index f5ea5f95..9d5c0ea4 100644
--- a/OptiScaler/State.h
+++ b/OptiScaler/State.h
@@ -93,8 +93,10 @@ public:
float lastMipBias = 100.0f;
float lastMipBiasMax = -100.0f;
- // DLSS Hook
+ // DLSS
bool upscalerDisableHook = false;
+ bool dlssPresetsOverriddenExternally = false;
+ bool dlssdPresetsOverriddenExternally = false;
// Spoofing
bool skipSpoofing = false;
diff --git a/OptiScaler/hooks/HooksDx.cpp b/OptiScaler/hooks/HooksDx.cpp
index 1d911b46..934780e8 100644
--- a/OptiScaler/hooks/HooksDx.cpp
+++ b/OptiScaler/hooks/HooksDx.cpp
@@ -2,11 +2,12 @@
#include "wrapped_swapchain.h"
#include
-#include
#include
#include