From e365ecf35c3669d3c73d82b4a3fdcd583e3effc3 Mon Sep 17 00:00:00 2001 From: FakeMichau <49685661+FakeMichau@users.noreply.github.com> Date: Sat, 4 Apr 2026 22:21:09 +0200 Subject: [PATCH] Resolve a freeze when trying to change Vsync with XeFG active --- OptiScaler/State.h | 2 ++ OptiScaler/framegen/xefg/XeFG_Dx12.cpp | 18 ++++++++++++------ OptiScaler/menu/menu_common.cpp | 4 +--- 3 files changed, 15 insertions(+), 9 deletions(-) diff --git a/OptiScaler/State.h b/OptiScaler/State.h index ec0704e2..b417d21b 100644 --- a/OptiScaler/State.h +++ b/OptiScaler/State.h @@ -183,6 +183,8 @@ class State float lastMipBiasMax = -100.0f; int xefgMaxInterpolationCount = 1; + bool WAR_xefgRequestFGToggle = false; + int dlssgMaxInterpolationCount = 1; bool dlssgDMFGSupported = false; sl::DLSSGMode dlssgLastSetMode = sl::DLSSGMode::eOff; diff --git a/OptiScaler/framegen/xefg/XeFG_Dx12.cpp b/OptiScaler/framegen/xefg/XeFG_Dx12.cpp index 4e083fa5..2a970803 100644 --- a/OptiScaler/framegen/xefg/XeFG_Dx12.cpp +++ b/OptiScaler/framegen/xefg/XeFG_Dx12.cpp @@ -725,9 +725,7 @@ bool XeFG_Dx12::Dispatch() { // To prevent XeLL issues LOG_DEBUG("UI Composition state changed {}, skipping rendering for 10 frames", _uiComposition); - state.FGchanged = true; - UpdateTarget(); - Deactivate(); + state.WAR_xefgRequestFGToggle = true; _uiComposition = Config::Instance()->FGXeFGUIComposition.value_or_default(); @@ -756,9 +754,7 @@ bool XeFG_Dx12::Dispatch() LOG_INFO("Interpolation count changed {} -> {}", _framesToInterpolate, Config::Instance()->FGXeFGInterpolationCount.value_or_default()); - state.FGchanged = true; - UpdateTarget(); - Deactivate(); + state.WAR_xefgRequestFGToggle = true; ScopedSkipSpoofing skipSpoofing {}; @@ -775,6 +771,16 @@ bool XeFG_Dx12::Dispatch() } } + // Workaround for wrong frame limit + if (state.WAR_xefgRequestFGToggle) + { + state.WAR_xefgRequestFGToggle = false; + + state.FGchanged = true; + UpdateTarget(); + Deactivate(); + } + if (!_haveHudless.has_value()) { _haveHudless = IsUsingHudless(fIndex); diff --git a/OptiScaler/menu/menu_common.cpp b/OptiScaler/menu/menu_common.cpp index 213a61b5..5521a262 100644 --- a/OptiScaler/menu/menu_common.cpp +++ b/OptiScaler/menu/menu_common.cpp @@ -5436,9 +5436,7 @@ bool MenuCommon::RenderMenu() { // To prevent XeLL issues LOG_DEBUG("V-Sync change detected, forcing XeFG reset"); - state.FGchanged = true; - state.currentFG->UpdateTarget(); - state.currentFG->Deactivate(); + state.WAR_xefgRequestFGToggle = true; } }