From b6e1ea58e0f7fca80ec008ec130ddd2ce84bac84 Mon Sep 17 00:00:00 2001 From: cdozdil Date: Mon, 13 Oct 2025 15:21:02 +0300 Subject: [PATCH] Improved XeFG Hudless state schanges --- OptiScaler/framegen/IFGFeature.cpp | 9 ++++- OptiScaler/framegen/IFGFeature.h | 2 +- OptiScaler/framegen/xefg/XeFG_Dx12.cpp | 46 ++++++++++++++++++++------ OptiScaler/framegen/xefg/XeFG_Dx12.h | 1 + 4 files changed, 45 insertions(+), 13 deletions(-) diff --git a/OptiScaler/framegen/IFGFeature.cpp b/OptiScaler/framegen/IFGFeature.cpp index 8fdf4c81..fbfe6a50 100644 --- a/OptiScaler/framegen/IFGFeature.cpp +++ b/OptiScaler/framegen/IFGFeature.cpp @@ -68,7 +68,14 @@ bool IFGFeature::IsUsingUIAny() return false; } bool IFGFeature::IsUsingDistortionField() { return !_noDistortionField[GetIndex()]; } -bool IFGFeature::IsUsingHudless() { return !_noHudless[GetIndex()]; } +bool IFGFeature::IsUsingHudless(int index) +{ + if (index < 0) + index = GetIndex(); + + return !_noHudless[index]; +} + bool IFGFeature::IsUsingHudlessAny() { for (const auto& value : _noHudless) diff --git a/OptiScaler/framegen/IFGFeature.h b/OptiScaler/framegen/IFGFeature.h index fa703bfd..9f6b400b 100644 --- a/OptiScaler/framegen/IFGFeature.h +++ b/OptiScaler/framegen/IFGFeature.h @@ -111,7 +111,7 @@ class IFGFeature bool IsUsingUI(); bool IsUsingUIAny(); // Same as IsUsingUI but checks if at least once buffer has UI bool IsUsingDistortionField(); - bool IsUsingHudless(); + bool IsUsingHudless(int index = -1); bool IsUsingHudlessAny(); void SetExecuted(int index = -1); diff --git a/OptiScaler/framegen/xefg/XeFG_Dx12.cpp b/OptiScaler/framegen/xefg/XeFG_Dx12.cpp index dc071e60..7e8f1aa9 100644 --- a/OptiScaler/framegen/xefg/XeFG_Dx12.cpp +++ b/OptiScaler/framegen/xefg/XeFG_Dx12.cpp @@ -471,6 +471,27 @@ bool XeFG_Dx12::Dispatch() LOG_DEBUG("_frameCount: {}, _willDispatchFrame: {}, fIndex: {}", _frameCount, _willDispatchFrame, fIndex); + if (!_haveHudless.has_value()) + { + _haveHudless = IsUsingHudless(fIndex); + } + else + { + auto usingHudless = IsUsingHudless(fIndex); + if (_haveHudless.value() != usingHudless) + { + LOG_INFO("Hudless state changed {} -> {}, skipping rendering for 10 frames", usingHudless, + _haveHudless.value()); + + _haveHudless = usingHudless; + State::Instance().FGchanged = true; + UpdateTarget(); + Deactivate(); + + return true; + } + } + if (!_resourceReady[fIndex].contains(FG_ResourceType::Depth) || !_resourceReady[fIndex].at(FG_ResourceType::Depth) || !_resourceReady[fIndex].contains(FG_ResourceType::Velocity) || @@ -892,20 +913,23 @@ void XeFG_Dx12::SetResource(Dx12Resource* inputResource) else if (type == FG_ResourceType::Distortion) _noDistortionField[fIndex] = false; else if (type == FG_ResourceType::HudlessColor) - { _noHudless[fIndex] = false; - // HACK: Prevent FG dispatch from being called for a few frames - // Seems like XeFG doesn't like having hudless suddenly started to be tagged - // and then be required to use it right away - if (lastHudlessFrameId == UINT64_MAX || lastHudlessFrameId + 2 < _frameCount) - { - if (XeFGProxy::SetEnabled()(_swapChainContext, false) == XEFG_SWAPCHAIN_RESULT_SUCCESS) - _reEnableTargetFrame = _frameCount + 5; - } + // else if (type == FG_ResourceType::HudlessColor) + //{ + // _noHudless[fIndex] = false; - lastHudlessFrameId = _frameCount; - } + // // HACK: Prevent FG dispatch from being called for a few frames + // // Seems like XeFG doesn't like having hudless suddenly started to be tagged + // // and then be required to use it right away + // if (lastHudlessFrameId == UINT64_MAX || lastHudlessFrameId + 2 < _frameCount) + // { + // if (XeFGProxy::SetEnabled()(_swapChainContext, false) == XEFG_SWAPCHAIN_RESULT_SUCCESS) + // _reEnableTargetFrame = _frameCount + 5; + // } + + // lastHudlessFrameId = _frameCount; + //} fResource->validity = (fResource->validity != FG_ResourceValidity::ValidNow || willFlip) ? FG_ResourceValidity::UntilPresent diff --git a/OptiScaler/framegen/xefg/XeFG_Dx12.h b/OptiScaler/framegen/xefg/XeFG_Dx12.h index dd7e8958..81d09caf 100644 --- a/OptiScaler/framegen/xefg/XeFG_Dx12.h +++ b/OptiScaler/framegen/xefg/XeFG_Dx12.h @@ -21,6 +21,7 @@ class XeFG_Dx12 : public virtual IFGFeature_Dx12 uint32_t _height = 0; bool _infiniteDepth = false; UINT64 _reEnableTargetFrame = 0; + std::optional _haveHudless = std::nullopt; static void xefgLogCallback(const char* message, xefg_swapchain_logging_level_t level, void* userData);