Workaround Pragmata's broken DLSS preset selection

This commit is contained in:
FakeMichau
2026-04-20 01:05:29 +02:00
parent 89f6be6c6a
commit 77dac8dd8d
4 changed files with 46 additions and 3 deletions
+3
View File
@@ -1232,6 +1232,9 @@ static void printQuirks(flag_set<GameQuirk>& 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);
+36 -1
View File
@@ -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);
}
+4
View File
@@ -4,6 +4,7 @@
#include <sl.h>
#include <sl1.h>
#include <sl_dlss_g.h>
#include <sl_dlss.h>
#include <sl_pcl.h>
#include <sl_reflex.h>
@@ -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))
+3 -2
View File
@@ -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