From 42908341397deaec2f2df30d781e73913b96ea16 Mon Sep 17 00:00:00 2001 From: FakeMichau <49685661+FakeMichau@users.noreply.github.com> Date: Mon, 17 Aug 2026 21:14:46 +0200 Subject: [PATCH] Fixes around DLSSG via SL -> DLSSG conversion Generally no need to do this but there were some bugs --- OptiScaler/framegen/dlssg/DLSSG_Dx12.cpp | 13 ++--- OptiScaler/hooks/LibraryLoad_Hooks.cpp | 73 ++++++++++++++++-------- 2 files changed, 53 insertions(+), 33 deletions(-) diff --git a/OptiScaler/framegen/dlssg/DLSSG_Dx12.cpp b/OptiScaler/framegen/dlssg/DLSSG_Dx12.cpp index 8ca017c9..5377cb14 100644 --- a/OptiScaler/framegen/dlssg/DLSSG_Dx12.cpp +++ b/OptiScaler/framegen/dlssg/DLSSG_Dx12.cpp @@ -434,17 +434,13 @@ bool DLSSG_Dx12::Dispatch() constData.cameraRight.x = _cameraRight[fIndex][0]; constData.cameraRight.y = _cameraRight[fIndex][1]; constData.cameraRight.z = _cameraRight[fIndex][2]; - - constData.cameraRight.x = _cameraRight[fIndex][0]; - constData.cameraRight.y = _cameraRight[fIndex][1]; - constData.cameraRight.z = _cameraRight[fIndex][2]; } else { constData.cameraPos = { 0.0f, 0.0f, 0.0f }; - constData.cameraRight = { 1.0f, 0.0f, 0.0f }; - constData.cameraUp = { 0.0f, 1.0f, 0.0f }; - constData.cameraFwd = { 0.0f, 0.0f, 1.0f }; + constData.cameraUp = { 0.0f, 0.0f, 1.0f }; + constData.cameraRight = { 0.0f, 1.0f, 0.0f }; + constData.cameraFwd = { 1.0f, 0.0f, 0.0f }; constData.cameraPinholeOffset = { 0.0f, 0.0f }; XMMATRIX cameraViewToClip {}; @@ -477,6 +473,7 @@ bool DLSSG_Dx12::Dispatch() memcpy(&constData.clipToCameraView, &temp, sizeof(sl::float4x4)); XMStoreFloat4x4(&temp, prev); + memcpy(&constData.clipToLensClip, &temp, sizeof(sl::float4x4)); memcpy(&constData.clipToPrevClip, &temp, sizeof(sl::float4x4)); memcpy(&constData.prevClipToClip, &temp, sizeof(sl::float4x4)); } @@ -524,7 +521,7 @@ bool DLSSG_Dx12::Dispatch() constData.depthInverted = IsInvertedDepth() ? sl::Boolean::eTrue : sl::Boolean::eFalse; constData.cameraMotionIncluded = sl::Boolean::eTrue; constData.motionVectors3D = sl::Boolean::eFalse; - constData.motionVectorsInvalidValue = 0.0f; + // constData.motionVectorsInvalidValue = 0.0f; constData.orthographicProjection = sl::Boolean::eFalse; constData.motionVectorsDilated = IsLowResMV() ? sl::Boolean::eFalse : sl::Boolean::eTrue; constData.motionVectorsJittered = IsJitteredMVs() ? sl::Boolean::eTrue : sl::Boolean::eFalse; diff --git a/OptiScaler/hooks/LibraryLoad_Hooks.cpp b/OptiScaler/hooks/LibraryLoad_Hooks.cpp index 2fe6407e..5a5ebf83 100644 --- a/OptiScaler/hooks/LibraryLoad_Hooks.cpp +++ b/OptiScaler/hooks/LibraryLoad_Hooks.cpp @@ -966,28 +966,31 @@ void LibraryLoadHooks::CheckModulesInMemory() } } + const auto isLocalStreamlineModule = [](HMODULE module) -> bool + { + if (module == nullptr) + return false; + + char modulePath[MAX_PATH] = {}; + if (GetModuleFileNameA(module, modulePath, sizeof(modulePath)) == 0) + return false; + + const auto path = std::filesystem::path(modulePath).lexically_normal(); + const std::filesystem::path localSlPath = + std::filesystem::path(Config::Instance()->MainDllPath.value()) / L"streamline"; + return Util::IsSubpath(path, localSlPath.lexically_normal()); + }; + + // DLSS-G if (!StreamlineHooks::isDlssgHooked() || !StreamlineHooks::isLocalDlssgHooked()) { - HMODULE slDlssg = nullptr; - slDlssg = GetDllNameWModule(&slDlssgNamesW); + HMODULE slDlssg = GetDllNameWModule(&slDlssgNamesW); if (slDlssg != nullptr && slDlssg != State::Instance().optiSlDLSSG) { - // Make sure this is not a local/opti's sl.dlss_g + const bool localDlssg = isLocalStreamlineModule(slDlssg); - char callerPath[MAX_PATH] = { 0 }; - GetModuleFileNameA(slDlssg, callerPath, sizeof(callerPath)); - - auto path = std::filesystem::path(callerPath).lexically_normal(); - std::filesystem::path localSlPath(Config::Instance()->MainDllPath.value()); - localSlPath = localSlPath / L"streamline"; - auto normalizedLocalSlPath = localSlPath.lexically_normal(); - - const bool pathInsideLocalSlPath = Util::IsSubpath(path, normalizedLocalSlPath); - - const bool localDlssg = pathInsideLocalSlPath && State::Instance().activeFgOutput == FGOutput::DLSSG; - - if (localDlssg) + if (localDlssg && State::Instance().activeFgOutput == FGOutput::DLSSG) { if (!StreamlineHooks::isLocalDlssgHooked()) { @@ -995,7 +998,7 @@ void LibraryLoadHooks::CheckModulesInMemory() StreamlineHooks::hookLocalDlssg(slDlssg); } } - else if (!StreamlineHooks::isDlssgHooked()) + else if (!localDlssg && !StreamlineHooks::isDlssgHooked()) { LOG_DEBUG("sl.dlss_g.dll already in memory"); StreamlineHooks::hookDlssg(slDlssg); @@ -1003,25 +1006,45 @@ void LibraryLoadHooks::CheckModulesInMemory() } } + // Reflex if (!StreamlineHooks::isReflexHooked()) { - HMODULE slReflex = nullptr; - slReflex = GetDllNameWModule(&slReflexNamesW); + HMODULE slReflex = GetDllNameWModule(&slReflexNamesW); + if (slReflex != nullptr && slReflex != State::Instance().optiSlReflex) { - LOG_DEBUG("sl.reflex.dll already in memory"); - StreamlineHooks::hookReflex(slReflex); + const bool localReflex = isLocalStreamlineModule(slReflex); + + if (!localReflex || State::Instance().activeFgOutput != FGOutput::DLSSG) + { + if (localReflex) + LOG_DEBUG("local sl.reflex.dll already in memory"); + else + LOG_DEBUG("sl.reflex.dll already in memory"); + + StreamlineHooks::hookReflex(slReflex); + } } } + // PCL if (!StreamlineHooks::isPclHooked()) { - HMODULE slPcl = nullptr; - slPcl = GetDllNameWModule(&slPclNamesW); + HMODULE slPcl = GetDllNameWModule(&slPclNamesW); + if (slPcl != nullptr && slPcl != State::Instance().optiSlPCL) { - LOG_DEBUG("sl.pcl.dll already in memory"); - StreamlineHooks::hookPcl(slPcl); + const bool localPcl = isLocalStreamlineModule(slPcl); + + if (!localPcl || State::Instance().activeFgOutput != FGOutput::DLSSG) + { + if (localPcl) + LOG_DEBUG("local sl.pcl.dll already in memory"); + else + LOG_DEBUG("sl.pcl.dll already in memory"); + + StreamlineHooks::hookPcl(slPcl); + } } }