diff --git a/OptiScaler/framegen/ffx/FSRFG_Dx12.cpp b/OptiScaler/framegen/ffx/FSRFG_Dx12.cpp index 94622f35..508c9d1a 100644 --- a/OptiScaler/framegen/ffx/FSRFG_Dx12.cpp +++ b/OptiScaler/framegen/ffx/FSRFG_Dx12.cpp @@ -1239,6 +1239,22 @@ void FSRFG_Dx12::Deactivate() } } +template void CheckAndUpdateFlag(auto currentFlags, std::string_view flagName) +{ + static std::optional lastState; + bool currentState = static_cast(currentFlags & Flag); + + if (lastState.has_value() && *lastState != currentState) + { + LOG_DEBUG("{} changed: {}", flagName, currentState); + + State::Instance().fgChanged = true; + State::Instance().scChanged = true; + } + + lastState = currentState; +} + void FSRFG_Dx12::EvaluateState(ID3D12Device* device, FG_Constants& fgConstants) { LOG_FUNC(); @@ -1260,16 +1276,12 @@ void FSRFG_Dx12::EvaluateState(ID3D12Device* device, FG_Constants& fgConstants) return; } - static bool lastInfiniteDepth = false; - bool currentInfiniteDepth = static_cast(fgConstants.flags & FG_Flags::InfiniteDepth); - if (lastInfiniteDepth != currentInfiniteDepth) - { - lastInfiniteDepth = currentInfiniteDepth; - LOG_DEBUG("Infinite Depth changed: {}", currentInfiniteDepth); - - State::Instance().fgChanged = true; - State::Instance().scChanged = true; - } + // DLSSG can update flags in eval, FSR FG requires context recreation for this + CheckAndUpdateFlag(fgConstants.flags, "HDR"); + CheckAndUpdateFlag(fgConstants.flags, "Infinite Depth"); + CheckAndUpdateFlag(fgConstants.flags, "Inverted Depth"); + CheckAndUpdateFlag(fgConstants.flags, "Jittered MVs"); + CheckAndUpdateFlag(fgConstants.flags, "Display Resolution MVs"); if (_maxRenderWidth != 0 && _maxRenderHeight != 0 && IsActive() && !IsPaused() && (fgConstants.displayWidth > _maxRenderWidth || fgConstants.displayHeight > _maxRenderHeight))