mirror of
https://github.com/optiscaler/OptiScaler.git
synced 2026-08-24 23:26:50 +00:00
Workaround Pragmata's broken DLSS preset selection
This commit is contained in:
@@ -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);
|
||||
|
||||
@@ -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,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))
|
||||
|
||||
@@ -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
|
||||
|
||||
Reference in New Issue
Block a user