diff --git a/OptiScaler/dllmain.cpp b/OptiScaler/dllmain.cpp index e62b5296..2baaddb5 100644 --- a/OptiScaler/dllmain.cpp +++ b/OptiScaler/dllmain.cpp @@ -1232,6 +1232,9 @@ static void printQuirks(flag_set& quirks) if (quirks & GameQuirk::OldOverlayMenu) stringQuirks.push_back("Using old overlay (draws on upscaled image)"); + if (quirks & GameQuirk::PregmataFixDLSSModes) + stringQuirks.push_back("Fix DLSS quality selection in Pragmata"); + state->detectedQuirks.append_range(stringQuirks); for (auto& stringQuirk : stringQuirks) spdlog::info("Quirk: {}", stringQuirk); diff --git a/OptiScaler/hooks/Streamline_Hooks.cpp b/OptiScaler/hooks/Streamline_Hooks.cpp index dfb6f6ab..f54dfc0f 100644 --- a/OptiScaler/hooks/Streamline_Hooks.cpp +++ b/OptiScaler/hooks/Streamline_Hooks.cpp @@ -41,6 +41,7 @@ sl1::pfunLogMessageCallback* StreamlineHooks::o_logCallback_sl1 = nullptr; // DLSS StreamlineHooks::PFN_slGetPluginFunction StreamlineHooks::o_dlss_slGetPluginFunction = nullptr; StreamlineHooks::PFN_slOnPluginLoad StreamlineHooks::o_dlss_slOnPluginLoad = nullptr; +decltype(&slDLSSGetOptimalSettings) StreamlineHooks::o_slDLSSGetOptimalSettings = nullptr; // DLSSG StreamlineHooks::PFN_slGetPluginFunction StreamlineHooks::o_dlssg_slGetPluginFunction = nullptr; @@ -583,6 +584,33 @@ bool StreamlineHooks::hkdlss_slOnPluginLoad(sl::param::IParameters* params, cons return result; } +sl::Result StreamlineHooks::hkslDLSSGetOptimalSettings(const sl::DLSSOptions& options, + sl::DLSSOptimalSettings& settings) +{ + static bool modesBroken = false; + + auto localOptions = options; + + if (localOptions.mode == sl::DLSSMode::eOff) + modesBroken = true; + + if (modesBroken) + { + if (localOptions.mode == sl::DLSSMode::eMaxPerformance) + localOptions.mode = sl::DLSSMode::eUltraPerformance; + else if (localOptions.mode == sl::DLSSMode::eBalanced) + localOptions.mode = sl::DLSSMode::eMaxPerformance; + else if (localOptions.mode == sl::DLSSMode::eMaxQuality) + localOptions.mode = sl::DLSSMode::eBalanced; + else if (localOptions.mode == sl::DLSSMode::eUltraQuality) + localOptions.mode = sl::DLSSMode::eMaxQuality; + else if (localOptions.mode == sl::DLSSMode::eUltraPerformance) + localOptions.mode = sl::DLSSMode::eDLAA; + } + + return o_slDLSSGetOptimalSettings(localOptions, settings); +} + bool StreamlineHooks::hkdlssg_slOnPluginLoad(sl::param::IParameters* params, const char* loaderJSON, const char** pluginJSON) { @@ -1035,7 +1063,7 @@ sl::Result StreamlineHooks::hkslReflexSleep(const sl::FrameToken& frame) void* StreamlineHooks::hkdlss_slGetPluginFunction(const char* functionName) { - // LOG_DEBUG("{}", functionName); + LOG_DEBUG("{}", functionName); if (strcmp(functionName, "slOnPluginLoad") == 0) { @@ -1043,6 +1071,13 @@ void* StreamlineHooks::hkdlss_slGetPluginFunction(const char* functionName) return &hkdlss_slOnPluginLoad; } + if (strcmp(functionName, "slDLSSGetOptimalSettings") == 0 && + State::Instance().gameQuirks & GameQuirk::PregmataFixDLSSModes) + { + o_slDLSSGetOptimalSettings = (decltype(&slDLSSGetOptimalSettings)) o_dlss_slGetPluginFunction(functionName); + return &hkslDLSSGetOptimalSettings; + } + return o_dlss_slGetPluginFunction(functionName); } diff --git a/OptiScaler/hooks/Streamline_Hooks.h b/OptiScaler/hooks/Streamline_Hooks.h index e415e8bf..ad5221b3 100644 --- a/OptiScaler/hooks/Streamline_Hooks.h +++ b/OptiScaler/hooks/Streamline_Hooks.h @@ -4,6 +4,7 @@ #include #include #include +#include #include #include @@ -220,8 +221,10 @@ class StreamlineHooks // DLSS static PFN_slGetPluginFunction o_dlss_slGetPluginFunction; static PFN_slOnPluginLoad o_dlss_slOnPluginLoad; + static decltype(&slDLSSGetOptimalSettings) o_slDLSSGetOptimalSettings; static bool hkdlss_slOnPluginLoad(sl::param::IParameters* params, const char* loaderJSON, const char** pluginJSON); + static sl::Result hkslDLSSGetOptimalSettings(const sl::DLSSOptions& options, sl::DLSSOptimalSettings& settings); static void* hkdlss_slGetPluginFunction(const char* functionName); // DLSSG @@ -299,6 +302,7 @@ class StreamlineHooks VALIDATE_MEMBER_HOOK(hkslGetNativeInterface, decltype(&slGetNativeInterface)) VALIDATE_MEMBER_HOOK(hkslSetD3DDevice, decltype(&slSetD3DDevice)) VALIDATE_MEMBER_HOOK(hkdlss_slOnPluginLoad, PFN_slOnPluginLoad) + VALIDATE_MEMBER_HOOK(hkslDLSSGetOptimalSettings, decltype(&slDLSSGetOptimalSettings)) VALIDATE_MEMBER_HOOK(hkdlss_slGetPluginFunction, PFN_slGetPluginFunction) VALIDATE_MEMBER_HOOK(hkdlssg_slOnPluginLoad, PFN_slOnPluginLoad) VALIDATE_MEMBER_HOOK(hkslSetConstants, decltype(&slSetConstants)) diff --git a/OptiScaler/misc/Quirks.h b/OptiScaler/misc/Quirks.h index cb2174b6..7966031b 100644 --- a/OptiScaler/misc/Quirks.h +++ b/OptiScaler/misc/Quirks.h @@ -60,6 +60,7 @@ enum class GameQuirk : uint64_t CreateD3D12DeviceForLuma, ForceCreateD3D12Device, ForceDepthD32S8, + PregmataFixDLSSModes, // Don't forget to add the new entry to printQuirks _ }; @@ -146,13 +147,13 @@ static const QuirkEntry quirkTable[] = { QUIRK_ENTRY("dd2ccs.exe", GameQuirk::RestoreComputeSigOnNonNvidia, GameQuirk::DisableDxgiSpoofing), QUIRK_ENTRY("dd2.exe", GameQuirk::RestoreComputeSigOnNonNvidia, GameQuirk::DisableDxgiSpoofing), QUIRK_ENTRY("pragmata_sketchbook.exe", GameQuirk::RestoreComputeSigOnNonNvidia, GameQuirk::DisableDxgiSpoofing, - GameQuirk::AllowedFrameAhead2), + GameQuirk::AllowedFrameAhead2, GameQuirk::PregmataFixDLSSModes), QUIRK_ENTRY("re9.exe", GameQuirk::RestoreComputeSigOnNonNvidia, GameQuirk::DisableDxgiSpoofing, GameQuirk::RestoreComputeSigOnNvidia), QUIRK_ENTRY("monster_hunter_stories_3_twisted_reflection.exe", GameQuirk::RestoreComputeSigOnNonNvidia, GameQuirk::DisableDxgiSpoofing, GameQuirk::RestoreComputeSigOnNvidia), QUIRK_ENTRY("pragmata.exe", GameQuirk::RestoreComputeSigOnNonNvidia, GameQuirk::DisableDxgiSpoofing, - GameQuirk::RestoreComputeSigOnNvidia), + GameQuirk::RestoreComputeSigOnNvidia, GameQuirk::PregmataFixDLSSModes), // REF PDUpscaler branch // Old menu needed to avoid the invisible overlay while upscaling is active